找回密码
 立即注册

QQ登录

只需一步,快速开始

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

DS12B887时钟 89c52单片机

[复制链接]
跳转到指定楼层
楼主
多年前一个用89c52和12b887做的时钟  网上找的资料我做了一次  


单片机源程序如下:
  1. #include <REGX52.H>
  2. #include <intrins.h>
  3. #include "sys_def.h"
  4. #include "ds12b887.h"
  5. #define maohao_flash()   P0 ^= (0x01<<3)
  6. #define KEY_VAL 5
  7. unsigned char k1_flag=0,k2_flag=0,k1,k2;
  8. unsigned char code seg_table[]=
  9. {
  10.   0x88,
  11.   0xdd,
  12.   0x86,
  13.   0x85,
  14.   0xd1,
  15.   0xa1,
  16.   0xa0,
  17.   0xcd,
  18.   0x80,
  19.   0x81,
  20. };
  21. sbit KEY1=P2^5;
  22. sbit KEY2=P2^0;
  23. unsigned char seg_buff[4];
  24. unsigned char t_flag=0,t_counter=0;
  25. TIMEFORMAT sys_time;
  26. void delay_ms(unsigned int count);

  27. void set_com(unsigned char com)
  28. {
  29.     P0 |= 0xf0;    //消隐
  30.     P1 = 0xff;
  31.    _nop_();
  32.    _nop_();
  33.    _nop_();
  34.    _nop_();
  35.    _nop_();
  36.    _nop_();
  37.    _nop_();
  38.    _nop_();
  39.    _nop_();
  40.     _nop_();
  41.    switch(com)
  42.     {
  43.        case 0:
  44.            P0 &= ~(0x01<<4);
  45.            break;
  46.        case 1:
  47.            P0 &= ~(0x01<<5);
  48.            break;
  49.        case 2:
  50.            P0 &= ~(0x01<<6);
  51.            break;
  52.        case 3:
  53.            P0 &= ~(0x01<<7);
  54.            break;
  55.        default :
  56.            break;
  57.     }
  58. }

  59. void scan(void)
  60. {
  61.     static unsigned char com=0;
  62.    if(t_flag==1)
  63.     {
  64.        t_flag = 0;
  65.       
  66.        set_com(com);
  67.        P1 = seg_table[ seg_buff[com] ];
  68.        com++;
  69.        if(com==4)
  70.        {
  71.            com = 0;
  72.        }
  73.     }
  74. }      
  75. void t0_srv(void) interrupt 1 using 1      //2ms中断
  76. {
  77. TR0 = 0;
  78. TH0 = (65536-2000)/256;
  79. TL0 = (65536-2000)%6;
  80.     t_flag = 1;
  81.    t_counter++;
  82. TR0 = 1;
  83. }
  84. void t1_srv(void) interrupt 3 using 1      //2ms中断
  85. {
  86. TR1 = 0;
  87. TH1 = (65536-2000)/256;
  88. TL1 = (65536-2000)%6;
  89.    if(KEY1==0)
  90.    {   
  91.        k1--;
  92.        if(k1==0 && KEY1==0)
  93.        {
  94.            k1_flag = 1;
  95.        }
  96.    }        
  97.     else if(KEY1==1)
  98.     {
  99.        k1 = KEY_VAL;
  100.     }
  101.    if(KEY2==0)
  102.    {   
  103.        k2--;
  104.        if(k2==0 && KEY2==0)
  105.        {
  106.            k2_flag = 1;
  107.        }
  108.    }        
  109.     else if(KEY2==1)
  110.     {
  111.        k2 = KEY_VAL;
  112.     }
  113. TR1 = 1;
  114. }
  115. void main(void)
  116. {
  117.    EA  = 0;  
  118. TMOD = 0x11; //timer0 工作方式1 2ms溢出   
  119.     ET0 = 1;
  120.     ET1 = 1;
  121. TH0 = (65536-2000)/256;
  122. TL0 = (65536-2000)%6;
  123.     TH1 = (65536-2000)/256;
  124. TL1 = (65536-2000)%6;
  125. TR0 = 1;
  126.     TR1 = 1;
  127.    DS12887_Init();
  128. EA  = 1;
  129.    while(1)
  130.     {
  131.        if(t_counterP==0)                        //100ms 周期 时钟更新
  132.        {
  133.            DS12887_GetTime(&sys_time);
  134.            seg_buff[0] = sys_time.hour/10;
  135.            seg_buff[1] = sys_time.hour;
  136.            seg_buff[2] = sys_time.minute/10;
  137.            seg_buff[3] = sys_time.minute;
  138.        }
  139.        if(t_counter == 250)                       //冒号闪烁
  140.        {
  141.            maohao_flash();
  142.            t_counter = 0;
  143.        }
  144.        if(k1_flag==1)                             //小时+1
  145.        {
  146.            k1_flag = 0;
  147.            sys_time.hour += 1 ;
  148.            if(sys_time.hour==24)
  149.            {
  150.                sys_time.hour=0;
  151.            }
  152.            DS12887_SetTime(0x04,sys_time.hour);
  153.        }
  154.        if(k2_flag==1)                             //分钟+1
  155.        {
  156.            k2_flag = 0;
  157.            sys_time.minute += 1 ;
  158.            if(sys_time.minute==60)
  159.            {
  160.                sys_time.minute=0;
  161.            }
  162.            DS12887_SetTime(0x02,sys_time.minute);
  163.        }
  164.        scan();                                    //扫描数码管
  165.     }
  166. }

复制代码


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

使用道具 举报

沙发
ID:262 发表于 2021-11-21 00:41 | 只看该作者
可惜没有头文件啊
回复

使用道具 举报

板凳
ID:64053 发表于 2021-12-3 23:44 | 只看该作者
这原理图不够完整
回复

使用道具 举报

地板
ID:137736 发表于 2021-12-6 21:03 | 只看该作者
打包上传全部文件吧,缺了用不成
回复

使用道具 举报

5#
ID:230742 发表于 2021-12-8 18:33 | 只看该作者
是啊。连积分奖励都没有。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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