找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2941|回复: 1
收起左侧

C51单片机24c02储存电压值LCD显示 Proteus仿真程序

[复制链接]
ID:389413 发表于 2020-4-17 16:22 | 显示全部楼层 |阅读模式
这是C51单片机设置外部储存24c02的程序,
由LCD1602显示被储存的电压
51hei.png
单片机源程序如下:

  1. #include<reg51.h>


  2. #include <intrins.h>
  3. #include<1602.h>
  4. #define uchar unsigned char
  5. #define Address_24C02 0xA0
  6. #define uint unsigned int
  7. #define ulong unsigned long
  8. #define _NOP_() _nop_();_nop_();_nop_();_nop_();_nop_()/*短暂延时 4.7us*/
  9. sbit IIc_Sad = P2^6;
  10. sbit IIc_Scl = P2^7;



  11. static void delay1(uint a)
  12. {
  13. uint x;
  14. for(;a>0;a--)
  15. for(x=114*10;x>0;x--);
  16. }
  17. /*以下五个函数是IIc 时序函数*/

  18. /* 启动I2C 总线*/
  19. void IIc_start()
  20. {
  21. IIc_Sad = 1;
  22. IIc_Scl = 1;
  23. _NOP_();
  24. IIc_Sad = 0;
  25. _NOP_();
  26. IIc_Scl = 0;
  27. }
  28. /*停止I2C 总线*/
  29. void IIc_stop()
  30. {
  31. IIc_Sad = 0;
  32. _NOP_();
  33. IIc_Scl = 1;
  34. _NOP_();
  35. IIc_Sad = 1; //总线置于空闲状态
  36. }
  37. /*IIC 初始化子程序*/
  38. void IIc_init()
  39. {
  40. IIc_stop(); //结束之前IIC 的操作
  41. IIc_Scl = 1; //总线置于空闲状态
  42. IIc_Sad = 1;
  43. }
  44. /*IIC 写一个字节 返回应答信号 返回1 设备正常*/
  45. bit IIc_write_byte(uchar date)
  46. {
  47. uchar i;
  48. bit ack;
  49. for(i=8;i>0;i--)
  50. {
  51. date <<= 1;
  52. IIc_Scl = 0;
  53. IIc_Sad = CY;
  54. _NOP_();
  55. IIc_Scl = 1;
  56. _NOP_();
  57. }
  58. IIc_Scl = 0;
  59. _NOP_();
  60. IIc_Sad = 1;/*8 位发送完后释放数据线,准备接收应答位*/
  61. _NOP_();
  62. IIc_Scl = 1;
  63. if(IIc_Sad==0)//从机设备应答 ack=1
  64. ack = 1;
  65. else
  66. ack = 0;
  67. IIc_Scl = 0;
  68. _NOP_();
  69. return(ack);
  70. }
  71. /*IIC 读一个字节 主机应答信号Master_ack 为1 是应答 0 时非应答*/
  72. uchar IIc_read_byte(bit Master_ack)
  73. {
  74. uchar i,vaule;
  75. IIc_Sad=1;
  76. for(i = 8;i > 0;i--)
  77. {
  78. vaule <<= 1;
  79. IIc_Scl = 1;
  80. _NOP_();
  81. if(IIc_Sad)
  82. vaule++;
  83. IIc_Scl = 0;
  84. _NOP_();
  85. }
  86. IIc_Sad = !Master_ack;//主机应答信号
  87. _NOP_();
  88. IIc_Scl = 1;
  89. _NOP_();
  90. IIc_Scl = 0;
  91. _NOP_();
  92. return vaule;
  93. }
  94. /*以下是24C02 的读写函数*/
  95. /*在24c02 的add 地址中写入一个数据date;返回1 设备正常*/
  96. bit Write_byte(uchar add,uchar date)
  97. {
  98. bit val;
  99. uchar i=0;
  100. IIc_init();
  101. IIc_start();
  102. val = IIc_write_byte(Address_24C02);//写器件地址
  103. while(val==0)
  104. {
  105. if(i++==10) //等待超时(10ms) 可能器件不存在
  106. return(0);
  107. delay1(1); //等待一会
  108. IIc_start(); //重新发送
  109. val = IIc_write_byte(Address_24C02);//写器件地址
  110. }
  111. IIc_write_byte(add);//写存储的地址
  112. IIc_write_byte(date);//写数据
  113. IIc_stop();
  114. return(1);
  115. }

  116. bit Write_more_byte(uchar add,uchar number,uchar *p)
  117. {
  118. bit val;
  119. uchar i=0;
  120. IIc_init();
  121. IIc_start();
  122. val = IIc_write_byte(Address_24C02); //写器件地址
  123. while(val==0)
  124. {
  125. if(i++==10) //等待超时(10ms)
  126. return(0);
  127. delay1(1); //等待一会
  128. IIc_start(); //重新发送
  129. val = IIc_write_byte(Address_24C02);//写器件地址
  130. }
  131. IIc_write_byte(add);//写存储的地址
  132. for(i=0;number>0;number--)
  133. {
  134. IIc_write_byte(*p++);//写存储的数据
  135. }
  136. IIc_stop();
  137. return(1);
  138. }

  139. uchar read_byte(uchar add)
  140. {
  141. uchar val=0;
  142. bit R_flag=0;
  143. IIc_init();
  144. IIc_start();
  145. R_flag=IIc_write_byte(Address_24C02);//写器件地址
  146. while(R_flag==0) //器件没有应答 可能是内部编程/擦除周期
  147. {
  148. delay1(1); //等待一会
  149. IIc_start(); //重新发送
  150. R_flag=IIc_write_byte(Address_24C02);//写器件地址
  151. }
  152. IIc_write_byte(add);//写存储的地址
  153. IIc_start();
  154. IIc_write_byte(Address_24C02+1);//写器件地址(读)
  155. val = IIc_read_byte(0);
  156. IIc_stop();
  157. return (val);
  158. }
  159. /*在24c02 的add 地址中连续读出一串数据*p 可以一次性读出存储器中所有的数据*/
  160. void read_more_byte(uchar add,uchar number,uchar *p)
  161. {
  162. bit val=0;
  163. IIc_init();
  164. IIc_start();
  165. val = IIc_write_byte(Address_24C02); //写器件地址
  166. while(val==0) //器件没有应答 可能是内部编程/擦除周期
  167. {
  168. delay1(1); //等待一会
  169. IIc_start(); //重新发送
  170. val=IIc_write_byte(Address_24C02);//写器件地址
  171. }
  172. IIc_write_byte(add);//写存储的地址
  173. IIc_start();
  174. IIc_write_byte(Address_24C02+1);//写器件地址(读)
  175. for(;number>1;number--)
  176. {
  177. *p++=IIc_read_byte(1);
  178. }
  179. *p = IIc_read_byte(0); //读最后一个数据主机不应答
  180. IIc_stop();
  181. }

  182. void main()
  183. {
  184. int i;
  185. //uchar xdata a[100];
  186. uchar temp=0;
  187. lcd_init();
  188. while(1)
  189. {

  190. //for(i=0;i<100;i++)
  191. //{
  192. //a[i]=i;
  193. //}
  194. Write_byte(0x05,8);
  195. //Write_more_byte(0,8,a);

  196. temp=read_byte(5);

  197. lcd_pos(0x0a);// 设置显示位置
  198. lcd_wdat(0x30+temp);

  199. Write_byte(0xfa,9);
  200. //Write_more_byte(0,8,a);

  201. temp=read_byte(0xfa);

  202. lcd_pos(0x48);// 设置显示位置
  203. lcd_wdat(0x30+temp);

  204. }
  205. }
复制代码

所有资料51hei提供下载:
24c02.rar (2.61 MB, 下载次数: 40)
回复

使用道具 举报

ID:769395 发表于 2020-6-9 14:13 | 显示全部楼层
请问你有没有仿真成功
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表