找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3840|回复: 2
收起左侧

单片机+TM1628+DS12C887时钟源程序

[复制链接]
ID:164931 发表于 2020-4-11 22:18 | 显示全部楼层 |阅读模式
在烤箱拆出来的LED显示屏,和那个宝上TM1638d的驱动一样,加了DS12C887时钟芯片,废物利用一下,附上程序。
51hei图片_20200411220743.jpg

单片机源程序如下:
  1. #include "define.h"
  2. unsigned char code table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
  3.                            0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
  4. //unsigned char num[8]={0,1,2,3,4,5,6,7};                //各个数码管显示的值
  5. struct Timer{
  6.         unsigned char sec;
  7.         unsigned char min;
  8.         unsigned char hour;
  9. };
  10. #define INBUF_LEN 4
  11. unsigned char ch;
  12. unsigned key_num=0;
  13. unsigned char cnt_num=0;
  14. uchar cnt_sec=0;
  15. bit read_flag=0;
  16. bit Set_flag =0;
  17. struct Timer Display;
  18. struct Timer Setting;
  19. void DS12C887_read_time()
  20. {
  21.                 Display.sec=DS12C887_read_ds(DC12C887_Sec_Address);
  22.                 Display.min=DS12C887_read_ds(DC12C887_Min_Address);
  23.                 Display.hour=DS12C887_read_ds(DC12C887_Hour_Address);
  24. }
  25. void init_serialcom( void )
  26. {
  27.      SCON = 0x50 ;  //SCON: serail mode 1, 8-bit UART, enable ucvr
  28.            TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
  29.            PCON |= 0x80 ; //SMOD=1;
  30.            TH1 = 0xFA ;   //Baud:9600 fosc=11.0592MHz
  31.            IE |= 0x90 ;   //Enable Serial Interrupt
  32.            TR1 = 1 ;     // timer 1 run
  33.            TI=1;
  34. }
  35. void Timer0Init(void)                //50ms @11.0592MHz
  36. {
  37. //        AUXR &= 0x7F;                //?????12T??
  38.         TMOD &= 0xF0;                //???????
  39.         TMOD |= 0x01;                //???????
  40.         TL0 = 0x00;                //??????
  41.         TH0 = 0x4C;                //??????
  42.         TF0 = 0;                //??TF0??
  43.         ET0 = 1;
  44.         TR0 = 0;                //???0????
  45.         EA = 1;
  46. }

  47. void send_char_com( unsigned char ch)
  48. {
  49.            SBUF=ch;
  50.            while (TI== 0);
  51.                  TI= 0 ;
  52. }
  53. void Key_Scan()
  54. {
  55.                
  56.         if(KEY_SET==0)
  57.         {
  58.                 delay_ms(1);
  59.                 if(KEY_SET==0)
  60.                 {
  61.                         while(!KEY_SET);
  62.                         key_num++;
  63.                         if(key_num>=3)   //设置完成
  64.                         {
  65.                                 key_num = 0;
  66.                                 //DS12C887_write_time(Setting.hour,Setting.min,0);
  67.                           DS12C887_write_ds(0x0b,0x26);       
  68.                                 DS12C887_write_time(Display.hour,Display.min,0);
  69.                                 Set_flag=0;
  70.                                 TR0 = 0;
  71.                                 //display_st = 1;               //????
  72.                                 //SET.hour=(DISPLAY.hour/10)*16+DISPLAY.hour%10;
  73.                                 //SET.min=(DISPLAY.min/10)*16+DISPLAY.min%10;
  74.                                 //iicWriteData(HOUR_ADDRESS,SET.hour);
  75.                                 //iicWriteData(MIN_ADDRESS,SET.min);
  76.                                 //iicWriteData(SEC_ADDRESS,0x00);      //denable oscillator
  77.                         }                       
  78.                 }               
  79.         }
  80.         if(key_num!=0)
  81.         {

  82.                 TR0 = 1;
  83.                 //iicWriteData(SEC_ADDRESS,0x80);      //disable oscillator
  84.                 Set_flag=1;   //进入设置模式
  85.                 DS12C887_write_ds(0x0b,0xa6);  //DS12C887禁止读取
  86.                 if(key_num == 1)          //第一次按下按键,调小时
  87.                 {               
  88.                         if(LED)
  89.                         {
  90.                                 TM1638_Write_DATA(TM1638_Thous_Bit,0x00);
  91.                                 TM1638_Write_DATA(TM1638_Hund_Bit,0x00);
  92.                         }
  93.                         //LED_DISPLAY(DISPLAY.hour,DISPLAY.min,1);
  94.                         //else LED_DISPLAY(DISPLAY.hour,DISPLAY.min,0);

  95.                         if(KEY_ADD==0)
  96.                         {
  97.                                 delay_ms(1);
  98.                                 if(KEY_ADD==0)
  99.                                 {
  100.                                         while(!KEY_ADD);
  101.                                         Display.hour++;
  102.                                         if(Display.hour>=24)
  103.                                                 Display.hour=0;                               
  104.                                 }
  105.                         }
  106.                         if(KEY_DEC==0)
  107.                         {
  108.                                 delay_ms(1);
  109.                                 if(KEY_DEC==0)
  110.                                 {
  111.                                         while(!KEY_DEC);
  112.                                         if(Display.hour>0)
  113.                                                 Display.hour--;                       
  114.                                 }
  115.                         }
  116.                
  117.                 }
  118.        
  119.                 if(key_num == 2)       //第二次按下设置键,调分钟
  120.                 {
  121.                         if(LED)
  122.                         {
  123.                                 TM1638_Write_DATA(TM1638_Ten_Bit,0x00);
  124.                                 TM1638_Write_DATA(TM1638_Bit,0x00);
  125.                         }
  126.                         if(KEY_ADD==0)
  127.                         {
  128.                                 delay_ms(1);
  129.                                 if(KEY_ADD==0)
  130.                                 {
  131.                                         while(!KEY_ADD);
  132.                                         Display.min++;
  133.                                         if(Display.min>=60)
  134.                                                 Display.min=0;                               
  135.                                 }
  136.                         }
  137.                         if(KEY_DEC==0)
  138.                         {
  139.                                 delay_ms(1);
  140.                                 if(KEY_DEC==0)
  141.                                 {
  142.                                         while(!KEY_DEC);
  143.                                         if(Display.min>0)
  144.                                                 Display.min--;       
  145.                                                                        
  146.                                 }
  147.                         }
  148.                        
  149.                 }
  150. }
  151. //        if(key_num==0)                          
  152. //        {
  153. //                        if(KEY_ADD==0)     
  154. //                        {
  155. //                                if(KEY_ADD==0)
  156. //                                {
  157. //                                        while(!KEY_ADD);
  158. //                                        show_set_value++;
  159. //                                        if(show_set_value>=5)
  160. //                                                show_set_value=0;
  161. //                                                                                                               
  162. //                                }
  163. //                        }
  164. //               
  165. //        }
  166. //        if(show_set_value!=0)
  167. //        {
  168. //                TR0=1;
  169. //                if(sec_cnt>=15)                  
  170. //                {
  171. //                        sec_cnt=0;
  172. //                        TR0=0;
  173. //                        show_set_value=0;
  174. //                }       
  175. //                else
  176. //                {
  177. //                       
  178. //                   if(show_set_value==1)
  179. //                        LED_DISPLAY(OPEN1.hour,OPEN1.min,4);
  180. //                if(show_set_value==2)
  181. //                        LED_DISPLAY(CLOSE1.hour,CLOSE1.min,4);
  182. //                if(show_set_value==3)
  183. //                        LED_DISPLAY(OPEN2.hour,OPEN2.min,4);
  184. //                if(show_set_value==4)
  185. //                        LED_DISPLAY(CLOSE2.hour,CLOSE2.min,4);
  186. //                }
  187. //        }

  188. }


  189. void main(void)
  190. {
  191.         unsigned char i;
  192.         TM1638_init();        //初始化TM1638
  193.         DS12C887_init();
  194.         init_serialcom();
  195.         Timer0Init();
  196.         LED=0;
  197.         for(i=0;i<8;i++)
  198.            TM1638_Write_DATA(i<<1,0x00);                       //初始化寄存器
  199.         //DS12C887_write_time(14,9,0);
  200.         while(1)
  201.         {
  202.                 /*i=Read_key();                          //读按键值
  203.                 if(i<8)
  204.                 {
  205.                         num[i]++;
  206.                         while(Read_key()==i);                       //等待按键释放
  207.                         if(num[i]>15)
  208.                         num[i]=0;
  209.                         Write_DATA(i*2,tab[num[i]]);
  210.                         Write_allLED(1<<i);*/
  211.                 //Write_DATA(0,table[Display.hour/10]);
  212.     Key_Scan();
  213.                 TM1638_Write_DATA(TM1638_Thous_Bit,table[Display.hour/10]);       
  214.                 TM1638_Write_DATA(TM1638_Hund_Bit,table[Display.hour%10]);
  215.                 TM1638_Write_DATA(TM1638_Ten_Bit,table[Display.min/10]);
  216.                 TM1638_Write_DATA(TM1638_Bit,table[Display.min%10]);
  217.                 if(Set_flag==0)   //不在设置模式
  218.                 {
  219.                                         DS12C887_read_time();
  220.                                         if(Display.sec%2==0)
  221.                                                 TM1638_Write_DATA(TM1638_Sec_Bit,0x01);  //闪烁
  222.                                                                                
  223.                                         else TM1638_Write_DATA(TM1638_Sec_Bit,0x00);
  224.                 }

  225.                
  226. ……………………

  227. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
TM1628 DS12C887时钟.rar (1006.43 KB, 下载次数: 160)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:690685 发表于 2021-8-14 17:49 | 显示全部楼层
很好的教程,谢谢分享
回复

使用道具 举报

ID:232619 发表于 2021-9-3 01:38 | 显示全部楼层
很好,参考教程
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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