|
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (22.34 KB, 下載次數(shù): 73)
下載附件
2021-1-4 14:51 上傳
Altium Designer畫(huà)的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png (30.37 KB, 下載次數(shù): 70)
下載附件
2021-1-4 14:52 上傳
51hei.png (41.08 KB, 下載次數(shù): 55)
下載附件
2021-1-4 14:53 上傳
51hei.png (11.87 KB, 下載次數(shù): 78)
下載附件
2021-1-4 14:53 上傳
單片機(jī)源程序如下:
- /*************************************************************
- 八路搶答器系統(tǒng)
- 補(bǔ)充說(shuō)明:
- ***************************************************************/
- #include<reg52.h> //頭文件
- #include<SMG.h>
- #include<EEPROM.h>
- #include<INTERRUPT.h>
- #define uchar unsigned char//宏定義
- #define uint unsigned int
- /**********************引腳定義************************/
- sbit key_zhu=P2^2; //主持人鍵
- sbit key_jia=P2^1; //加鍵
- sbit key_jian=P2^0; //減鍵
- sbit key_1=P1^1; //八位選手按鍵定義
- sbit key_2=P1^3;
- sbit key_3=P1^5;
- sbit key_4=P1^7;
- sbit key_5=P3^1;
- sbit key_6=P3^3;
- sbit key_7=P3^5;
- sbit key_8=P3^7;
- sbit led_1=P1^0; //八位LED燈按鍵定義
- sbit led_2=P1^2;
- sbit led_3=P1^4;
- sbit led_4=P1^6;
- sbit led_5=P3^0;
- sbit led_6=P3^2;
- sbit led_7=P3^4;
- sbit led_8=P3^6;
- /**********************變量定義************************/
- uchar zhu_f=0; //比賽進(jìn)行階段標(biāo)記位,=0表示沒(méi)有按。=1表示在設(shè)置倒計(jì)時(shí)的時(shí)間。=2表示開(kāi)始搶答
- uchar qiang_f=0; //搶答犯規(guī)標(biāo)記,=0沒(méi)有犯規(guī)。=1表示有人犯規(guī)
- uchar wan_f=0; //搶答完成標(biāo)記,=0搶答沒(méi)完成后還沒(méi)有開(kāi)始。=1表示搶答完成
- uchar time=30; //倒計(jì)時(shí)時(shí)間
- uchar T0_num; //定時(shí)器0計(jì)數(shù)
- uchar number; //搶答成功選手的編號(hào),或犯規(guī)選手的編號(hào)。=0的時(shí)候表示沒(méi)有
- /********************************************************
- 函數(shù)名稱:void delayms(uint ms)
- 函數(shù)作用:毫秒延時(shí)函數(shù)
- 參數(shù)說(shuō)明:
- ********************************************************/
- void delayms(uint ms)
- {
- unsigned char i=100,j;
- for(;ms;ms--)
- {
- while(--i)
- {
- j=10;
- while(--j);
- }
- }
- }
- /********************************************************
- 函數(shù)名稱:void bajing()
- 函數(shù)作用:搶答犯規(guī)報(bào)警提示
- 參數(shù)說(shuō)明:
- ********************************************************/
- void bajing()
- {
- buzz=0; //開(kāi)蜂鳴器
- delayms(10);
- buzz=1; //關(guān)蜂鳴器
- delayms(10);
- }
- /********************************************************
- 函數(shù)名稱:uchar qianda()
- 函數(shù)作用:搶答按鍵檢測(cè),返回?fù)尨鹁幪?hào)
- 參數(shù)說(shuō)明:
- ********************************************************/
- uchar qianda()
- {
- uchar temp=0;
- if(key_1==0) //一號(hào)犯規(guī),下同
- temp=1; //記錄1號(hào)
- else
- if(key_2==0)
- temp=2;
- else
- if(key_3==0)
- temp=3;
- else
- if(key_4==0)
- temp=4;
- else
- if(key_5==0)
- temp=5;
- else
- if(key_6==0)
- temp=6;
- else
- if(key_7==0)
- temp=7;
- else
- if(key_8==0)
- temp=8;
- return temp;
- }
- /********************************************************
- 函數(shù)名稱:void led_kongzhi(uchar num,bit mode)
- 函數(shù)作用:LED燈控制
- 參數(shù)說(shuō)明:num控制哪一個(gè)燈,k=1,點(diǎn)亮,=0關(guān)閉。mode=0全滅后在控制這個(gè)燈,=1單獨(dú)控制這個(gè)燈
- ********************************************************/
- void led_kongzhi(uchar num,bit k,bit mode)
- {
- if(mode==0)
- {
- led_1=1; //八位LED燈全滅
- led_2=1;
- led_3=1;
- led_4=1;
- led_5=1;
- led_6=1;
- led_7=1;
- led_8=1;
- }
- if(k==1)
- {
- switch (num) //控制對(duì)應(yīng)LED燈亮
- {
- case 1:led_1=0;
- break;
- case 2:led_2=0;
- break;
- case 3:led_3=0;
- break;
- case 4:led_4=0;
- break;
- case 5:led_5=0;
- break;
- case 6:led_6=0;
- break;
- case 7:led_7=0;
- break;
- case 8:led_8=0;
- break;
- }
- }
- else
- {
- switch (num) //控制對(duì)應(yīng)LED燈滅
- {
- case 1:led_1=1;
- break;
- case 2:led_2=1;
- break;
- case 3:led_3=1;
- break;
- case 4:led_4=1;
- break;
- case 5:led_5=1;
- break;
- case 6:led_6=1;
- break;
- case 7:led_7=1;
- break;
- case 8:led_8=1;
- break;
- }
- }
- }
- /********************************************************
- 函數(shù)名稱:void scan(void)
- 函數(shù)作用:按鍵檢測(cè)函數(shù)
- 參數(shù)說(shuō)明:
- ********************************************************/
- void scan(void)
- {
- uchar qiangda_num=0;
- //主持人鍵
- if(key_zhu==0) //按鍵按下
- {
- delayms(7); //顯示消抖
- if(key_zhu==0&&zhu_f!=2&&qiang_f==0&&wan_f==0)//判斷是否有人犯規(guī)或者搶答是否開(kāi)始或者搶答是否完成
- {
- zhu_f++; //比賽階段標(biāo)記+1
- if(zhu_f==2) //比賽正式開(kāi)始
- {
- TR0=1; //比賽開(kāi)始,開(kāi)啟定時(shí)
- wan_f=0; //清除比賽完成標(biāo)志
- bajing(); //提示比賽開(kāi)始
- }
- }
- else
- if(key_zhu==0&&qiang_f==1) //判斷是否有人犯規(guī)
- {
- buzz=1; //清除報(bào)警
- qiang_f=0; //清除搶答標(biāo)志
- number=0; //清除選手編號(hào)
- time=EEPROM_read(0x2000);//重新讀取存儲(chǔ)的搶答總時(shí)長(zhǎng)
- led_kongzhi(0,0,0);
- }
- else
- if(key_zhu==0&&wan_f==1) //判斷是否有人完成
- {
- buzz=1; //清除報(bào)警
- wan_f=0; //清除完成標(biāo)志
- number=0; //清除選手編號(hào)
- time=EEPROM_read(0x2000);//重新讀取存儲(chǔ)的搶答總時(shí)長(zhǎng)
- led_kongzhi(0,0,0);
- }
- else
- if(key_zhu==0&&zhu_f==2) //暫停比賽
- {
- TR0=0; //關(guān)閉定時(shí)
- zhu_f=1; //重新回到設(shè)置比賽時(shí)間階段
- bajing(); //提示暫停比賽
- }
- while(!key_zhu);//檢測(cè)按鍵松開(kāi)
- }
- //加值鍵,支持連按
- if(key_jia==0&&zhu_f==1&&qiang_f==0) //判斷是否在設(shè)置倒計(jì)時(shí)時(shí)間
- {
- delayms(7); //延時(shí)消抖
- if(key_jia==0) //再次判斷按鍵按下
- {
- if(time<99) //比賽時(shí)間最大值99S
- time++; //比賽時(shí)間+1S
- EEPROM_delete(0x2000); //擦除EEPROM煽區(qū)
- EEPROM_write(0x2000,time); //寫(xiě)入【比賽時(shí)間】數(shù)據(jù)保存
- display(time/10,time%10,10,0); //顯示設(shè)置比賽時(shí)間
- }
- }
- //減值鍵,支持連按
- if(key_jian==0&&zhu_f==1&&qiang_f==0) //判斷是否在設(shè)置倒計(jì)時(shí)時(shí)間
- {
- delayms(7); //延時(shí)消抖
- if(key_jian==0) //再次判斷按鍵按下
- {
- if(time!=0) //比賽時(shí)間最小值0S
- time--; //比賽時(shí)間-1S
- EEPROM_delete(0x2000); //擦除EEPROM煽區(qū)
- EEPROM_write(0x2000,time); //寫(xiě)入【比賽時(shí)間】數(shù)據(jù)保存
- display(time/10,time%10,10,0); //顯示設(shè)置比賽時(shí)間
- }
- }
- //選手按鍵
- qiangda_num=qianda();
- if(qiangda_num!=0) //判斷是否有選手按下按鍵
- {
- if(zhu_f!=2&&qiang_f==0&&wan_f==0)//如果還沒(méi)有開(kāi)始搶答時(shí)按下
- {
- zhu_f=1;
- buzz=0; //蜂鳴器報(bào)警
- qiang_f=1; //搶答犯規(guī)標(biāo)記
- number=qiangda_num;
- led_kongzhi(number,1,0);
- }
- else
- if(zhu_f==2&&wan_f==0) //在開(kāi)始搶答時(shí)按下
- {
- wan_f=1; //標(biāo)記搶答完成
- zhu_f=0; //主持人標(biāo)記復(fù)位
- TR0=0; //關(guān)閉倒計(jì)時(shí)定時(shí)器
- number=qiangda_num;
- led_kongzhi(number,1,0);
- bajing(); //提示有人搶答完成
- }
- }
- }
- /*********************************************************
- 函數(shù)名稱:void main()
- 函數(shù)作用:主函數(shù)函數(shù)
- 參數(shù)說(shuō)明:
- *********************************************************/
- void main()
- {
- uchar i=0;
- T0_init(); //定時(shí)器初始化
- if(key_jian==0)
- {
- delayms(100);
- if(key_jian==0)
- {
- EEPROM_delete(0x2000); //擦除EEPROM煽區(qū)
- EEPROM_write(0x2000,30); //寫(xiě)入【比賽時(shí)間】數(shù)據(jù)保存
- }
- }
- time=EEPROM_read(0x2000); //讀取存儲(chǔ)的【比賽時(shí)間】數(shù)據(jù)
- for(i=0;i<9;i++)
- {
- led_kongzhi(i,1,1);
- delayms(10);
- }
- for(i=9;i>0;i--)
- {
- led_kongzhi(i-1,0,1);
- delayms(10);
- }
- led_kongzhi(0,0,0);
- while(1) //死循環(huán)
- {
- scan(); //按鍵檢測(cè)處理
- if(zhu_f==0&&wan_f==0) //判斷是否還沒(méi)進(jìn)入比賽階段
- display(10,10,10,10); //未進(jìn)入,顯示"----"
- else
- if(zhu_f==0&&wan_f==1) //進(jìn)入比賽階段,并且處于設(shè)置比賽時(shí)間
- display(time/10,time%10,10,number);//顯示設(shè)置比賽時(shí)間
- else
- if(zhu_f!=0)
- {
- if(qiang_f==1) //設(shè)有人犯規(guī)
- display(11,11,10,number); //顯示FF-犯規(guī)編號(hào)
- else
- display(time/10,time%10,10,number);//顯示比賽剩余時(shí)間和搶答者編號(hào),未搶答顯示0
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載(仿真PCB與代碼):
八人搶答器51hei設(shè)計(jì).zip
(1.14 MB, 下載次數(shù): 190)
2021-1-4 09:00 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|