久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2954|回復: 0
打印 上一主題 下一主題
收起左側

24C02和STC12C5A單片機I2C測試代碼

[復制鏈接]
跳轉到指定樓層
樓主
練習STC51單片機,使用24C02完成技術,掉電保存功能數碼管顯示當前計數,斷電后再次上電可以走上次斷點出重新計數;
制作出來的實物圖如下:


單片機源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define        OP_READ        0xa1                // 器件地址以及讀取操作
  4. #define        OP_WRITE 0xa0                // 器件地址以及寫入操作
  5. #define        MAX_ADDR 0x7f                // AT24C02最大地址
  6. #define uint unsigned int
  7. #define uchar unsigned char  
  8. sbit P2_0 = P2^0;
  9. sbit P2_1 = P2^1;
  10. sbit P2_2 = P2^2;
  11. sbit P2_3 = P2^3;
  12. unsigned char code dis_code[] = {0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};        // 寫入到AT24C01的數據串
  13. sbit SDA = P2^5;
  14. sbit SCL = P2^6;
  15. sbit k1  = P3^5;   //手動清零按鍵

  16. void start();
  17. void stop();
  18. unsigned char shin();
  19. bit shout(unsigned char write_data);
  20. unsigned char read_random(unsigned char random_addr);
  21. void write_byte( unsigned char addr, unsigned char write_data);
  22. void fill_byte(unsigned char fill_data);
  23. void delayms(unsigned int ms);
  24. uint x,zz;
  25. unsigned char aa;
  26. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
  27.                         0xf8,0x80,0x90};
  28. void delay(unsigned ii)
  29. {
  30.   uint j,k;
  31.   for(j=ii;j>0;j--)
  32.     for(k=1;k>0;k--);
  33. }

  34. void display(uint x)
  35. {

  36.   
  37.    P0=table[x/1000];
  38.    P2_0 = 0;
  39.    delay(20);
  40.    P2_0 = 1;
  41.   

  42.    P0=table[(x%1000)/100];
  43.    P2_1 = 0;
  44.    delay(20);
  45.    P2_1 = 1;

  46.    P0=table[((x%1000)%100)/10];
  47.    P2_2 = 0;
  48.    delay(20);
  49.    P2_2 = 1;

  50.    P0=table[((x%1000)%100)%10];
  51.    P2_3 = 0;
  52.    delay(20);
  53.    P2_3 = 1;
  54.    
  55. }

  56. main(void)
  57. {
  58.          unsigned char p,q; // p,q為計數的形參賦值
  59.          SDA = 1;
  60.          SCL = 1;       
  61.          TMOD|=0x11;                   //設T0為方式1,GATE=1;
  62.          TL0 = 0x00;               
  63.          TH0 = 0xDC;
  64.    TR0=1; ET0=1;
  65.    EA=1;          //全局中斷開
  66.          EX0=1;         //外部中斷0開
  67.          IT0=1;
  68.         //fill_byte(0x00);                // 全部填充0x00
  69. /************************************
  70.         for(i = 1 ; i < 8; i++)                //寫入顯示代碼到AT24Cxx
  71.         {
  72.                 write_byte(i, dis_code[i]);
  73.         //        write_byte(0, 0);
  74.         }
  75. *************************************/
  76.         delayms(500);
  77.         p = read_random(0);
  78.         q=  read_random(1);
  79. //        p++;
  80. //  if(p>=255)             //手動上電計數
  81. //  q++;       
  82. //  write_byte(0, p);
  83. //  write_byte(1, q);
  84. //        delayms(1);       
  85.         while(1)
  86.         {
  87.                 zz=q*255+p ;               
  88.                 if(zz>=9999)
  89.                 zz=0;
  90.                 display(zz);
  91.                 delayms(50);
  92.                
  93.                 if(TF0==1)
  94.     { TF0=0;
  95.       TL0 = 0x00;               
  96.             TH0 = 0xDC;
  97.       aa++;                       
  98.            if(aa>=100)
  99.                           {
  100.                                 p++;
  101.                           if(p>=255)
  102.         {p=0;q++;}       
  103.                                 aa=0;
  104.                           write_byte(0, p);
  105.         write_byte(1, q);       
  106.                                 }                               
  107.     }
  108.          if(k1==0)
  109.                 fill_byte(0x00);                // 全部填充0x00                                       
  110.         }
  111. }

  112. void start()
  113. // 開始位
  114. {
  115.         SDA = 1;
  116.         SCL = 1;
  117.         _nop_();
  118.         _nop_();
  119.         SDA = 0;
  120.         _nop_();
  121.         _nop_();
  122.         _nop_();
  123.         _nop_();
  124.         SCL = 0;
  125. }

  126. void stop()
  127. // 停止位
  128. {
  129.         SDA = 0;
  130.         _nop_();
  131.         _nop_();
  132.         SCL = 1;
  133.         _nop_();
  134.         _nop_();
  135.         _nop_();
  136.         _nop_();
  137.         SDA = 1;
  138. }

  139. unsigned char shin()
  140. // 從AT24Cxx移入數據到MCU
  141. {
  142.         unsigned char i,read_data;
  143.         for(i = 0; i < 8; i++)
  144.         {
  145.                 SCL = 1;
  146.                 read_data <<= 1;
  147.                 read_data |= (unsigned char)SDA;
  148.                 SCL = 0;
  149.         }
  150.         return(read_data);
  151. }
  152. bit shout(unsigned char write_data)
  153. // 從MCU移出數據到AT24Cxx
  154. {
  155.         unsigned char i;
  156.         bit ack_bit;
  157.         for(i = 0; i < 8; i++)                // 循環移入8個位
  158.         {
  159.                 SDA = (bit)(write_data & 0x80);
  160.                 _nop_();
  161.                 SCL = 1;
  162.                 _nop_();
  163.                 _nop_();
  164.                 SCL = 0;
  165.                 write_data <<= 1;
  166.         }
  167.         SDA = 1;                        // 讀取應答
  168.         _nop_();
  169.         _nop_();
  170.         SCL = 1;
  171.         _nop_();
  172.         _nop_();
  173.         _nop_();
  174.         _nop_();
  175.         ack_bit = SDA;
  176.         SCL = 0;
  177.         return ack_bit;                        // 返回AT24Cxx應答位
  178. }

  179. void write_byte(unsigned char addr, unsigned char write_data)
  180. // 在指定地址addr處寫入數據write_data
  181. {
  182.         start();
  183.         shout(OP_WRITE);
  184.         shout(addr);
  185.         shout(write_data);
  186.         stop();
  187.         delayms(10);                // 寫入周期
  188. }

  189. void fill_byte(unsigned char fill_data)
  190. // 填充數據fill_data到EEPROM內
  191. {
  192.         unsigned char i;
  193.         for(i = 0; i < MAX_ADDR; i++)
  194.         {
  195.                 write_byte(i, fill_data);
  196.         }

  197. }

  198. unsigned char read_current()
  199. // 在當前地址讀取
  200. {
  201.         unsigned char read_data;
  202.         start();
  203.         shout(OP_READ);
  204.         read_data = shin();
  205.         stop();
  206.         return read_data;
  207. }

  208. unsigned char read_random(unsigned char random_addr)
  209. // 在指定地址讀取
  210. {
  211.         start();
  212.         shout(OP_WRITE);
  213.         shout(random_addr);
  214.         return(read_current());
  215. }

  216. void delayms(unsigned int ms)       
  217. // 延時子程序
  218. {
  219.         unsigned char i;
  220.         while(ms--)
  221.         {
  222.                 for(i = 0; i < 120; i++);
  223.         }
  224. }
