|
一、四鍵設(shè)計(jì)功能1、程序開始當(dāng)按下開始搶答按鈕后,數(shù)碼管顯示搶答倒計(jì)時(shí)。在該時(shí)間內(nèi)八路搶答按下有效,若超出搶答時(shí)間蜂鳴器發(fā)出搶答失敗警報(bào)預(yù)示該次搶答失敗。若有效時(shí)間內(nèi)有人搶答則1位數(shù)碼管顯示搶答選手號(hào),二位數(shù)碼管顯示答題倒計(jì)時(shí)。在答題有效時(shí)間內(nèi)答題完成則搶答成功,若超過答題時(shí)間,蜂鳴器給出答題超時(shí)警報(bào),答題失敗。2、在開始搶答的過程中可按下結(jié)束搶答來中斷此次搶答。直接結(jié)束搶答后數(shù)碼管均顯示0.等待下次搶答開始。3、在開始搶答時(shí),可以不使用開始搶答按鈕而按下隨機(jī)抽擊選手答題按鈕來隨機(jī)抽取一位選手答題。該按鈕按下后1位數(shù)碼管顯示隨機(jī)選手號(hào),二位數(shù)碼管顯示答題倒計(jì)時(shí),若時(shí)間超時(shí),蜂鳴器給出警報(bào)。若有效時(shí)間內(nèi)答題,則答題成功。4、在隨機(jī)抽取選手答題中,可以按下結(jié)束隨機(jī)抽取選手答題按鈕來結(jié)束隨機(jī)抽取答題。結(jié)束后數(shù)碼管均顯示0.等待下次搶答開始。二、兩鍵設(shè)計(jì)功能1、程序開始當(dāng)按下開始搶答按鈕后,數(shù)碼管顯示搶答倒計(jì)時(shí)。在該時(shí)間內(nèi)八路搶答按下有效,若超出搶答時(shí)間蜂鳴器發(fā)出搶答失敗警報(bào)預(yù)示該次搶答失敗。若有效時(shí)間內(nèi)有人搶答則1位數(shù)碼管顯示搶答選手號(hào),二位數(shù)碼管顯示答題倒計(jì)時(shí)。在答題有效時(shí)間內(nèi)答題完成則搶答成功,若超過答題時(shí)間,蜂鳴器給出答題超時(shí)警報(bào),答題失敗。2、在開始搶答的過程中可按下結(jié)束搶答來中斷此次搶答。直接結(jié)束搶答后數(shù)碼管均顯示0.等待下次搶答開始。
P0^0; //二位數(shù)碼管第一位選擇腳sbit DG2 = P0^1; //二位數(shù)碼管第二位選擇腳sbit DG3 = P0^3;//P2端口 數(shù)碼管段選//P1端口 八位選手搶答sbit start_qd_pin = P3^7;//開始搶答按鈕連接管腳sbit end_qd_pin = P3^5; //結(jié)束搶答按鈕連接管腳sbit start_srand_qd_pin = P3^4;//開始隨機(jī)抽取選手按鈕連接管腳sbit end_srand_qd_pin = P3^6;//結(jié)束隨機(jī)抽取選手按鈕連接管腳sbit beep=P3^3;//蜂鳴器連接管腳unsigned char weixuan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數(shù)碼管段碼:0123456789unsigned char qd_num=0; //搶答選手號(hào)unsigned char qd_time=0; //搶答倒計(jì)時(shí)間unsigned char timeout_num=0; //定時(shí)器產(chǎn)生中斷次數(shù)unsigned char work_status = 0; //工作狀態(tài),下面幾個(gè)為工作狀態(tài)定義的宏#define START_QD_STATUS 0#define WAIT_QD_STATUS 1#define ACK_QD_STATUS 2#define ACK_SRAND_QD_STATUS 3/*------延時(shí)2ms函數(shù)------*/void delay2ms(void) //誤差 0us{ unsigned char a,b; for(b=4;b>0;b--) for(a=248;a>0;a--); _nop_(); //if Keil,require use intrins.h}/*------延時(shí)50ms函數(shù),參數(shù)num為延時(shí)多少個(gè)50ms------*/void delay50ms(unsigned int num) //誤差 0us{ unsigned char a,b; unsigned char i=0; for(i=0; i<num; i++) { for(b=173;b>0;b--) for(a=143;a>0;a--); }}/*---初始化定時(shí)器0---*/void InitTimer0(void)//50ms{ TMOD = 0x01;//定時(shí)器工作模式1 TH0 = 0x3C; //定時(shí)器裝值高8位 TL0 = 0x0B0;//定時(shí)器裝值低8位 EA = 1; //使能總中斷 ET0 = 1; //使能定時(shí)器0中斷 TR0 = 1; //啟動(dòng)定時(shí)器}/*------關(guān)閉定時(shí)器0------*/void end_Timer0(void){ ET0 = 0;//關(guān)閉定時(shí)器0中斷 TR0 = 0;//停止定時(shí)器0}/*----初始化函數(shù)-----*/void init(void){ DG1 = 0; DG2 = 0; DG3 = 0; beep = 0;//上電時(shí)由于該腳為高,而為高時(shí)蜂鳴器會(huì)叫,故初始化為低}/*----------等待開始搶答狀態(tài)該狀態(tài)下一直等待按下開始搶答按鈕或隨機(jī)搶答按鈕,再進(jìn)入相應(yīng)的工作狀態(tài)!這種狀態(tài)機(jī)的編程方式是當(dāng)前單片機(jī)開發(fā)者的主流思想。---------*/void start_qd_status(void){ if(start_qd_pin == 0)//檢測(cè)到開始搶答按鈕按下 { work_status = WAIT_QD_STATUS;//工作狀態(tài)設(shè)置為等待答題狀態(tài) qd_num = 0; //回答選手號(hào)為0,等待選手按下 qd_time = 20; //20s搶答時(shí)間 timeout_num=0; //中斷次數(shù)清0 InitTimer0(); //開啟定時(shí)器0 } if(start_srand_qd_pin == 0)//檢測(cè)到隨機(jī)抽取選手答題按鈕按下 { work_status = ACK_SRAND_QD_STATUS;//工作狀態(tài)設(shè)置為隨機(jī)選手回答狀態(tài) srand(TL0%100); //產(chǎn)生隨機(jī)數(shù)種子,srand和rand函數(shù)有興趣可以百度一下單片機(jī)產(chǎn)生隨機(jī)數(shù)方法! qd_num = (rand()%9);//0-8, 產(chǎn)生隨機(jī)數(shù) if(qd_num == 0) //防止產(chǎn)生隨機(jī)數(shù)0 qd_num = (rand()%9); //再次產(chǎn)生隨機(jī)數(shù) qd_time = 30; //30s答題時(shí)間 timeout_num=0; //中斷次數(shù)清0 InitTimer0(); //開始定時(shí)器0 }}/*-------開始按鈕按下后,等待選手搶答狀態(tài)函數(shù)------*/void wait_qd_status(void){ unsigned char i = 0; if(qd_time == 0)//無人搶答,搶答時(shí)間已到 { end_Timer0();//停止定時(shí)器0 //蜂鳴器給出無人搶答警報(bào) beep = 1; //蜂鳴器響 delay50ms(40); beep = 0; work_status = START_QD_STATUS;//無人搶答后恢復(fù)原始狀態(tài),設(shè)置工作狀態(tài)為開始搶答狀態(tài) } if(end_qd_pin == 0)//檢測(cè)到結(jié)束按鍵 { end_Timer0();//停止定時(shí)器0 qd_num = 0;//回答選手號(hào)為0 qd_time = 0;//搶答時(shí)間清0 work_status = START_QD_STATUS;//工作狀態(tài)置開始搶答狀態(tài) } switch(P1)//檢測(cè)哪位選手按下?lián)尨鸢粹o { case 0xfe://1號(hào) qd_num = 1;//回答選手號(hào)為1 qd_time = 30; timeout_num=0; InitTimer0(); work_status = ACK_QD_STATUS; break; case 0xfd://2號(hào) qd_num = 2;//回答選手號(hào)為2 qd_time = 30; timeout_num=0; InitTimer0(); work_status = ACK_QD_STATUS; break; case 0xfb://3號(hào) qd_num = 3;//回答選手號(hào)為3 qd_time = 30; timeout_num=0; InitTimer0(); work_status = ACK_QD_STATUS; break; case 0xf7://4號(hào) qd_num = 4;//回答選手號(hào)為4 qd_time = 30; timeout_num=0; InitTimer0(); work_status = ACK_QD_STATUS; break; case 0xef://5號(hào) qd_num = 5;//回答選手號(hào)為5 qd_time = 30; timeout_num=0; InitTimer0(); work_status = ACK_QD_STATUS; break; case 0xdf://6號(hào) qd_num = 6;//回答選手號(hào)為6 qd_time = 30; timeout_num=0; InitTimer0(); work_status = ACK_QD_STATUS; break; case 0xbf://7號(hào) qd_num = 7;//回答選手號(hào)為7 qd_time = 30; timeout_num=0; InitTimer0(); work_status = ACK_QD_STATUS; break; case 0x7f://8號(hào) qd_num = 8;//回答選手號(hào)為8 qd_time = 30; timeout_num=0; InitTimer0(); work_status = ACK_QD_STATUS; break; default: break; }}/*------選手回答問題狀態(tài)------*/void ack_qd_status(){ unsigned char i = 0; if(qd_time == 0)//答題超時(shí) { end_Timer0();//結(jié)束定時(shí)器0 qd_num = 0; qd_time = 0; for(i=0;i<3;i++)//選手回答問題超時(shí)警報(bào) { beep = 1; delay50ms(5); beep = 0; delay50ms(5); } work_status = START_QD_STATUS;//設(shè)置工作狀態(tài)為開始搶答狀態(tài) } if(end_qd_pin == 0)//結(jié)束按鍵按下 { end_Timer0();//結(jié)束定時(shí)器0 qd_num = 0; qd_time = 0; work_status = START_QD_STATUS;//設(shè)置工作狀態(tài)為開始搶答狀態(tài) }}/*-------隨機(jī)選手回答狀態(tài)-------*/void ack_srand_status(){ unsigned char i = 0; if(qd_time == 0)//答題超時(shí) { end_Timer0();//結(jié)束定時(shí)器0 qd_num = 0; qd_time = 0; for(i=0;i<3;i++)//隨機(jī)選手回答問題超時(shí)警報(bào) { beep = 1; delay50ms(5); beep = 0; delay50ms(5); } work_status = START_QD_STATUS; } if(end_srand_qd_pin == 0)//結(jié)束按鍵 { end_Timer0();//結(jié)束定時(shí)器0 qd_num = 0; //選手號(hào)清0 qd_time = 0;//時(shí)間清0 work_status = START_QD_STATUS;//設(shè)置工作
|
|