單片機源程序如下:
/****************************************************************************************
八路搶答器系統
活動規則:
>>>初始狀態:上電時,臺號顯示“00”,倒計時顯示“00”,紅燈和綠燈熄滅。
>>>當主持人按下“開始/清除”鍵時(選手才能搶答),蜂鳴器響一下,臺號顯示“00”,倒計時數碼管顯示“05”,
>>>這時開始準備倒計時5秒,當準備倒計時顯示回到“00”時,然后顯示倒計時30秒開始搶答。
>>>如果倒計時未回到“00”就搶答,這時紅燈閃亮,倒計時數碼管顯示“--",這時禁止任何操作。
>>>這時只有主持人按下“開始/清除”鍵,才能恢復初始狀態。
>>>5秒結束后,等待搶答,綠燈亮起,倒計時顯示“30”后,即開始倒計時,而倒計時最后5S,蜂鳴器會發出滴滴鳴叫聲,
>>>如果30秒內沒人搶答,則此次搶答失敗,重新回到初始狀態。
>>>如果30秒內有人成功搶答,則顯示選手的臺號并亮起對應的燈,蜂鳴器響一下,倒計時顯示“00”,綠燈熄滅。
>>>主持人按下“開始/清除”鍵后,系統回到初始狀態且蜂鳴器響一下,然后重新按一下“開始/清除”鍵進入下一輪搶答。
*****************************************************************************************/
#include
#include "smg.h"
#include "interrupt.h"
#define uchar unsigned char //宏定義
#define uint unsigned int
/************************************引腳定義********************************************/
sbit key_sc=P2^6; //開始/清除鍵(start/clear---sc)
sbit key_1=P1^0; //八位選手按鍵定義
sbit key_2=P1^1;
sbit key_3=P1^2;
sbit key_4=P1^3;
sbit key_5=P1^4;
sbit key_6=P1^5;
sbit key_7=P1^6;
sbit key_8=P1^7;
sbit led_1=P3^0; //八位LED燈按鍵定義
sbit led_2=P3^1;
sbit led_3=P3^2;
sbit led_4=P3^3;
sbit led_5=P3^4;
sbit led_6=P3^5;
sbit led_7=P3^6;
sbit led_8=P3^7;
/************************************變量定義********************************************/
uchar sc_f=0; //比賽進行階段標記位,=0表示沒有按。=1表示準備倒計時階段,=2表示倒計時階段。
uchar qiang_f=0; //搶答犯規標記,=0沒有犯規。=1表示有人犯規
uchar wan_f=0; //搶答完成標記,=0搶答沒完成后還沒有開始。=1表示搶答完成
uchar time; //時間標記
uchar T0_num; //定時器0計數
uchar number; //搶答成功選手的編號,或犯規選手的編號。=0的時候表示沒有
uchar count=0; //計時標記
/********************************************************
函數名稱:void baojing()
函數作用:搶答犯規報警提示
********************************************************/
void baojing()
{
buzz=0; //開蜂鳴器
delayms(10);
buzz=1; //關蜂鳴器
delayms(10);
}
/********************************************************
函數名稱:uchar qianda()
函數作用:搶答按鍵檢測,返回搶答編號
參數說明:
********************************************************/
uchar qianda()
{
uchar temp=0;
if(key_1==0) //一號犯規,下同
temp=1; //記錄1號
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;
}
/********************************************************
函數名稱:void led_kongzhi(uchar num,bit k,bit mode)
函數作用:LED燈控制
參數說明:num控制哪一個燈,k=1,點亮,=0關閉。mode=0全滅后在控制這個燈,=1單獨控制這個燈
********************************************************/
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) //控制對應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) //控制對應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;
}
}
}
/********************************************************
函數名稱:void scan(void)
函數作用:按鍵檢測函數
********************************************************/
void scan(void)
{
uchar qiangda_num=0;
//開始/清除鍵
if(key_sc==0) //按鍵按下
{
delayms(7); //顯示消抖
if(key_sc==0&&sc_f!=2&&qiang_f==0&&wan_f==0)//判斷是否有人犯規或者搶答是否開始或者搶答是否完成
{
sc_f++; //比賽階段標記+1
if(sc_f==1) //比賽準備開始
{
time=5; //準備倒計時時間設為5s
TR0=1; //開啟定時
wan_f=0; //清除比賽完成標志
baojing(); //提示比賽開始
}
}
else
if(key_sc==0&&qiang_f==1) //判斷是否有人犯規
{
buzz=1; //清除報警
qiang_f=0; //清除搶答標志
number=0; //清除選手編號
led_kongzhi(0,0,0); //關閉選手指示燈
}
else
if(key_sc==0&&wan_f==1) //判斷是否有人完成
{
buzz=1; //清除報警
wan_f=0; //清除完成標志
number=0; //清除選手編號
led_kongzhi(0,0,0); //關閉選手指示燈
}
if(key_sc==0&&wan_f==0) //停止比賽
{
TR0=0; //關閉定時
sc_f=0; //重新回到設置比賽時間階段
count=0; //重置計時標記參數
led_red=1; //紅燈熄滅
led_green=1; //綠燈熄滅
baojing(); //提示停止比賽
}
while(!key_sc);//檢測按鍵松開
}
//選手按鍵
qiangda_num=qianda();
if(qiangda_num!=0&&sc_f!=0) //判斷是否有選手按下按鍵且是否開始搶答
{
if(sc_f!=2&&count<5&&qiang_f==0&&wan_f==0)//如果還沒有開始搶答時按下
{
TR0=0; //比賽進行標記復位
count=0; //重置計時標記參數
buzz=0; //蜂鳴器報警
qiang_f=1; //搶答犯規標記
number=qiangda_num; //記錄是哪一個燈
led_kongzhi(number,1,0); //顯示選手按下后對應的燈
led_red=~led_red; //點亮紅燈
}
else
if(sc_f==2&&count>=5&&wan_f==0) //在開始搶答時按下
{
wan_f=1; //標記搶答完成
sc_f=0; //比賽進行標記復位
TR0=0; //關閉倒計時定時器
count=0; //重置計時標記參數
number=qiangda_num; //記錄是哪一個燈
led_kongzhi(number,1,0); //顯示選手按下后對應的燈
led_green=1; //綠燈熄滅
baojing(); //提示有人搶答完成
}
}
}
/*********************************************************
函數名稱:void main()
函數作用:主函數
*********************************************************/
void main()
{
uchar i=0;
T0_init(); //定時器初始化
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) //死循環
{
scan(); //按鍵檢測處理
if(sc_f==0&&wan_f==0) //判斷是否還沒進入比賽階段
{
display(0,0,0,0); //未進入,顯示"0000"
}
else
{
if(sc_f==0&&wan_f==1) //進入比賽階段,并且處于準備比賽時間
display(0,number,time/10,time%10);//顯示比賽時間
else
{
if(qiang_f==1) //設有人犯規
display(0,number,10,10); //顯示犯規臺號和“--”
else
display(0,number,time/10,time%10);//顯示搶答者臺號和比賽剩余時間,未搶答顯示0
}
}
}
}
上一篇:單片機T0方式2實現簡單時鐘
下一篇:單片機控制直流電機程序
推薦閱讀最新更新時間:2025-03-25 02:22







- 熱門資源推薦
- 熱門放大器推薦