找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2731|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

AT24C02時(shí)間記憶

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:3721 發(fā)表于 2015-1-5 21:17 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. //****************************************************************
  2. /*該程序的功能:利用定時(shí)器產(chǎn)生一個(gè)0~99秒變化的秒表,并在數(shù)碼管上顯
  3.                 示,每一秒中將該變化寫入AT24c02內(nèi)部。當(dāng)關(guān)閉電源,
  4.                 且再次打開電源時(shí)單片機(jī)先從AT24c02中將原來寫入的數(shù)據(jù)
  5.                 讀出來,接著顯示在數(shù)碼管上
  6.   應(yīng)用到的知識(shí):定時(shí)器中斷、艾方西(IIC)數(shù)據(jù)傳輸協(xié)議。
  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數(shù)碼管管腳定義*********
  19. sbit rck=P2^0;
  20. sbit sck=P2^1;
  21. sbit si=P2^2;
  22. //********函數(shù)的聲明**********
  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函數(shù)初始化
  33. void init_zhongduan(); //中斷函數(shù)初始化
  34. void write_595(uchar date);//595寫字節(jié)函數(shù)

  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;//開啟定時(shí)器1中斷
  167.    TMOD=0X10;//設(shè)置定時(shí)器1為工作方式
  168.    TH1=(65536-50000)/256;//裝初值12兆晶振定時(shí)50毫秒數(shù)位50000
  169.    TL1=(65536-50000)%256;
  170.    TR1=1; //啟動(dòng)定時(shí)器1
  171. }

  172. void main()
  173. {
  174.    init_zhongduan();
  175.    a=du(2);//讀回?cái)嚯姇r(shí)的數(shù)據(jù)
  176.    b=du(1);
  177.    write_595(num[b]);//數(shù)碼管初始化為斷電前得數(shù)值
  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儲(chǔ)存b的值
  198.           }
  199.         xie(2,a);//選地址2儲(chǔ)存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. }
復(fù)制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表