系統(tǒng)能實(shí)現(xiàn)的功能:
本系統(tǒng)搶答器能實(shí)現(xiàn)如下功能:
?、佟⒂芍鞒秩丝刂拼痤}開始,通過一個總的控制按鈕,并且蜂鳴器 發(fā)聲提示。再次按下時可以對單片機(jī)進(jìn)行復(fù)位。
?、?、同時主持人按鈕控制著30S的搶答倒計(jì)時,當(dāng)時間到仍沒有人搶答時,蜂鳴器發(fā)聲報(bào)警,同時屏幕顯示無人搶答,等待主持人按鍵復(fù)位,進(jìn)行下一輪搶答 ③、當(dāng)有一個搶答按鈕被按下后,單片機(jī)進(jìn)行鎖存,屏蔽其他選手號,此時蜂鳴器報(bào)警提示,并進(jìn)入答題倒計(jì)時30S,若超時,則蜂鳴器報(bào)警,屏幕顯示答題超時,此時等待主持人復(fù)位。
六、主要程序
/*======================================================= 主函數(shù)
=======================================================*/ void main(void) {
system_init();//系統(tǒng)初始化 // IP = 0x20; while(1) {
seg_change();//轉(zhuǎn)換顯示的內(nèi)容 key_handle();//鍵盤處理函數(shù) switch(SPK_Flag) {
case SPK_NO: break;
case SPK_MUSIC: SpkMusic(); break; //播放音樂1 case SPK_ALARM: SpkAlarm(); break; } } }
/*======================================================= 系統(tǒng)初始化函數(shù)
=======================================================*/ void system_init(void) {
//定時器0 初始化 定時時間2ms TMOD = 0x01;
TH0 = 0x3c; //50微妙 TL0 = 0xb0;
EA = 1;
ET0 = 1; TR0 = 1;
SEG_RAM[0]=SEG_no; //這位不顯示 有人搶答時,s顯示搶答選手號 或則 無人搶答時 顯示 F
SEG_RAM[1]=SEG_no; SEG_RAM[2]=SEG_no; SEG_RAM[3]=SEG_no;
SEG_RAM[4]=SEG_no;//初始化記分器分?jǐn)?shù) SEG_RAM[5]=SEG_no; SEG_RAM[6]=SEG_no;
SEG_RAM[7]=SEG_0;//始終顯示0 }
/*======================================================= 鍵盤掃描函數(shù)
=======================================================*/ unsigned char key_scan(void) {
unsigned char keyvalue=NO_KEY; if(KEY_PORT != 0xff) {
delay();delay();delay();delay(); delay();delay();delay();delay(); delay();delay();delay();delay(); delay();delay();delay();delay(); switch (KEY_PORT) {
case 0xff: break;//無鍵按下 case 0xfe: keyvalue = PLAYER_1; break; case 0xfd: keyvalue = PLAYER_5; break; case 0xfb: keyvalue = PLAYER_2; break; case 0xf7: keyvalue = RST_KEY; break; case 0xef: keyvalue = PLAYER_3; break; case 0xdf: keyvalue = ADD_KEY; break; case 0xbf: keyvalue = PLAYER_4; break; case 0x7f: keyvalue = UP_KEY; break; }
while(KEY_PORT != 0xff);//松手檢測 }
return (keyvalue);
}
/*======================================================= 鍵盤處理函數(shù)
=======================================================*/ void key_handle(void) {
unsigned char keytemp; keytemp = key_scan(); switch(keytemp) {
case NO_KEY: break;
case PLAYER_1: case PLAYER_2: case PLAYER_3: case PLAYER_4: case PLAYER_5:
if(QD_Flag==QD_GO) {
QD_Flag = QD_OK; //切換到搶答成功狀態(tài) SEG_RAM[0] = table_duan[keytemp+1]; //第一個數(shù)碼管顯示搶答選手號
QD_show_num = keytemp;
SPK_Flag = SPK_MUSIC; //蜂鳴器 播放音樂 }
break; case RST_KEY:
QD_Flag = QD_GO; SPK_Flag = SPK_NO; QD_timectr=100;
SEG_RAM[0] = SEG_no; break; case ADD_KEY:
JFQ_ctr[QD_show_num]++; //對應(yīng)選手 記分器 加分 break; case UP_KEY:
QD_show_num++;
if(QD_show_num==5)QD_show_num=0;
SEG_RAM[0] = table_duan[QD_show_num+1];
break; } }
/*======================================================= 定時器0中斷服務(wù)程序
=======================================================*/ void Timer0_ISR(void) interrupt 1 {
static unsigned char t0_2ms_counter = 0,tt; //50毫秒計(jì)數(shù)器 ET2=0;
TL0 = 0x30; //2ms TH0 = 0xf8;
t0_2ms_counter++;
seg_display(); //2毫秒 掃描數(shù)碼管 if(t0_2ms_counter==250) //500ms / 2ms = 250 { //0.5s到 if(QD_timectr==0)
{ //搶答時間到,無人搶答,切換到搶答失敗狀態(tài) QD_Flag = QD_NO;
tt++;
if(tt==1)SPK_Flag = SPK_ALARM; //蜂鳴器 播放報(bào)警音 else SPK_Flag = SPK_NO; }
if(QD_Flag==QD_GO) QD_timectr-=5; //在搶答倒計(jì)時期間 倒計(jì)時減0.5
}
ET2=1; }
/*======================================================= 數(shù)碼管顯示函數(shù)
=======================================================*/ void seg_display(void) {
static unsigned char i=0; LED_WEI = table_wei[i]; LED_DUAN = SEG_RAM[i]; i++;
if(i》7) i=0; }
/*======================================================= 數(shù)碼管顯示轉(zhuǎn)換函數(shù)
=======================================================*/ void seg_change(void) {
if (QD_timectr《100) //取值為0~100
SEG_RAM[1]= SEG_no; //最高位為0則不顯示 else
SEG_RAM[1]= SEG_1; //最高位顯示1 SEG_RAM[2] = table_duandot[QD_timectr%100/10]; SEG_RAM[3] = table_duan[QD_timectr%10];
if(QD_Flag==2) SEG_RAM[0] = SEG_F; //顯示‘F’ 無人搶答 if(JFQ_ctr[QD_show_num]》=100) {
SEG_RAM[4]=table_duan[JFQ_ctr[QD_show_num]/100];
SEG_RAM[5]=table_duan[JFQ_ctr[QD_show_num]%100/10]; SEG_RAM[6]=table_duan[JFQ_ctr[QD_show_num]%10]; }
else if (JFQ_ctr[QD_show_num]《100 && JFQ_ctr[QD_show_num]》=10) {
SEG_RAM[4]=SEG_no;//不顯示0
SEG_RAM[5]=table_duan[JFQ_ctr[QD_show_num]%100/10]; SEG_RAM[6]=table_duan[JFQ_ctr[QD_show_num]%10]; }
else if (JFQ_ctr[QD_show_num]《10 && JFQ_ctr[QD_show_num]》0) {
SEG_RAM[4]=SEG_no;//不顯示0 SEG_RAM[5]=SEG_no;//不顯示0
SEG_RAM[6]=table_duan[JFQ_ctr[QD_show_num]%10]; } else {
SEG_RAM[4]=SEG_no;//不顯示0 SEG_RAM[5]=SEG_no;//不顯示0 SEG_RAM[6]=SEG_no;//不顯示0 } }
/*======================================================= 延時函數(shù)(延時1毫秒)
=======================================================*/
void delay(void) //延時1MS {
unsigned char a,b; for(b=102;b》0;b--) for(a=3;a》0;a--); }
/*======================================================== 播放音樂 和 報(bào)警聲音
=======================================================*/ unsigned int g_ucSoundLongCNT; //
/************************************************* * 函數(shù)名稱:void T2Init(void) * 創(chuàng)建日期:2005.6.17
* 功能描述:定時器T2初始化 * 入口參數(shù):uT2Reg:定時器初值 * 返回值: 無 * 修改日志:
*************************************************/ void T2Init(unsigned int uT2Reg) {
CP_RL2=0; //16位自動重載
T2MOD=0x00; //計(jì)數(shù)增加,外部捕獲禁止 RCLK=0; TCLK=0;
TL2=RCAP2L=uT2Reg&0x00ff; TH2=RCAP2H=uT2Reg》》8;
TR2=1; // 啟動定時器 ET2=1; //t2開中斷 EA=1; }
/************************************************* * 函數(shù)名稱:void MusicPlay(uchar ucSL[],uint uST[]) * 創(chuàng)建日期:2005.7.12
* 功能描述:播放某首音樂的函數(shù)
* 入口參數(shù):ucSL[]:音節(jié)長度的數(shù)組;uST[]:音樂頻率的數(shù)組 * 返回值: 無 * 修改日志:
*************************************************/
void MusicPlay(unsigned char ucSL[],unsigned int uST[])
{
unsigned char i=0; //float fTmp=“0”;
while((ucSL[i]!=0)||(uST[i]!=0)) {
//fTmp=(float)11059/(float)12000;
T2Init(0xffff-uST[i]*((float)11059/(float)12000)*4); //11。0592M的晶體 //我添加了*5
g_ucSoundLongCNT=((3*ucSL[i]*75000L)/8)/uST[i]; //*1000我改為 75000
while(g_ucSoundLongCNT!=0); //等待計(jì)數(shù)器為0 TR2=0; //暫時關(guān)閉定時器 i++; }
BUZZER = 1; }
/************************************************* * 函數(shù)名稱:void T2Init(void) * 創(chuàng)建日期:2005.7.11
* 功能描述:用于音樂的音調(diào)半周期定時 * 入口參數(shù):無 * 返回值: 無 * 修改日志:
*************************************************/ void T2ISR(void) interrupt 5 using 1 {
TF2=0; //手動清除溢出標(biāo)志 if(g_ucSoundLongCNT!=0) {
g_ucSoundLongCNT--; }
BUZZER=~BUZZER; }
評論