找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2735|回复: 0
收起左侧

24C02和STC12C5A单片机I2C测试代码

[复制链接]
ID:292673 发表于 2018-11-16 11:05 | 显示全部楼层 |阅读模式
练习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 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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