復制代碼

所有資料51hei提供下載:
24C02與STC12單片機數碼管中斷記憶計數.rar (30.05 KB, 下載次數: 28)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: cao在线| 亚洲人成人一区二区在线观看 | 久久精品一区 | 草久久久 | 日韩一二三区视频 | 一级看片免费视频 | 国产视频91在线 | 国产激情网站 | 国产精品久久久久久av公交车 | 日韩欧美一区二区三区四区 | 精品视频在线播放 | 成人国产精品 | 毛片入口 | 黄色网址免费看 | 亚洲国产成人av | 久久国产传媒 | 成人九色 | 成人欧美一区二区三区黑人孕妇 | 国产成人精品一区二区三区网站观看 | 一区欧美 | 久久久免费少妇高潮毛片 | 日韩中文字幕 | 无码一区二区三区视频 | 香蕉一区 | www国产亚洲精品久久网站 | 99精品欧美一区二区三区 | 国产精品久久久久无码av | 亚洲自拍偷拍欧美 | 精品videossex高潮汇编 | 中文av字幕 | av性色全交蜜桃成熟时 | 大乳boobs巨大吃奶挤奶 | 亚洲婷婷一区 | 欧洲高清转码区一二区 | 欧美二区三区 | 欧美激情在线播放 | 亚洲不卡在线视频 | 久久久久国产精品午夜一区 | 久久久久se | 国产美女一区二区三区 | 久草视频在 |