單片機源程序如下:
- /**********************BST-M51實驗開發(fā)板例程************************
- * 平臺:BST-M51 + Keil U4 + STC89C52
- * 名稱:本例程為一搶答器;其中主持人操控k3與k4兩個按鍵。選手共2位,分別操控k1、k2中的一個按鍵。
- 當主持人按下?lián)尨痖_始按鍵k3后,倒計時開始,計時5s。此后最先按下按鍵的選手號碼將顯示與數(shù)碼管上。
- 后來按下的將無顯示。
- 若五秒計時結(jié)束后,再按下按鍵也不會顯示。
- 若主持人沒有按開始鍵,就有選手搶答,則視為犯規(guī)。此時犯規(guī)的選手號碼將被顯示于數(shù)碼管上
- 同時,蜂鳴器發(fā)出長笛聲報警,數(shù)碼管全亮。
- 而當主持人按下清零鍵K4后,一切狀態(tài)均恢復,可以開始新一輪的搶答。
- 按鍵功能簡介
- k3搶答開始 k4 清零
- k1、k2 分別為兩個選手按鍵
- * 晶振:11.0592MHZ
- * 說明:免費開源,不提供源代碼分析.
- ******************************************************************/
- #include<reg51.h>
- #define uchar unsigned char
- #define dula P0 //段選信號的鎖存器控制
- #define wela P2 //位選信號的鎖存器控制,這里只用到P2.4-P2.7
- sbit beep=P2^3;
- sbit k1 =P3^4;
- sbit k2 =P3^5;
- sbit k3 =P3^6;
- sbit k4 =P3^7;
- uchar key,j,k,daojishi=5,wei;
- bit begin,end,clear,fangui;
- uchar a0,b0=16;c0=16;d0=16;
- unsigned int pp;
- unsigned char code weitable[]={0x8f,0x4f,0x2f,0x1f};
- //數(shù)碼管各位的碼表
- unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
- 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
- void delay(unsigned char i)
- {
- for(j=i;j>0;j--)
- for(k=125;k>0;k--);
- }
- void display1(uchar wei,uchar shu)//在任意一位顯示任意的數(shù)字
- {
- wei=wei-1;
- wela|=0xf0;//給P2.4-P2.7置1
- P0=table[shu];
- wela=wela&weitable[wei];//給P2需要顯示的那一位置1,其他置0
- delay(5);
- }
- void display(uchar a,uchar b,uchar c,uchar d)
- { //一次顯示4個數(shù)字,且每位顯示數(shù)字可自定。
- display1(1,a);
- display1(2,b);
- display1(3,c);
- display1(4,d);
- }
- void keyscan()
- {
- if(k1==0)
- {
- while(k1==0);
- key= 1;
- }
- if(k2==0)
- {
- while(k2==0);
- key=2;
- }
- if(k3==0)
- {
- while(k3==0);
- begin =1;
- }
- if(k4==0)
- {
- while(k4==0);
- clear = 1;
- }
- }
- void main()
- {
- TMOD=0x01;
-
- TH0=(65536-46080)/256;// 由于晶振為11.0592,故所記次數(shù)應為46080,計時器每隔50000微秒發(fā)起一次中斷。
- TL0=(65536-46080)%256;//46080的來歷,為50000*11.0592/12
- ET0=1;
- EA=1;
- a0=table[16];
- beep =1;
- P1=0xff;
- begin=0;
- key=0;
- end = 0;
- fangui = 0;
- while(1)
- {
- keyscan();//按鍵掃描
- if(begin)
- {
- if(!end)
- TR0=1;//開始計時
- if(pp==20)//定時1s
- {
- pp=0;
- daojishi--;
- }
- if(key!=0)
- {
- a0=key;
- end = 1;
- daojishi = 0;
- }
- if(!daojishi)
- {
- TR0=0;
- pp=0;
- }
- }
- else
- {
- if(key!=0)
- {
- fangui=1;
- a0 = key;
- }
- }
- if(clear)
- {
- a0=0;key=0;begin=0;fangui=0;beep=1;daojishi=5;clear=0;
- b0=16;c0=16;d0=16;P1=0xff;pp=0;end = 0;
- }
- d0 = daojishi;
- display(a0,b0,c0,d0);
- if(fangui)
- {
- beep=0;
- P1=0x00;;
- }
- }
- }
- void time0() interrupt 1
- { TH0=(65536-46080)/256;
- TL0=(65536-46080)%256;
- pp++;
- }
復制代碼
所有資料51hei提供下載:
51單片機四路搶答器.rar
(18.12 KB, 下載次數(shù): 50)
2018-5-11 23:50 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|