資源簡介
基于stc89c52單片機的8位搶答器設計的源程序,??以單片機為核心,設計一個8位競賽搶答器:同時供8名選手或8個代表隊比賽,分別用8個按鈕S0~S7表示。?
???設置一個系統清除和搶答控制開關S,開關由主持人控制。?
?搶答器具有鎖存與顯示功能。即選手按按鈕,鎖存相應的編號,并在優先搶答選手的編號一直保持到主持人將系統清除為止。?
???搶答器具有定時搶答功能,且一次搶答的時間由主持人設定(如30秒)。?
當主持人啟動“開始”鍵后,定時器進行減計時,同時揚聲器發出短暫的聲響,聲響持續的時間為0.5s左右。?
???參賽選手在設定的時間內進行搶答,搶答有效,定時器停止工作,顯示器上顯示選手的編號和搶答的時間,并保持到主持人將系統清除為止。?
???如果定時時間已到,無人搶答,本次搶答無效,系統報警并禁止搶答,定時顯示器上顯示00。
代碼片段和文件信息
#include
typedef?unsigned?char?uchar;
typedef?unsigned?int?uint;
sbit?K0=P3^0;//開始搶答按鍵
sbit?beep=P3^7;//蜂鳴器
sbit?D0=P3^1;//指示燈
sbit?K1=P1^0;//1號選手搶答按鍵
sbit?K2=P1^1;//2號選手搶答按鍵
sbit?K3=P1^2;//3號選手搶答按鍵
sbit?K4=P1^3;//4號選手搶答按鍵
sbit?K5=P1^4;//5號選手搶答按鍵
sbit?K6=P1^5;//6號選手搶答按鍵
sbit?K7=P1^6;//7號選手搶答按鍵
sbit?K8=P1^7;//8號選手搶答按鍵
sbit?S1=P3^2;//答題計時鍵
sbit?S2=P3^3;//開始搶答時間調整鍵
sbit?S3=P3^4;//答題計時時間調整鍵
char?s;
uchar?num=0;
char?time1;//搶答時間
char?time2;//答題限時時間
uint?mn;//T0T1定時器定一秒時
bit?flag1flag2flag3flag4; //標志位
bit?aabb;//時間調整標志位
//延時子函數
void?delay(uint?z)
{
uint?xy;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
uchar?code?table1[]={
//共陰數碼管段碼值
????0x3f0x060x5b0x4f
0x660x6d0x7d0x07
0x7f0x6f0x770x7c
0x390x5e0x790x71
};
uchar?code?table2[]={
//共陰數碼管位碼值
0xfe0xfd
0xfb0xf7
};
//初始化子函數
void?init()
{
TMOD=0x11;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
TH1=(65536-2000)/256;
TL1=(65536-2000)%256;
ET0=1;
ET1=1;
EA=1;
P0=0x00;
time1=10;
time2=10;
flag2=1;
}
//開始鍵掃描子函數
void?key1()
{
uchar?i=100;
if(K0==0)
{
delay(10);
if(K0==0)
{
while(K0==0&&i)
{
i--;
delay(10);
}
TR0=1;
s=time1;
m=0;
flag1=1;
flag2=1;
flag3=1;
num=0;
beep=1;
D0=1;
flag4=0; //清除違規標志位
aa=0;
bb=0;
}
}
}
//選手搶答按鍵掃描子函數
void?key()
{
??? uchar?i=100;
if(K1==0)
{
delay(10);
if(K1==0)
{
while(K1==0&&i)
{
i--;
delay(10);
}
num=1; //數碼管顯示1號“1“
TR0=0; //關閉定時器0時間停止
TR1=1; //打開定時器1使揚聲器響一聲
flag2=0; //關閉開始鍵標志位使再按其他七個鍵不會響應
}
}
if(K2==0) //下面七個鍵的處理同上
{
delay(10);
if(K2==0)
{
while(K2==0&&i)
{
i--;
delay(10);
}
num=2;
TR0=0;
TR1=1;
flag2=0; //重要
}
}
if(K3==0)
{
delay(10);
if(K3==0)
{
while(K3==0&&i)
{
i--;
delay(10);
}
num=3;
TR0=0;
TR1=1;
flag2=0;
}
}
if(K4==0)
{
delay(10);
if(K4==0)
{
while(K4==0&&i)
{
i--;
delay(10);
}
num=4;
TR0=0;
TR1=1;
flag2=0;
}
}
if(K5==0)
{
delay(10);
if(K5==0)
{
while(K5==0&&i)
{
i--;
delay(10);
}
num=5;
TR0=0;
TR1=1;
flag2=0;
}
}
if(K6==0)
{
delay(10);
if(K6==0)
{
while(K6==0&&i)
{
i--;
delay(10);
}
num=6;
TR0=0;
TR1=1;
flag2=0;
}
}
if(K7==0)
{
delay(10);
if(K7==0)
{
while(K7==0&&i)
{
i--;
delay(10);
}
num=7;
TR0=0;
TR1=1;
flag2=0;
}
}
if(K8==0)
{
delay(10);
if(K8==0)
{
while(K8==0&&i)
{
i--;
delay(10);
}
num=8;
TR0=0;
TR1=1;
flag2=0;
}
}
}
//數碼管顯示子函數
void?display()
{
if(flag1==1) //開始鍵按下開始計時搶答
{
if(num!=0) //如果有人搶答則顯示相應的幾號
{
P0=table1[num]; //顯示幾號搶到了
P2=t
- 上一篇:基于51單片機指紋解鎖設計程序
- 下一篇:爬取一個用戶的所有微博
評論
共有 條評論