電子秒表時鐘 數碼管顯示 可設置時間 可用于秒表暫停、清零蜂鳴器按鍵音
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- #include<reg51.h>
- #include"delay.h"
- #include"intrins.h"
- unsigned char code LED[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //定義共陰極LED7段顯示碼
- unsigned char dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定義數碼管位碼
- unsigned char hour=23,min=58,sec=52,week=1; //定義初始時間為23時58分52秒
- unsigned char tcount; //定義50ms計數變量
- unsigned char flag=0;
- sbit KEY1=P1^0;
- sbit KEY2=P1^1;
- sbit KEY3=P1^2;
- sbit key1=P1^3;
- sbit key2=P3^6;
- sbit key3=P3^7;
- sbit LED1=P1^7;
- sbit LED2=P1^6;
- sbit LED3=P1^5;
- sbit LED4=P1^4;
- sbit BEEP=P3^0;
- void display(unsigned char,unsigned char,unsigned char,unsigned char);
- void delay(unsigned int time)//定義延時函數
- {
- unsigned int j = 0;
- for(;time>0;time--)
- for(j=0;j<125;j++);
- }
- void Delay100us() //@11.0592MHz
- {
- unsigned char i, j;
- _nop_();
- _nop_();
- i = 2;
- j = 100;
- do
- {
- while (--j);
- } while (--i);
- }
- void main(void)
- {
- TMOD=0x01; //定時/計數器0設為方式1
- TH0=(65536-50000)/256; //定時50ms初值的高八位送入TH0
- TL0=(65536-50000)%256; //定時50ms初值的低八位送入TL0
- EA=1; //開CPU中斷
- ET0=1; //開定時/計數器0的中斷
- TR0=1; //啟動定時器0
- while(1)
- {
- if(key1==0)
- { BEEP=0;Delay100us();BEEP=1;
- hour=0;min=0;sec=0;
- }
- if(key2==0)
- { BEEP=0;Delay100us();BEEP=1;
- TR0=0;
- }
- if(key3==0)
- { BEEP=0;Delay100us();BEEP=1;
- TR0=1;
- }
-
- if(KEY1==0)
- { delay(180);
- if(KEY1==0)
- {
- TR0=0;
- flag++;
- if(flag>4)
- {
- flag=0;
- TR0=1;
- LED1=1;LED2=1;LED3=1;LED4=1;
- }
- }
- }
- switch(flag)
- {
- case 1: LED1=0;LED2=1;LED3=1;LED4=1;
- if(KEY2==0)
- {
- delay(180);
- if(KEY2==0)
- {
- hour++;
- if(hour>23)
- hour=0;
- }
- }
- if(KEY3==0)
- {
- delay(150);
- if(KEY3==0)
- {
- hour--;
- if(hour<0)
- hour=23;
- }
- }
- display(hour,min,sec,week);
- break;
- case 2: LED1=1;LED2=0;LED3=1;LED4=1;
- if(KEY2==0)
- {
- delay(180);
- if(KEY2==0)
- {
- min++;
- if(min>59)
- min=0;
- }
- }
- if(KEY3==0)
- {
- delay(180);
- if(KEY3==0)
- {
- min--;
- if(min<0)
- min=59;
- }
- }
- display(hour,min,sec,week);
- break;
- case 3: LED1=1;LED2=1;LED3=0;LED4=1;
- if(KEY2==0)
- {
- delay(180);
- if(KEY2==0)
- {
- sec++;
- if(sec>59)
- sec=0;
- }
- }
- if(KEY3==0)
- {
- delay(180);
- if(KEY3==0)
- {
- sec--;
- if(sec<0)
- sec=59;
- }
- }
- display(hour,min,sec,week);
- break;
- case 4:LED1=1;LED2=1;LED3=1;LED4=0;
- if(KEY2==0)
- {
- delay(180);
- if(KEY2==0)
- {
- week++;
- if(week>7)
- week=1;
- }
- }
- if(KEY3==0)
- {
- delay(180);
- if(KEY3==0)
- {
- week--;
- if(week<1)
- week=7;
- }
- }
- display(hour,min,sec,week);
- break;
- case 5:LED1=1;LED2=1;LED3=1;LED4=1;flag=0;TR0=1;
- default:break;
-
-
- }
- display(hour,min,sec,week);
- }
- }
- void display(unsigned char hour,unsigned char min,unsigned char sec,unsigned char week)
- {
-
- P0=LED[hour/10]; //小時的十位送數碼管1位顯示
- P2=0xfe;
- delay(1);
- P2=0xff;
-
- P0=LED[hour%10]; //小時的個位送數碼管2位顯示
- P2=0xfd;
- delay(1);
- P2=0xff;
-
- P0=LED[min/10]; //橫杠送數碼管3位顯示
- P2=0xfb;
- delay(1);
- P2=0xff;
-
- P0=LED[min%10]; //分的十位送數碼管4位顯示
- P2=0xf7;
- delay(1);
- P2=0xff;
-
- P0=LED[sec/10]; //分的個位送數碼管5位顯示
- P2=0xef;
- delay(1);
- P2=0xff;
-
- P0=LED[sec%10]; //橫杠送數碼管6位顯示
- P2=0xdf;
- delay(1);
- P2=0xff;
-
- P0=LED[10]; //秒的十位送數碼管7位顯示
- P2=0xbf;
- delay(1);
- P2=0xff;
-
- P0=LED[week]; //秒的個位送數碼管8位顯示
- P2=0x7f;
- delay(1);
- P2=0xff;
- }
- void T0_time() interrupt 1 //定時器中斷處理函數
- {
- TH0=(65536-50000)/256; //重新將定時50ms初值的高八位送TH0
- TL0=(65536-50000)%256; //重新將定時50ms初值的低八位送TH0
- tcount++; //定時50ms時間到加1
- if(tcount==20) //判斷是否到1s
- {
- tcount=0; //到1s,變量清0
- sec++; //秒計數變量加1
- if(sec==60) //判斷秒是否到60
- {
- sec=0; //到60,秒變量清0
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
電子時鐘設計.zip
(126.91 KB, 下載次數: 298)
2020-5-22 16:29 上傳
點擊文件名下載附件
|