找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6145|回复: 0
打印 上一主题 下一主题
收起左侧

24C08存储器试验程序

[复制链接]
跳转到指定楼层
楼主
ID:71259 发表于 2014-12-30 01:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<reg52.h>   //  包含51单片机寄存器定义的头文件
  2. #include<intrins.h>    //包含_nop_()函数定义的头文件
  3. sbit SCL=P3^4;    //将串行时钟总线SCL位定义在为P3.4引脚
  4. sbit SDA=P3^5;    //将串行数据总线SDA位定义在为P3.5引脚
  5. sbit P26=P2^6;   //十位选通定义
  6. sbit P27=P2^7;  //个位选通定义
  7. sbit K5=P1^4;   //清0按键
  8. unsigned char sec=0; //定义计数值,每过1秒,sec加1
  9. unsigned char count=0; //定时中断次数
  10. bit write=0;   //写24C08的标志;
  11. unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//定义共阳数码管显示字型码

  12. void delay1ms(unsigned int n)     //1ms延时
  13. {
  14. unsigned char i;
  15. while(n--)
  16.   for(i=0;i<115;i++);
  17. }

  18. void Start()  //起始信号
  19. {
  20. SDA=1;     //SDA初始化为高电平“1”
  21. SCL=1;   //开始数据传送时,要求SCL为高电平“1”
  22. _nop_();
  23. _nop_();
  24. _nop_();
  25. _nop_();
  26. _nop_();
  27. SDA=0;    //SDA的下降沿被认为是开始信号
  28. _nop_();
  29. _nop_();
  30. _nop_();
  31. _nop_();
  32. _nop_();
  33. SCL=0;   //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)
  34. }

  35. void Stop()     //终止信号
  36. {
  37. SDA=0;      //SDA初始化为低电平“0”
  38. SCL=1;     //!!!!注意,SDA和SCL的顺序不能颠倒,否则错误,切记
  39. _nop_();   //结束数据传送时,要求SCL为高电平“1”
  40. _nop_();
  41. _nop_();
  42. _nop_();
  43. _nop_();
  44. SDA=1;    //SDA的上升沿被认为是结束信号
  45. _nop_();
  46. _nop_();
  47. _nop_();
  48. _nop_();
  49. _nop_();
  50. SCL=0;
  51. SDA=0;
  52. }


  53. bit Ask()   //应答信号
  54. {
  55. bit res;
  56. SDA=1;       // 发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线,
  57.                       //以让SDA线转由接收设备(AT24Cxx)控制
  58. _nop_();        //等待一个机器周期
  59. _nop_();        //等待一个机器周期

  60. SCL=1;      //根据上述规定,SCL应为高电平
  61. _nop_();
  62. _nop_();
  63. _nop_();
  64. _nop_();
  65. _nop_();
  66. res=SDA;   //接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节
  67.                 //若送高电平,表示没有接收到,传送异常 结束发送
  68. SCL=0;      //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递
  69. return res;
  70. }

  71. unsigned char ReadData()  // 从24C08移入数据到MCU

  72. {
  73. unsigned char i;
  74. unsigned char x;   //储存从AT24Cxx中读出的数据
  75. for(i = 0; i < 8; i++)
  76. {
  77.   SCL = 1;                //SCL置为高电平
  78.   x<<=1;                  //将x中的各二进位向左移一位
  79.   x|=(unsigned char)SDA;  //将SDA上的数据通过按位“或“运算存入x中
  80.   SCL = 0;                        //在SCL的下降沿读出数据
  81. }
  82. return(x);                //将读取的数据返回
  83. }

  84. void WriteCurrent(unsigned char y) //向当前地址写入数据
  85. {
  86. unsigned char i;
  87. for(i = 0; i < 8; i++)  // 循环移入8个位
  88. {
  89.      SDA = (bit)(y&0x80);   //通过按位“与”运算将最高位数据送到S
  90.                                     //因为传送时高位在前,低位在后
  91.   _nop_();            //等待一个机器周期  
  92.     SCL = 1;            //在SCL的高电平将数据写入AT24Cxx     
  93.        _nop_();            //等待一个机器周期
  94.     _nop_();             //等待一个机器周期      
  95.     SCL = 0;            //将SCL重新置为低电平,以在SCL线形成传送数据所需的8个脉冲
  96.     y<<= 1;           //将y中的各二进位向左移一位
  97.               
  98. }
  99. }

  100. void WriteSet(unsigned char add, unsigned char dat)   // 在指定地址add处写入数据WriteCurrent

  101. {
  102. Start();               //开始数据传递
  103. WriteCurrent(0xa0);  //选择要操作的24C08芯片,并告知要对其写入数据
  104.     Ask();
  105. WriteCurrent(add);       //写入指定地址
  106. Ask();
  107. WriteCurrent(dat);       //向当前地址(上面指定的地址)写入数据
  108. Ask();
  109. Stop();                //停止数据传递
  110. delay1ms(4);        //1个字节的写入周期为1ms, 最好延时1ms以上
  111. }

  112. unsigned char ReadCurrent()  //向当前地址读数据
  113. {
  114. unsigned char x;
  115. Start();               //开始数据传递
  116. WriteCurrent(0xa1);   //选择要操作的AT24Cxx芯片,并告知要读其数据
  117. Ask();
  118. x=ReadData();         //将读取的数据存入x
  119. Stop();                //停止数据传递
  120. return x;              //返回读取的数据
  121. }

  122. unsigned char ReadSet(unsigned char set_addr)  // 在指定地址读取

  123. {
  124. Start();                      //开始数据传递
  125. WriteCurrent(0xa0);       //选择要操作的AT24Cxx芯片,并告知要对其写入数据
  126. Ask();
  127. WriteCurrent(set_addr);       //写入指定地址
  128. Ask();
  129. return(ReadCurrent());        //从指定地址读出数据并返回
  130. }

  131. void LedShow()      //LED显示函数
  132. {
  133.     P0=table[sec/10];
  134. P26=0;
  135. delay1ms(2);
  136. P26=1;
  137. P0=table[sec%10];
  138. P27=0;
  139. delay1ms(2);
  140. P27=1;
  141. }



  142. void main()
  143. {
  144. TMOD=0x01; //定时器0工作在方式1
  145. ET0=1;
  146.     EA=1;
  147. TH0=(65536-50000)/256; //对TH0 TL0赋值
  148. TL0=(65536-50000)%256; //使定时器0.05秒中断一次
  149.     SDA = 1;           // SDA=1,SCL=1,使主从设备处于空闲状态
  150. SCL = 1;         
  151. sec=ReadSet(2);//读出保存的数据赋于sec
  152. TR0=1; //开始计时
  153.   while(1)
  154.   {
  155.       LedShow();
  156.    if(write==1) //判断计时器是否计时一秒      
  157.    {
  158.    write=0; //清零
  159.    WriteSet(2,sec); //在24c08的地址2中写入数据sec   
  160.    }

  161.     if(K5==0){
  162.      delay1ms(10);
  163.    if(K5==0){
  164.     sec=0;
  165.    }
  166.    }
  167.   }
  168. }

  169. void t0()  interrupt 1     //定时中断服务函数
  170. {
  171. TH0=(65536-50000)/256;
  172. TL0=(65536-50000)%256;
  173. count++;

  174. if(count==20){
  175.   count=0;
  176.   write=1;
  177.   sec++;
  178.   if(sec==100)
  179.    sec=0;

  180. }
  181. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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