找回密码
 立即注册

QQ登录

只需一步,快速开始

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

AT24C02时间记忆

[复制链接]
跳转到指定楼层
楼主
ID:3721 发表于 2015-1-5 21:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. //****************************************************************
  2. /*该程序的功能:利用定时器产生一个0~99秒变化的秒表,并在数码管上显
  3.                 示,每一秒中将该变化写入AT24c02内部。当关闭电源,
  4.                 且再次打开电源时单片机先从AT24c02中将原来写入的数据
  5.                 读出来,接着显示在数码管上
  6.   应用到的知识:定时器中断、艾方西(IIC)数据传输协议。
  7.   涉及芯片资料:AT24C02,74HC595
  8. */
  9. //****************************************************************
  10. #include<reg52.h>
  11. #define uint unsigned int
  12. #define uchar unsigned char
  13. uchar code num[]={0x80,0xed,0x42,0x48,0x2c,0x18,0x10,0xcc,0x00,0x08};//字段的显示码
  14. uint p=0,a,b;
  15. //*****AT24c02管脚的定义*********
  16. sbit scl=P0^3;
  17. sbit sda=P0^4;
  18. //*****595数码管管脚定义*********
  19. sbit rck=P2^0;
  20. sbit sck=P2^1;
  21. sbit si=P2^2;
  22. //********函数的声明**********
  23. void delayus();
  24. void start();
  25. void stop();
  26. void ack();
  27. void noack();
  28. void write_byte(uchar date);
  29. uchar read_byte();
  30. void xie(uchar add,uchar date);
  31. uchar du(uchar add);
  32. void init_24c02(); //24c02函数初始化
  33. void init_zhongduan(); //中断函数初始化
  34. void write_595(uchar date);//595写字节函数

  35. //*******************
  36. void delayus()
  37. {
  38.    ; ; ;
  39. }
  40. /*void delayms(uint t)
  41. {
  42.    uint i,j;
  43.     for(i=t;i>0;i--)
  44.      for(j=110;j>0;j--);
  45. } */
  46. void start()
  47. {
  48.    sda=1;
  49.    delayus();
  50.    scl=1;
  51.    delayus();
  52.    sda=0;
  53.    delayus();
  54. }
  55. void stop()
  56. {
  57.    sda=0;
  58.    delayus();
  59.    scl=1;
  60.    delayus();
  61.    sda=1;
  62.    delayus();
  63. }
  64. void ack()
  65. {
  66.    uint i=0;
  67.    scl=1;
  68.    delayus();
  69.    if((sda==1)&&(i<250))i++;
  70.    scl=0;
  71.    delayus();
  72. }
  73. void noack()
  74. {
  75.     sda=1;
  76.     delayus();
  77.     scl=0;
  78.     delayus();
  79.     scl=1;
  80.     delayus();
  81.     scl=0;
  82.     delayus();
  83. }
  84. void write_byte(uchar date)
  85. {
  86.    uint i;
  87.    scl=0;
  88.    for(i=0;i<8;i++)
  89.     {
  90.         if(date&0x80)
  91.       {
  92.             sda=1;
  93.       }
  94.          else
  95.       {
  96.            sda=0;
  97.       }
  98.          scl=1;
  99.          date=date<<1;
  100.          delayus();
  101.          scl=0;
  102.          delayus();
  103.     }
  104.     sda=1;
  105.     delayus();
  106. }
  107. uchar read_byte()
  108. {
  109.    uint i;
  110.    uchar k=0x00;
  111.    sda=1;
  112.    delayus();
  113.    scl=0;
  114.    delayus();
  115.     for(i=0;i<8;i++)
  116.      {
  117.         scl=1;
  118.         delayus();
  119.         k=k<<1;
  120.         if(sda)
  121.           {
  122.            k++;
  123.           }
  124.         scl=0;
  125.         delayus();
  126.          
  127.      }
  128.     return k;
  129. }
  130. void xie(uchar add,uchar date)
  131. {
  132.     start();
  133.     write_byte(0xa0);
  134.     ack();
  135.     write_byte(add);
  136.     ack();
  137.     write_byte(date);
  138.     ack();
  139.     stop();
  140. }
  141. uchar du(uchar add)
  142. {
  143.    uchar k;
  144.    start();
  145.    write_byte(0xa0);
  146.    ack();
  147.    write_byte(add);
  148.    ack();
  149.   
  150.    start();
  151.    write_byte(0xa1);
  152.    ack();
  153.    k=read_byte();
  154.    noack();
  155.    stop();
  156.    return k;
  157. }
  158. void init_24c02()
  159. {
  160.    sda=1;
  161.    scl=1;
  162. }
  163. void init_zhongduan()
  164. {
  165.    EA=1;//开启总中断
  166.    ET1=1;//开启定时器1中断
  167.    TMOD=0X10;//设置定时器1为工作方式
  168.    TH1=(65536-50000)/256;//装初值12兆晶振定时50毫秒数位50000
  169.    TL1=(65536-50000)%256;
  170.    TR1=1; //启动定时器1
  171. }

  172. void main()
  173. {
  174.    init_zhongduan();
  175.    a=du(2);//读回断电时的数据
  176.    b=du(1);
  177.    write_595(num[b]);//数码管初始化为断电前得数值
  178.    write_595(num[a]);
  179.    while(1);
  180. }
  181. void cut() interrupt 3
  182. {
  183.    TH1=(65536-50000)/256; //重装初值
  184.    TL1=(65536-50000)%256;
  185.    p++; //p每加一次就是50毫秒
  186.    write_595(num[b]);
  187.    write_595(num[a]);
  188.      if(p==20) //判断是否够一秒
  189.       {
  190.         p=0;//重置0
  191.         a++;
  192.          if(a==10)
  193.           {
  194.            a=0;
  195.          b++;
  196.             if(b==10)b=0;
  197.             xie(1,b);//选地址1储存b的值
  198.           }
  199.         xie(2,a);//选地址2储存a的值
  200.       }
  201.      rck=0;
  202.      rck=1;
  203. }
  204. void write_595(uchar date)
  205. {
  206.    uint i;
  207.    for(i=0;i<8;i++)
  208.     {
  209.        sck=0;
  210.        date=date>>1;//移位寄存
  211.        si=CY;
  212.        sck=1;
  213.     }
  214. }
复制代码


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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