|
請(qǐng)各位大佬幫忙看下程序要怎么修改才對(duì),謝謝謝謝!此程序已試過(guò)仿真和實(shí)物,現(xiàn)象顯示不對(duì),蜂鳴器一直響,數(shù)碼管四位一起從0-9閃爍循環(huán)。
具體要求:(1)搶答器同時(shí)供 10 名選手或 10 個(gè)代表隊(duì)比賽。 (2)設(shè)置一個(gè)系統(tǒng)清除和搶答控制開(kāi)關(guān) S,該開(kāi)關(guān)由主持人控制。 (3) 搶答器具有鎖存與顯示功能。即選手按動(dòng)按鈕,鎖存相應(yīng)的編號(hào),并在 LED 數(shù)碼管上顯示,同時(shí) 揚(yáng)聲器發(fā)出報(bào)警聲響提示。選手搶答實(shí)行優(yōu)先鎖存,優(yōu)先搶答選手的編號(hào)一直保持到主持人將系統(tǒng)清除為止。 (4)搶答器具有定時(shí)搶答功能,且一次搶答的時(shí)間由主持人設(shè)定(如 20 秒)。當(dāng)主持人啟動(dòng)"開(kāi)始"鍵后, 定時(shí)器進(jìn)行減計(jì)時(shí),同時(shí)揚(yáng)聲器發(fā)出短暫的聲響,聲響持續(xù)的時(shí)間 0.5 秒左右。 (5)參賽選手在設(shè)定的時(shí)間內(nèi)進(jìn)行搶答,搶答有效,定時(shí)器停止工作,顯示器上顯示選手的編號(hào)和搶 答的時(shí)間,并保持到主持人將系統(tǒng)清除為止。 (6)如果定時(shí)時(shí)間已到,無(wú)人搶答,本次搶答無(wú)效,系統(tǒng)報(bào)警并禁止搶答,定時(shí)顯示器上顯示 00。
原理圖如下:
程序如下:
#include <reg51.h> //包含單片機(jī)寄存器的頭文件
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar LED[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //共陽(yáng)數(shù)碼管:0-9,-
int count,qdtime,num_mark,qdtime1=20;
sbit smg_we1 = P2^0;
sbit smg_we2 = P2^1;
sbit smg_we3 = P2^2;
sbit smg_we4 = P2^3;
//選手相關(guān)區(qū)
sbit LED1=P3^7;
sbit LED2=P3^6;
sbit LED3=P3^5;
sbit LED4=P3^4;
sbit LED5=P3^3;
sbit LED6=P3^2;
sbit LED7=P3^1;
sbit LED8=P3^0;
sbit LED9=P2^6;
sbit LED10=P2^7;//選手搶答“監(jiān)視燈”
sbit S1=P3^7;
sbit S2=P3^6;
sbit S3=P3^5;
sbit S4=P3^4;
sbit S5=P3^3;
sbit S6=P3^2;
sbit S7=P3^1;
sbit S8=P3^0;
sbit S9=P2^6;
sbit S10=P2^7;//選手搶答按鈕
uchar S[]={1,1,1,1,1,1,1,1,1,1};//選手按鈕按下標(biāo)記位,按下后便標(biāo)記為1
//主持人相關(guān)區(qū)
sbit S11=P1^0;//清除
sbit S12=P1^1;//搶答開(kāi)始
sbit S13=P1^2;//加時(shí)間
sbit S14=P1^3;//減時(shí)間
sbit BeepIO= P1^6;
/******************************************
延時(shí)函數(shù)
**********************************************/
void delay10ms() //@12.000MHz
{
unsigned char i, j;
i = 117;
j = 184;
do
{
while (--j);
} while (--i);
}
void delay(uint i)//i微秒延時(shí)
{ while(i--) ;}
/************************************************************
蜂鳴器發(fā)音程序區(qū)
**************************************************************/
void BEEP()//提示音
{ unsigned int i;
for(i=0;i<100;i++)//喇叭發(fā)聲的時(shí)間循環(huán)
{
delay(100); //參數(shù)決定發(fā)聲的頻率,估算值
BeepIO=!BeepIO;
}
BeepIO=1; //喇叭停止工作,間歇的時(shí)間
delay(5000);
}
void BEEP2()//警告音
{ unsigned int i;
for(i=0;i<400;i++)//喇叭發(fā)聲的時(shí)間循環(huán)
{
BeepIO=0;
delay(40); //參數(shù)決定發(fā)聲的頻率,估算值
BeepIO=1;
delay(30);
}
delay(12500);//喇叭停止工作,間歇的時(shí)間
}
void BEEP3()//搶答成功提示音
{ unsigned int i;
for(i=0;i<400;i++)//喇叭發(fā)聲的時(shí)間循環(huán)
{
BeepIO=0;
delay(25); //參數(shù)決定發(fā)聲的頻率
BeepIO=1;
delay(25);
}
delay(20000);//喇叭停止工作,間歇的時(shí)間
}
void shumaxs(int n,uchar m)//數(shù)碼管顯示程序
{ int sj1,sj2,dw1,dw2;
P0=0xff;
P1=0x00;
delay(50);
sj1=n/10;
sj2=n%10;
dw1=m/10;
dw2=m%10;
P0=LED[sj1];smg_we4=1;delay(20);
P0=LED[sj2];smg_we3=1;delay(20);
P0=LED[dw1];smg_we2=1;delay(20);
P0=LED[dw2];smg_we1=1;delay(20);
}
void Timer0_init (void)//T0初始化子函數(shù)
{
TMOD=0x01;//T0設(shè)置為16位定時(shí)方式
TH0=0x3c;
TL0=0xb0;//50ms
ET0=1; //允許T0中斷
EA=1;
// TR0=0; //關(guān)閉定時(shí)開(kāi)關(guān)
}
void timer0() interrupt 1 //倒計(jì)時(shí)
{
TH0=0x3c;
TL0=0xb0;
count++;
if(count==20)
{ count=0;
qdtime--;
}
}
void key1()
{ S[1]=1;S[2]=1;S[3]=1;S[4]=1;S[5]=1;S[6]=1;S[7]=1;S[8]=1;S[9]=1;S[10]=1;//選手按鈕按下標(biāo)記位歸零
if(S12==1)
{ delay10ms();if(S12==1)
{ TR0=1;
{switch(P3&&0xff)
{ case 0x7f: num_mark=1;LED1=0;break;
case 0xbf: num_mark=2;LED2=0;break;
case 0xdf: num_mark=3;LED3=0;break;
case 0xef: num_mark=4;LED4=0;break;
case 0xf7: num_mark=5;LED5=0;break;
case 0xfb: num_mark=6;LED6=0;break;
case 0xfd: num_mark=7;LED7=0;break;
case 0xfe: num_mark=8;LED8=0;break;
}
switch(P2&&0xff)
{ case 0x7f: num_mark=9;LED9=0;break;
case 0xbf: num_mark=10;LED10=0;break;
}
}
if((num_mark!=0)&&(qdtime!=0))
{ TR0=0;
shumaxs(qdtime,LED[num_mark]);
BEEP3();
}//有人搶答成功則結(jié)束搶答
if((qdtime==0)&&(num_mark==0))
{ TR0=0;
shumaxs(0xbf,0xbf);
BEEP2();
}
}
}
}
void key2()
{ if(S11==1)
{delay10ms();if(S11==1) {BeepIO=0;qdtime=0;shumaxs(0xbf,0xc0);}}
if(S12==1)
{delay10ms();if(S12==1) {BEEP();shumaxs(LED[num_mark],qdtime);}}
if(S13==1)
{ delay10ms();
if(S13==1)
{qdtime++;if(qdtime>99) qdtime=0;shumaxs(0xbf,qdtime);}
}
if(S14==1)
{ delay10ms();
if(S13==1)
{qdtime--;if(qdtime>99) qdtime=0;shumaxs(0xbf,qdtime);}
}
}
void main()
{ qdtime=qdtime1;shumaxs(20,0);
Timer0_init();//T0初始化
BeepIO=0;//蜂鳴器不響
TR0=0;
while(1)
{
LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;LED6=1;LED7=1;LED8=1;LED9=1;LED10=1;//監(jiān)視燈初始化為滅
key2();
key1();
}
}
|
|