找回密码
 立即注册

QQ登录

只需一步,快速开始

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

用24C02芯片实现单片机开机次数记忆 源程序

[复制链接]
跳转到指定楼层
楼主
ID:190326 发表于 2017-4-17 09:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. //开机次数记忆
  2. #include<reg52.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. bit  write=0;           //写24C02的标志;
  6. sbit sda=P2^0;                        
  7. sbit scl=P2^1;
  8. sbit dula=P2^6;
  9. sbit wela=P2^7;
  10. sbit RST=P2^5;   //时钟
  11. sbit CS_DA =P2^4 ;  //HJ-1G DAC
  12. sbit JD=P0^6;
  13. sbit FM=P2^3;


  14. uchar sec,tcnt;
  15. uchar code table[]={
  16. 0x3f,0x06,0x5b,0x4f,
  17. 0x66,0x6d,0x7d,0x07,
  18. 0x7f,0x6f,0x77,0x7c,
  19. 0x39,0x5e,0x79,0x71};
  20. void ioin()  //IO口继电器、数码管锁存函数
  21.    {         
  22.           wela=1;
  23.      P0 = 1;  
  24.           JD = 0;   
  25.      wela=0;
  26.           dula=1;
  27.           P0=0;
  28.           dula=0;
  29.     }
  30. void delay()
  31. { ;; }
  32. void delay1ms(uint z)
  33. {
  34.         uint x,y;
  35.         for(x=z;x>0;x--)
  36.                 for(y=110;y>0;y--);
  37. }
  38. void start()  //开始信号
  39. {        
  40.         sda=1;
  41.         delay();
  42.         scl=1;
  43.         delay();
  44.         sda=0;
  45.         delay();
  46. }
  47. void stop()   //停止
  48. {
  49.         sda=0;
  50.         delay();
  51.         scl=1;
  52.         delay();
  53.         sda=1;
  54.         delay();
  55. }
  56. void respons()  //应答
  57. {
  58.         uchar i;
  59.         scl=1;
  60.         delay();
  61.         while((sda==1)&&(i<250))i++;
  62.         scl=0;
  63.         delay();
  64. }
  65. void init()
  66. {
  67.    RST=0; //总线时钟低电评
  68.    CS_DA =0 ;
  69.         sda=1;
  70.         delay();
  71.         scl=1;
  72.         delay();
  73. }
  74. void write_byte(uchar date)
  75. {
  76.         uchar i,temp;
  77.         temp=date;
  78.         for(i=0;i<8;i++)
  79.         {
  80.                 temp=temp<<1;
  81.                 scl=0;
  82.             delay();
  83.                 sda=CY;
  84.                 delay();
  85.                 scl=1;
  86.                 delay();
  87.         }
  88.         scl=0;
  89.         delay();
  90.         sda=1;
  91.         delay();
  92. }
  93. uchar read_byte()
  94. {
  95.         uchar i,k;
  96.         scl=0;
  97.         delay();
  98.         sda=1;
  99.         delay();
  100.         for(i=0;i<8;i++)
  101.         {
  102.                 scl=1;
  103.                 delay();        
  104.                 k=(k<<1)|sda;
  105.                 scl=0;
  106.                 delay();        
  107.         }
  108.         return k;
  109. }
  110. void write_add(uchar address,uchar date)
  111. {
  112.         start();
  113.         write_byte(0xa0);
  114.         respons();
  115.         write_byte(address);
  116.         respons();
  117.         write_byte(date);
  118.         respons();
  119.         stop();
  120. }
  121. uchar read_add(uchar address)
  122. {
  123.         uchar date;
  124.         start();
  125.         write_byte(0xa0);
  126.         respons();
  127.         write_byte(address);
  128.         respons();
  129.         start();
  130.         write_byte(0xa1);
  131.         respons();
  132.         date=read_byte();
  133.         stop();
  134.         return date;
  135. }
  136. void display(uchar bai_c,uchar sh_c)        //显示程序
  137. {
  138.    dula=0;
  139.    P0=table[bai_c];                //显示第一位
  140.    dula=1;
  141.    dula=0;
  142.    wela=0;
  143.    P0=0x7e;
  144.    wela=1;
  145.    wela=0;
  146.    delay1ms(5);
  147.    dula=0;
  148.    P0=table[sh_c];                //显示第二位
  149.    dula=1;
  150.    dula=0;
  151.    wela=0;
  152.    P0=0x7d;
  153.    wela=1;
  154.    wela=0;
  155.    delay1ms(5);
  156. }
  157. void main()
  158. {
  159.    ioin();
  160.         init();
  161.         sec=read_add(2);    //读出保存的数据赋于sec
  162.         if(sec>100)        //防止首次读取出错误数据
  163.                 sec=0;
  164.         TMOD=0x01;                          //定时器工作在方式1
  165.         ET0=1;
  166.         EA=1;
  167.         TH0=(65536-50000)/256; //对TH0 TL0赋值
  168.         TL0=(65536-50000)%256; //使定时器0.05秒中断一次
  169.         TR0=1;                 //开始计时
  170.         while(1)
  171.         {
  172.                 display(sec/10,sec%10);
  173.                 if(write==1)                       //判断计时器是否计时一秒
  174.                 {
  175.                         write=0;              //清零
  176.                         write_add(2,sec);            //在24c02的地址2中写入数据sec
  177.                 }
  178.         }
  179. }
  180. void t0() interrupt 1 //定时中断服务函数
  181. {
  182.         TH0=(65536-50000)/256; //对TH0 TL0赋值
  183.         TL0=(65536-50000)%256; //重装计数初值
  184.         tcnt++;        //每过50ms tcnt加一
  185.         if(tcnt==20)  //计满20次(1秒)时
  186.         {
  187.             tcnt=0;   //重新再计
  188.             sec++;
  189.             write=1;  //1秒写一次24C02
  190.             if(sec==100) //定时100秒,再从零开始计时
  191.                     sec=0;
  192.         }
  193. }



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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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