0.png (37.94 KB, 下載次數: 78)
下載附件
2016-10-8 22:54 上傳
0.png (52.38 KB, 下載次數: 79)
下載附件
2016-10-8 22:54 上傳
所有資料下載:
51智能8路搶答器.zip
(109.62 KB, 下載次數: 2671)
2016-10-8 17:50 上傳
點擊文件名下載附件
包括原理圖跟源程序 下載積分: 黑幣 -5
源程序:
- /****************************************************************
- ******以單片機為核心,設計一個8位競賽搶*******
- ******答器:同時供8名選手或8個代表隊*************
- ******比賽,分別用8個按鈕S0~S7表示。*************
- ******設置一個系統清除和搶答控制開關************
- ******S,開關由主持人控制。搶答器具有***********
- ******鎖存與顯示功能。即選手按按鈕,************
- ******鎖存相應的編號,并在優先搶答選************
- ******手的編號一直保持到主持人將系統************
- ******清除為止。
- ******搶答器具有定時搶答功能,且一次************
- ******搶答的時間由主持人設定(如30秒)**********
- ******。
- ******當主持人啟動“開始”鍵后,定時************
- ******器進行減計時,同時揚聲器發出短************
- ******暫的聲響,聲響持續的時間為0.5s左************
- ******右。
- ******參賽選手在設定的時間內進行搶答************
- ******,搶答有效,定時器停止工作,顯************
- ******示器上顯示選手的編號和搶答的時間*********
- ******,并保持到主持人將系統清除為止。*********
- ******如果定時時間已到,無人搶答,本次*********
- ******搶答無效,系統報警并禁止搶答,定*********
- ******時顯示器上顯示00。*********************************
- ******************************************************************/
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code Tab0[]= //用于74HC595掃描的數組
- {
- 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
- };
- unsigned char code LED_DATE [] = //共陽數碼管的編碼
- {
- 0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90
- };
- sbit Set_Rest =P3^0; //主持人設置時間和復位按鍵
- sbit Start_Jia =P3^1; //主持人開始和調整時間按鍵
- sbit S1 =P2^0; // 1號選手按鍵
- sbit S2 =P2^1; // 2號選手按鍵
- sbit S3 =P2^2; // 3號選手按鍵
- sbit S4 =P2^3; // 4號選手按鍵
- sbit S5 =P2^4; // 5號選手按鍵
- sbit S6 =P2^5; // 6號選手按鍵
- sbit S7 =P2^6; // 7號選手按鍵
- sbit S8 =P2^7; // 8號選手按鍵
- sbit BUZZ =P3^2;
- sbit DS =P1^5; //74HC595 I/O
- sbit SHCP =P1^6;
- sbit STCP =P1^7;
- uint Time_Alarm=500; //搶答時間,默認定時500ms
- uchar Player=0; //選手號碼
- bit K1_bit=0; //K1標志位
- bit Start_bit=0; //開始標志位
- bit Set_bit=0; //設置標志位
- uchar Set0=0; //用于設置時間時顯示閃爍控制
- bit Set1=0; //用于設置時間時顯示閃爍控制
- void Delay_ms(uint xms); //延時
- void HC595(uchar Value); //74HC595驅動函數
- void Display(); //顯示函數
- void Init();
- void KEY1();
- void KEY2(); //開始/加時間鍵函數
- void Player_KEY(); //選手搶答按鍵
- void main()
- {
- Init();
- while(1)
- {
- KEY1();
- KEY2();
- Player_KEY();
- Display();
- }
- }
- void Player_KEY() //選手搶答按鍵
- {
- if(Start_bit==1)
- {
- if(S1==0)
- {
- Delay_ms(10);
- if(S1==0)
- {
- Player=1;
- Start_bit=0;
- TR0=0;
- while(!S1);
- }
- }
- if(S2==0)
- {
- Delay_ms(10);
- if(S2==0)
- {
- Player=2;
- Start_bit=0;
- TR0=0;
- while(!S2);
- }
- }
- if(S3==0)
- {
- Delay_ms(10);
- if(S3==0)
- {
- Player=3;
- Start_bit=0;
- TR0=0;
- while(!S3);
- }
- }
- if(S4==0)
- {
- Delay_ms(10);
- if(S4==0)
- {
- Player=4;
- Start_bit=0;
- TR0=0;
- while(!S4);
- }
- }
- if(S5==0)
- {
- Delay_ms(10);
- if(S5==0)
- {
- Player=5;
- Start_bit=0;
- TR0=0;
- while(!S5);
- }
- }
- if(S6==0)
- {
- Delay_ms(10);
- if(S6==0)
- {
- Player=6;
- Start_bit=0;
- TR0=0;
- while(!S6);
- }
- }
- if(S7==0)
- {
- Delay_ms(10);
- if(S7==0)
- {
- Player=7;
- Start_bit=0;
- TR0=0;
- while(!S7);
- }
- }
- if(S8==0)
- {
- Delay_ms(10);
- if(S8==0)
- {
- Player=8;
- Start_bit=0;
- TR0=0;
- while(!S8);
- }
- }
-
- }
- }
- void KEY2() //開始/加時間鍵函數
- {
- if(Start_Jia==0)
- {
- Delay_ms(10);
- if(Start_Jia==0)
- {
- if(Set_bit==0)
- {
- if(Time_Alarm==0) //判斷是否搶答結束
- {
- TR0=0;
- Time_Alarm=0;
- }
- else
- {
- TR0=~TR0;
- Start_bit=~Start_bit;
- }
- }
- else
- {
- Time_Alarm=(Time_Alarm+250);
- if(Time_Alarm>1500)
- {
- Time_Alarm=500;
- }
- }
- while(!Start_Jia);
- }
- }
- }
- void KEY1()
- {
- if(Set_Rest==0)
- {
- Delay_ms(100);
- if(Set_Rest==0)
- {
- Delay_ms(500); //判斷長按還是短按
- if(Set_Rest==0)
- {
- Time_Alarm=500;
- TR0=0;
- TR1=0;
- Set_bit=0;
- Player=0;
- Start_bit=0;
- BUZZ=1;
- while(!Set_Rest);
- }
- else
- {
- if(Start_bit==0) //判斷是否開始
- {
- Set_bit=~Set_bit;
- TR1=~TR1;
- }
- }
- }
- }
- }
- void Time_0() interrupt 1
- {
- TH0=0xfc; //定時器0定時1毫秒
- TL0=0x18;
- Time_Alarm--;
- if(Time_Alarm<=0)
- {
- TR0=0;
- Start_bit=0;
- BUZZ=0;
- }
- }
- void Time_1() interrupt 3
- {
- TH1=0x3c; //定時器1定時50ms
- TL1=0xb0;
- Set0++;
- if(Set0==10)
- {
- Set0=0;
- Set1=~Set1;
- }
- }
- void Display() //顯示函數
- {
- uchar i=0;
- for(i=0;i<3;i++) //選手編號數碼管前三位顯示0
- {
- P0=LED_DATE[0]; //送段數據
- HC595(Tab0[i]); //送位數據
- Delay_ms(5); //延時
- P0=0XFF; //消隱
- }
- P0=LED_DATE[Player]; //數碼管第4位顯示選手編號,送段數據
- HC595(Tab0[3]); //送位數據
- Delay_ms(5); //延時
- P0=0XFF; //消隱
- if(Set_bit==0)
- {
- P0=LED_DATE[Time_Alarm/1000]; //顯示定時時間千位
- HC595(Tab0[4]); //送位數據
- Delay_ms(5); //延時
- P0=0XFF; //消隱
- P0=LED_DATE[Time_Alarm%1000/100]; //顯示定時時間百位
- HC595(Tab0[5]); //送位數據
- Delay_ms(5); //延時
- P0=0XFF; //消隱
- P0=LED_DATE[Time_Alarm%100/10]; //顯示定時時間十位
- HC595(Tab0[6]); //送位數據
- Delay_ms(5); //延時
- P0=0XFF; //消隱
- P0=LED_DATE[Time_Alarm%10]; //顯示定時時間個位
- HC595(Tab0[7]); //送位數據
- Delay_ms(5); //延時
- P0=0XFF; //消隱
- }
- if(Set_bit==1)
- {
- if(Set1==1)
- {
- P0=LED_DATE[Time_Alarm/1000]; //顯示定時時間千位
- HC595(Tab0[4]); //送位數據
- Delay_ms(5); //延時
- P0=0XFF; //消隱
- P0=LED_DATE[Time_Alarm%1000/100]; //顯示定時時間百位
- HC595(Tab0[5]); //送位數據
- Delay_ms(5); //延時
- P0=0XFF; //消隱
- P0=LED_DATE[Time_Alarm%100/10]; //顯示定時時間十位
- HC595(Tab0[6]); //送位數據
- Delay_ms(5); //延時
- P0=0XFF; //消隱
- P0=LED_DATE[Time_Alarm%10]; //顯示定時時間個位
- HC595(Tab0[7]); //送位數據
- Delay_ms(5); //延時
- P0=0XFF; //消隱
- }
- else
- {
- P0=0xff; //顯示定時時間千位
- HC595(Tab0[4]); //送位數據
- Delay_ms(5); //延時
- P0=0XFF; //消隱
- P0=0xff; //顯示定時時間百位
- HC595(Tab0[5]); //送位數據
- Delay_ms(5); //延時
- P0=0XFF; //消隱
- P0=0xff; //顯示定時時間十位
- HC595(Tab0[6]); //送位數據
- Delay_ms(5); //延時
- P0=0XFF; //消隱
- P0=0xff; //顯示定時時間個位
- HC595(Tab0[7]); //送位數據
- Delay_ms(5); //延時
- P0=0XFF; //消隱
- }
- }
- }
- void Init()
- {
- EA=1;
- TMOD=0X11;
- TH0=0xfc; //定時器0定時1毫秒
- TL0=0x18;
- ET0=1;
- TH1=0x3c; //定時器1定時50ms
- TL1=0xb0;
- ET1=1;
- TR1=0;
- }
- void HC595(uchar Value)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- DS=Value&0x80; //取數據高位
- if(DS==0x80)
- DS=1;
- else
- DS=0;
- SHCP=0; //發生一個高脈沖,數據移入寄存器
- SHCP=1;
- Value<<=1; //左移8次,取出數據的值
- }
- STCP=0;
- STCP=1; //數據移入鎖存器
- }
- void Delay_ms(uint xms) //延時
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
復制代碼
|