以前做的一个基于51单片机的数字时钟,有四个按键,可以设置时间、设置闹钟,增加时间,减少时间。
单片机源程序:
- main.c
- #include "bsp.h"
- void main()
- {
- bsp_init();
- while(1)
- {
- key_scan(); //三个按键各自的实现
- set_showvalue(); //按下一个按键,将时间变成可以在数码管上显示的数
- bsp_scan(); //将时间送到数码管上显示
- delay(1);
- }
- }
- bsp_key.c
- #include"bsp.h"
- sbit P1_0=P1^0; //时钟暂停键
- sbit P1_1=P1^1;
- sbit P1_2=P1^2; //增加一秒
- sbit P1_3=P1^3; //减少一秒
- void key_scan(void)
- {
-
- if(P1_0==0) //此键实现暂停
- {
- delay(5);
- if(P1_0==0)
- {
- TR0=0;//定时器启动位关闭
- }
- }
-
-
- if(P1_1==0) //此键设置闹钟
- {
- delay(5);
- if(P1_1==0)
- {
- TR0=1; //定时器启动位开启
- }
- }
-
-
- if(P1_2==0) //此键实现时间的一秒的增加
- {
- delay(5);
- if(P1_2==0)
- {
- delay(5);
- while(!P1_2); //消除按键抖动
- delay(5);
- while(!P1_2);
- sec++;
- if(sec==60)
- {
- sec=0;
- min++;
- if(min==60)
- {
- min=0;
- hour++;
- if(hour==24)
- {
- hour=0;
- }
- }
- }
- }
- }
-
-
-
-
- if(P1_3==0) //此键实现时间一秒的减少
- {
- delay(5);
- if(P1_3==0)
- {
- delay(5);
- while(!P1_3);
- delay(5);
- while(!P1_3);
- sec--;
- if(sec==0)
- {
- sec=59;
- if(min==0)
- {
- min=59;
- if(hour==0)
- {
- hour=23;
- min=59;
- sec=59;
- }
- else
- {
- hour--;
- }
- }
- else
- {
- min--;
- }
- }
- }
- }
- }
- bsp_seg.c
- #include "bsp.h"
- code char WEI[6]={0XDF,0XEF,0XF7,0XFB,0XFD,0XFE}; //位选码
- code char DUAN[11]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0XFF};
- unsigned char show[6]={0x00};
- void bsp_scan(void)
- {
- static unsigned char index =0;
- P2=WEI[index]; //1101 1111
- P0=show[index]; //P0 = DUAN[[index]; 显示固定的0-5
- index++;
- if(index==6)
- index=0;
-
- /* P2 = WEI[0]; //显示自己的生日
- P0 = DUAN[9];
- delay(1);
- P2 = WEI[1];
- P0 = DUAN[6];
- delay(1);
- P2 = WEI[2];
- P0 = DUAN[1];
- delay(1);
- P2 = WEI[3];
- P0 = DUAN[0];
- delay(1);
- P2 = WEI[4];
- P0 = DUAN[3];
- delay(1);
- P2 = WEI[5];
- P0 = DUAN[0];
- delay(1); */
-
- }
- void set_showvalue(void)
- {
- show[0]=DUAN[hour/10];//小时的十位
- show[1]=DUAN[hour%10];//小时的个位
-
- show[2]=DUAN[min/10];
- show[3]=DUAN[min%10];
-
- show[4]=DUAN[sec/10];
- show[5]=DUAN[sec%10];
- }
- bsp_timer.c
- #include "bsp.h"
- unsigned char tick0=0;
- unsigned char sec=0,min=0,hour=0;
- void Time0_Init(void) //定时器0初始化
- {
- TMOD |= 0X01; //方式一,软件清零
- TH0=(65536-50000)/256; //50ms
- TL0=(65536-50000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- }
- void INT_TIME0() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- tick0++;
- if(tick0==20)
- {
- tick0=0;
- sec++;
- if(sec==60)
- {
- sec=0;
- min++;
- if(min==60)
- {
- min=0;
- hour++;
- {
- if(hour=24)
- hour=0;
- }
- }
- }
- }
- }
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
仿真和源码下载:
数字时钟源程序.zip
(56.6 KB, 下载次数: 135)
数字时钟protues仿真.zip
(81.03 KB, 下载次数: 108)
|