多年前一個用89c52和12b887做的時鐘 網上找的資料我做了一次
7639020cg9dfb068981ba&690.jpg (37.6 KB, 下載次數: 52)
下載附件
2021-11-20 20:37 上傳
7639020cg9dfb067a281e&690.jpg (41.87 KB, 下載次數: 66)
下載附件
2021-11-20 20:37 上傳
7639020cg9dfb066ae4ef&690.jpg (31.55 KB, 下載次數: 48)
下載附件
2021-11-20 20:37 上傳
7639020cg9dfb064c6847&690.jpg (46.4 KB, 下載次數: 49)
下載附件
2021-11-20 20:37 上傳
單片機源程序如下:
- #include <REGX52.H>
- #include <intrins.h>
- #include "sys_def.h"
- #include "ds12b887.h"
- #define maohao_flash() P0 ^= (0x01<<3)
- #define KEY_VAL 5
- unsigned char k1_flag=0,k2_flag=0,k1,k2;
- unsigned char code seg_table[]=
- {
- 0x88,
- 0xdd,
- 0x86,
- 0x85,
- 0xd1,
- 0xa1,
- 0xa0,
- 0xcd,
- 0x80,
- 0x81,
- };
- sbit KEY1=P2^5;
- sbit KEY2=P2^0;
- unsigned char seg_buff[4];
- unsigned char t_flag=0,t_counter=0;
- TIMEFORMAT sys_time;
- void delay_ms(unsigned int count);
- void set_com(unsigned char com)
- {
- P0 |= 0xf0; //消隱
- P1 = 0xff;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- switch(com)
- {
- case 0:
- P0 &= ~(0x01<<4);
- break;
- case 1:
- P0 &= ~(0x01<<5);
- break;
- case 2:
- P0 &= ~(0x01<<6);
- break;
- case 3:
- P0 &= ~(0x01<<7);
- break;
- default :
- break;
- }
- }
-
- void scan(void)
- {
- static unsigned char com=0;
- if(t_flag==1)
- {
- t_flag = 0;
-
- set_com(com);
- P1 = seg_table[ seg_buff[com] ];
- com++;
- if(com==4)
- {
- com = 0;
- }
- }
- }
- void t0_srv(void) interrupt 1 using 1 //2ms中斷
- {
- TR0 = 0;
- TH0 = (65536-2000)/256;
- TL0 = (65536-2000)%6;
- t_flag = 1;
- t_counter++;
- TR0 = 1;
- }
- void t1_srv(void) interrupt 3 using 1 //2ms中斷
- {
- TR1 = 0;
- TH1 = (65536-2000)/256;
- TL1 = (65536-2000)%6;
- if(KEY1==0)
- {
- k1--;
- if(k1==0 && KEY1==0)
- {
- k1_flag = 1;
- }
- }
- else if(KEY1==1)
- {
- k1 = KEY_VAL;
- }
- if(KEY2==0)
- {
- k2--;
- if(k2==0 && KEY2==0)
- {
- k2_flag = 1;
- }
- }
- else if(KEY2==1)
- {
- k2 = KEY_VAL;
- }
- TR1 = 1;
- }
- void main(void)
- {
- EA = 0;
- TMOD = 0x11; //timer0 工作方式1 2ms溢出
- ET0 = 1;
- ET1 = 1;
- TH0 = (65536-2000)/256;
- TL0 = (65536-2000)%6;
- TH1 = (65536-2000)/256;
- TL1 = (65536-2000)%6;
- TR0 = 1;
- TR1 = 1;
- DS12887_Init();
- EA = 1;
- while(1)
- {
- if(t_counterP==0) //100ms 周期 時鐘更新
- {
- DS12887_GetTime(&sys_time);
- seg_buff[0] = sys_time.hour/10;
- seg_buff[1] = sys_time.hour;
- seg_buff[2] = sys_time.minute/10;
- seg_buff[3] = sys_time.minute;
- }
- if(t_counter == 250) //冒號閃爍
- {
- maohao_flash();
- t_counter = 0;
- }
- if(k1_flag==1) //小時+1
- {
- k1_flag = 0;
- sys_time.hour += 1 ;
- if(sys_time.hour==24)
- {
- sys_time.hour=0;
- }
- DS12887_SetTime(0x04,sys_time.hour);
- }
- if(k2_flag==1) //分鐘+1
- {
- k2_flag = 0;
- sys_time.minute += 1 ;
- if(sys_time.minute==60)
- {
- sys_time.minute=0;
- }
- DS12887_SetTime(0x02,sys_time.minute);
- }
- scan(); //掃描數碼管
- }
- }
復制代碼
|