足球賽補時牌設計:要求用6位數碼管按照“mm--ss”格式動態顯示補時及倒計時,并加2個按鍵(一個設置補時多少分鐘,按一次加1,可循環設置0-19分鐘,另一個按下,開始倒計時),計時到0時,驅動蜂鳴器發出響聲,頻率為1/100ms,持續10s。要求在KEIL中編寫程序,用PROTEUS設計電路并仿真運行。(評分標準:高位沒有數字時不顯示:A;高位沒有數字時顯示0:B)
電路原理圖如下:
電路圖
單片機代碼:
- #include <reg51.h> //51單片機頭文件
- #include<intrins.h> //51庫函數
- #define uchar unsigned char
- #define uint unsigned int
- sbit DX = P2^6;//段選接P2.6引腳
- sbit WX = P2^7; //位選接P2.7引腳
- sbit BUZZ = P2^0;
- char second = 0;
- char minute = 0; //計數,時間(分鐘)
- /****
- 共陰級
- table[10]表示不顯示
- table[11] 表示“-”
- **************/
- uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d,
- 0x7d, 0x07, 0x7f, 0x6f, 0x00, 0x40};
- uchar s[8];
- uchar delay = 1;
- uchar n = 0;
- uint mm=0;
- uchar speak = 0; //標識蜂鳴器是否開始發聲
- void delay_ms(uint t) //延時函數
- {
- uint i,j;
- for(i=0;i<t;i++)
- for(j=0;j<110;j++);
- }
- void init()
- {
- EA = 1; //開全局中斷
- EX0 = 1;//INT0中斷允許
- IT0 = 1;//觸發方式為下降沿觸發
- EX1 = 1;//INT0中斷允許
- IT1 = 1;//觸發方式為下降沿觸發
- TMOD = 0x19; //T1軟啟動、定時器、工作方式1;T0硬啟動、定時器、工作方式1
- TH0 = 0x4C; //給定初值
- TL0 = 0x00;
- TH1 = 0xff; //給定初值
- TL1 = 0x00;
- ET0 = 1; //定時器中斷打開
- ET1 = 1;
- TR0 = 0; //不啟動定時器中斷
- TR1 = 0; //
- }
- void fun()
- {
- s[0] = table[second%10];
- s[1] = table[second/10];
- s[2] = table[11];
- s[3] = table[11];
- if(minute%10!=0)
- s[4] = table[minute%10];
- else
- s[4] = table[10];
- if(minute/10!=0)
- s[5] = table[minute/10];
- else
- s[5] = table[10];
- }
- void dispaly()
- {
- uchar i;
- uchar temp = 0xdf;
- fun();
- for(i=0;i<6;i++){
- DX = 0;
- WX = 0;
- P0 = 0x00;
- DX = 1;
- P0 = s[ i];
- DX = 0;
- P0 = 0xff;
- WX = 1;
- P0 = temp;
- WX = 0;
- temp = _cror_(temp, 1);
-
- TH1 = 0xff;
- TL1 = 0x00;
- TR1 = 1; //延時
- while(delay<1);
-
- delay = 0;
- }
- }
- void main()
- {
- init();
- while(1){
- dispaly();
- if(speak==1){
- DX = 1;
- P0 = table[10];
- DX = 0;
- P0 = 0xff;
- WX = 1;
- P0 = 0x01;
- WX = 0;
- BUZZ = 0;
- TR1 = 1;
- TL0 = 19664%256;
- TH0 = 19664/256; //給定初值
- // delay_ms(10000);
- // TR1 = 0;
- // speak=0;
- }
- }
- }
- void EX_INT0() interrupt 0
- {
- minute++;
- if(minute > 19) minute=19;
- }
- void EX_INT1() interrupt 2
- {
- TR0 = 1;
- }
- void ET_T0() interrupt 1
- {
- TL0 = 19664%256;
- TH0 = 19664/256; //給定初值
- n++;
- if(n==20){
- n = 0;
- if(minute ==0 && second==0){
- TR0 = 0;
- speak = 1;
- }
- else if(second==0){
- minute --;
- second = 59;
- }
- else{
- second--;
- }
- }
- }
- void ET_T1() interrupt 3
- {
- if(speak==1){
- mm++;
- BUZZ = ~BUZZ;
- TL0 = 19664%256;
- TH0 = 19664/256; //給定初值
- if(mm==200){
- speak=0;
- TR1 = 0;
- }
- }
- delay=1;
- }
復制代碼
|