“彼岸之光”倒计时牌设计书
一.设计构想 ⒈设计一个倒计时牌。 ⒉倒计时牌由九个数码管分别显示“天”、“时”、“分”、“秒”,其中“天”为三位,“时”、“分”、“秒”各两位。 ⒊倒计时牌设置两个按键:select/start键和set键,用来设置计时时间(只能设置整天)。当按select/start键时,“天”的百位、十位、个位依次闪烁,闪烁位表明当前位被选中,此时按set键进行调整。三位调整完毕再按下select/start键,倒计时开始。 二.实现方法 ⒈定时器0工作在方式1(16位)下定时一秒,每秒触发依次,使“秒”变量减一,相当于秒针。 ⒉两个按键:select/start键和set键分别使用两个外部中断INT0和INT1(设置下降沿有效)。当相应的按键按下时,触发相应的中断子程序。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg51.h>
- #include <stdio.h>
- void timer0_init(); //定时器0初始化
- void delay(int); //延时程序
- void trans_led(int,int,int,int); //数码管显示传送函数
- sbit P10=0x90; //管脚定义
- sbit P30=0xB0;
- sbit P20=0xA0;
- int day=0,hour=0,min=0,sec=0; //定义时间变量
- unsigned int state=0; //运行状态标志
- unsigned int asec=0; //记录定时器0中断次数,当asec=20时计时为1s
- unsigned int check_b=0,check_s=0,check_g=0; //记录set键的按下次数
- char table[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //定义表格
- main(){
- timer0_init();
- EX0=1;
- EX1=1;
- IT0=1;
- IT1=1;
- EA=1;
- TR0=1;
- while(1){
- switch(state){
- case(1):trans_led(100,5,10,10); //"天"的百位闪烁
- break;
- case(2):trans_led(10,100,5,10); //"天"的十位闪烁
- break;
- case(3):trans_led(10,10,100,5); //"天"的个位闪烁
- break;
- default:trans_led(0,20,20,20); //正常运行
- break;
-
- }
- }
- }
- void timer0_init(){
- TMOD=0x21;
- TH0=0x3C;
- TL0=0xB0;
- ET0=1;
- TF0=0;
- }
- void Timer0_overflow() interrupt 1 using 0{
- TH0=0x3C;
- TL0=0xB0;
- asec++;
- if(asec==20){ //定时一秒
- asec=0;
- if(sec==0){
- sec+=60;
- min--;
- }
- if(min<0){
- min+=60;
- hour--;
- }
- if(hour<0){
- hour+=24;
- day--;
- }
- if(day>=0){ //计时时间未完,秒减一
- sec--;
- }
- else{
- day=hour=min=sec=0; //计时结束
- TR0=0;
- }
- }
- }
- void Int0() interrupt 0 using 0{ //set键
- if(state>4)
- state=1;
- else
- state++;
- if(state==4){
- state=0;
- TR0=1;
- }
- }
- void Int1() interrupt 2 using 0{ //select/start键
-
- if(state>=1&&state<=3){
- TR0=0;
- hour=min=sec=0;
- timer0_init();
- }
- switch(state){
- case(1):day+=100;
- check_b++;
- break;
- case(2):day+=10;
- check_s++;
- break;
- case(3):day++;
- check_g++;
- break;
- default:break;
- }
-
- if(check_b>9) //计时范围限制
- day-=1000;
- if(check_s>9){
- day-=100;
- }
- if(check_g>9){
- day-=10;
- }
-
- }
- void delay(int time){
- int i,j;
- for(i=0;i<=time;i++){
- for(j=0;j<=10;j++);
- }
- }
- void trans_led(int a,int b,int c,int d){
- //显示秒
- P2=0xFE;
- P1=table[sec%10];
- delay(20);
- P2=0xFF;
-
- P2=0xFD;
- P1=table[sec/10];
- delay(20);
- P2=0xFF;
-
- //显示分
- P2=0xFB;
- P1=table[min%10];
- delay(20);
- P2=0xFF;
-
- P2=0xF7;
- P1=table[min/10];
- delay(20);
- P2=0xFF;
-
-
- //显示时
- P2=0xEF;
- P1=table[hour%10];
- delay(20);
- P2=0xFF;
-
- P2=0xDF;
- P1=table[hour/10];
- delay(20);
-
-
-
- //显示天
- delay(a);
- P2=0xFF;
- P30=0;
- check_b=day/100;
- P1=table[check_b];
- delay(b);
- P2=0xFF;
-
-
- P30=1;
- P2=0x7F;
- check_s=(day/10)%10;
- P1=table[check_s];
- delay(c);
- P2=0xFF;
-
- P2=0xBF;
- check_g=day%10;
- P1=table[check_g];
- delay(d);
- P2=0xFF;
-
-
-
- }
复制代码 全部资料51hei下载地址:
倒计时牌.zip
(540.18 KB, 下载次数: 135)
|