(1)搶答器同時供 8 名選手比賽,分別用8個按鈕 s1-s8表示(要求用戶使用4*4鍵盤); (2)設置一個系統清除和搶答控制開關按鍵1和按鍵2。 (3)搶答器具有鎖存與顯示功能。即選手按下按鈕,鎖存相應編號,顯示該選手編號至數碼管,并且該編號保存至主持人按下清除鍵按鍵1清除為止。 (4)搶答器具有定時搶答功能,一次搶答設定的時間為X秒(X可自己設置)。主持人按下搶答控制開關按鍵2,搶答才能開始,啟動定時器,并將倒數計時時間用數碼管顯示。若定時時間到,無人搶答,則該輪搶答結束,系統通過蜂鳴器報警,選手禁止搶答。(5)選手在設定的時間內進行搶答,搶答有效,定時器停止工作,蜂鳴器報警,數碼管顯示選手編號及倒計時剩余時間,并保持到主持人將系統清除為止。
Proteus仿真:
0.png (123.82 KB, 下載次數: 60)
下載附件
2021-11-23 16:31 上傳
00.png (203.06 KB, 下載次數: 66)
下載附件
2021-11-23 16:31 上傳
LY-51S開發板實物:
51hei.jpg (553.9 KB, 下載次數: 71)
下載附件
2021-11-26 05:16 上傳
[ i]
單片機源程序如下:
- #include<reg52.h> //頭文件
- #define uchar unsigned char //宏定義
- #define uint unsigned int //宏定義
- //單片機引腳定義
- #define DataPort P0 //定義數據端口 程序中遇到DataPort 則用P0 替換
- #define KEY P3
- sbit LATCH1=P2^6;//定義鎖存使能端口 段鎖存
- sbit LATCH2=P2^7;// 位鎖存
- sbit BEEP = P1^4;
- uchar code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 顯示段碼值0~9
- uchar code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分別對應相應的數碼管點亮,即位碼
- uchar TempData[8]; //存儲顯示值的全局變量
- #define TIMEINIT 10
- uchar time=TIMEINIT; //倒計時
- uchar player = 0;
- //延時函數
- void DelayMS(uint ms)
- {
- uchar t;
- while(ms--)
- {
- for(t=0;t<120;t++);
- }
- }
- //簡單延時
- void Delay(unsigned int t)
- {
- while(--t);
- }
- //顯示驅動
- void Display(unsigned char FirstBit,unsigned char Num)
- {
- unsigned char i;
- for(i=0;i<Num;i++)
- {
- DataPort=0; //清空數據,防止有交替重影
- LATCH1=1; //段鎖存
- LATCH1=0;
-
- if(i<2)
- {
- DataPort=dofly_WeiMa[i+FirstBit]; //取位碼
- LATCH2=1; //位鎖存
- LATCH2=0;
- }else
- {
- DataPort=dofly_WeiMa[i+FirstBit+2]; //取位碼
- LATCH2=1; //位鎖存
- LATCH2=0;
- }
- DataPort=TempData[ i]; //取顯示數據,段碼
- LATCH1=1; //段鎖存
- LATCH1=0;
-
- Delay(200); // 掃描間隙延時,時間太長會閃爍,太短會造成重影
- }
- }
- //按鍵掃描
- uchar Keys_Scan()
- {
- uchar KeyNO=16;
- uchar Tmp;
- KEY = 0x0f;
- DelayMS(10);
- Tmp = KEY ^ 0x0f;
- switch(Tmp)
- {
- case 1: KeyNO = 0; break;
- case 2: KeyNO = 1; break;
- case 4: KeyNO = 2; break;
- case 8: KeyNO = 3; break;
- default: KeyNO = 16;
- }
- KEY = 0xf0;
- DelayMS(1);
- Tmp = KEY >> 4 ^ 0x0f;
- switch(Tmp)
- {
- case 1: KeyNO += 0; break;
- case 2: KeyNO += 4; break;
- case 4: KeyNO += 8; break;
- case 8: KeyNO += 12;
- }
- return KeyNO;
- }
- //顯示數據
- void Display_Data()
- {
- uint num = 1234;
- TempData[0]=dofly_DuanMa[player/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[player%10];
-
- TempData[2]=dofly_DuanMa[(time)/10];
- TempData[3]=dofly_DuanMa[(time)%10];
- Display(0,4);
- }
- //初始化定時器
- void Init_Time()
- {
- TMOD=0x01; //設置定時器模式
- TH0=(65536-46080)/256;// 由于晶振為11.0592,故所記次數應為46080,計時器每隔50000微秒發起一次中斷。
- TL0=(65536-46080)%256;//46080的來歷,為50000*11.0592/12 //設置初值
- ET0=1; //開T0定時器中斷
- EA=1; //開總中斷
- }
- void BeepON()
- {
- int i;
- for(i=0;i<20;i++)
- {
- BEEP = 0;
- Delay(5000);
- BEEP = 1;
- Delay(5000);
- }
- }
- //主函數
- main()
- {
- uchar flag = 0;
- uchar temp;
- BEEP = 1;
- Init_Time(); //初始化定時器
- while(1)
- {
- temp=Keys_Scan(); //獲取選手
- if(temp!=16) //有按鍵按下
- {
- if(temp ==8) //搶答鍵,啟動鍵
- {
- TR0 = 1; //啟動定時器
- flag =1; //1:運行中
- }
- if(temp ==9) //清零鍵
- {
- time = TIMEINIT; //時間恢復為10,初始值
- player = 0; //選手號清零
- flag =0; //0:暫停
- TR0 = 0; //關閉定時器
- }
- if(temp ==10) //加鍵
- {
- if(flag == 0) //暫停
- {
- time+=1;; //時間加
- Delay(50000);
- }
- }
- if(temp ==11) //減鍵
- {
- if(flag == 0) //暫停
- {
- time-=1;; //時間減
- Delay(50000);
- }
- }
- if(temp<8) //選手按下按鍵
- {
- if((flag==1)&&(time>0)) //程序執行中
- {
- player=temp+1; //獲取選手編號
- flag = 0; //暫停
- TR0 = 0; //停止計數
- /*
- BEEP = 0;
- Delay(35000);
- BEEP = 1;
- */
- BeepON();
- }
- }
- }
- if((flag==1)&&(time==0)) //結束報警
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei附件下載:
八路搶答器.7z
(2.25 MB, 下載次數: 72)
2021-11-26 05:33 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|