標(biāo)題:
關(guān)于如何實現(xiàn)單片機(jī)六路搶答器,希望前輩大佬幫忙看看電路圖和程序錯在哪里
[打印本頁]
作者:
gwy666
時間:
2020-4-28 10:51
標(biāo)題:
關(guān)于如何實現(xiàn)單片機(jī)六路搶答器,希望前輩大佬幫忙看看電路圖和程序錯在哪里
`UU~67`V0Z6%}N9LC7{W.png
(22.03 KB, 下載次數(shù): 11)
下載附件
電路圖
2020-4-28 10:47 上傳
要求:
其中主持人操控兩個按鍵。選手共六位,分別操控一個按鍵。當(dāng)主持人按下?lián)尨痖_始按鍵后,倒計時開始,計時5s。此后最先按下按鍵的選手號碼將顯示在數(shù)碼管上。后來按下的將無顯示。若五秒計時結(jié)束后,再按下按鍵也不會顯示。若主持人沒有按開始鍵,就有選手搶答,則視為犯規(guī)。此時犯規(guī)的選手號碼將被顯示于數(shù)碼管上(最多顯示五位犯規(guī)選手)。同時,蜂鳴器發(fā)出長笛聲報警,數(shù)碼管全亮。
單片機(jī)源程序如下:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^0;
sbit wela=P2^1;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07};
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
sbit key5=P1^4;
sbit key6=P1^5;
sbit start=P1^6;
sbit beep=P1^7;
int num=0;
uchar count;
uchar second=5;
//延時子函數(shù)
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
//定時器函數(shù)
void timer()
{
TMOD=0x01;//選定工作方式
TH0=(65536-45872)/256;//裝初值11.0592M晶振定時50ms數(shù)為45872
TL0=(65536-45872)%256;
EA=1;//開總中斷
ET0=1;//開定時器0中斷
}
//定時中斷函數(shù)
void timer0()interrupt 1 using 1
{
TH0=(65536-45872)/256;//裝初值11.0592M晶振定時50ms數(shù)為45872
TL0=(65536-45872)%256;
TR0=1;//啟動定時器0
count++;//計數(shù)一次50ms,20次為1秒
if (count==20)
{
count=0;
if (second>=1)
{
second--;//秒減1
if(second==0)
{
wela=0;
dula=0;
delayms(5);
}
}
}
}
//倒計時顯示函數(shù)
void djsxs()
{
dula=1;
P0=table[second];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
}
//按鍵檢測程序
void keyscan()
{
if(key1==0)
{
dula=1;
P0=0x06;
dula=0;
beep=1;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delayms(5);
}
else if(key2==0)
{
dula=1;
P0=0x5b;
dula=0;
P0=0xff;
wela=1;
P2=0xfd;
wela=0;
delayms(5);
}
else if(key3==0)
{
dula=1;
P0=0x4f;
dula=0;
P0=0xff;
beep=1;
wela=1;
P2=0xfb;
wela=0;
delayms(5);
}
else if(key4==0)
{
dula=1;
P0=0x66;
dula=0;
P0=0xff;
beep=1;
wela=1;
P2=0xf7;
wela=0;
delayms(5);
}
else if(key5==0)
{
dula=1;
P0=0x6d;
dula=0;
P0=0xff;
beep=1;
wela=1;
P2=0xEF;
wela=0;
delayms(5);
}
else if(key6==0)
{
dula=1;
P0=0x7d;
dula=0;
P0=0xff;
beep=1;
wela=1;
P2=0xDF;
wela=0;
delayms(5);
}
}
//主函數(shù)
main()
{
if (start==0)
timer();
djsxs();
{
bit flag=0;//定義flag,方便跳出
while(!flag)
if(key1==0)//如果一號選手按下?lián)尨鹌?br />
{
dula=1;//打開鎖存端
P0=table[1];//數(shù)碼管顯示一號選手
dula=0;//關(guān)閉鎖存端
P0=0xff;
wela=1;//打開鎖存端(開頭記得聲明鎖存端)
P0=0xFE;//送入位選信息,選擇第一位
wela=0;//關(guān)閉鎖存端
flag=1;//使flag等于一,跳出程序
delayms(5);
}
else if(key2==0)
{
dula=1;
P0=table[2];
dula=0;
P0=0Xff;
wela=1;
P0=0xFE
wela=0
flag=1;
delayms(5);
}
else if(key3==0)
{
dula=1;
P0=table[3];
dula=0;
P0=0Xff;
wela=1;
P0=0xFE;
wela=0;
flag=1;
delayms(5);
}
else if(key4==0)
{
dula=1;
P0=table[4];
dula=0;
P0=0Xff;
wela=1;
P0=0xFE
wela=0;
flag=1;
delayms(5);
}
else if(key5==0)
{
dula=1;
P0=table[5];
dula=0;
P0=0xff;
wela=1;
P0=0xFE;
wela=0;
flag=1;
delayms(5);
}
else if(key6==0)
{
dula=1;
P0=table[6];
dula=0;
P0=0Xff;
wela=1;
P0=0xFE;
wela=0;
flag=1;
delayms(5);
}
if(start==1)
{
keyscan();
if (key1==0)
{
num++;
}
else if (key2==0)
{
num++;
}
else if (key3==0)
{
num++;
}
else if (key4==1)
{
num++;
}
else if (key5==0)
{
num++;
}
else if (key6==0)
{
num++;
}
if (num>5)
{
num=0;
wela=0;
dula=0;
}
}
}
}
復(fù)制代碼
作者:
xxpp2011
時間:
2020-4-28 20:54
本站有很多8路搶答器的例子可以參考,功能應(yīng)該都差不多。
作者:
wc86110
時間:
2020-4-29 01:44
看仿真圖這硬件電路肯定有問題
作者:
boxbox123
時間:
2020-4-29 07:56
可以去網(wǎng)上參考下
作者:
凌某
時間:
2020-4-30 08:19
可以參考論壇里的 一些設(shè)計
作者:
77777770
時間:
2023-12-20 11:03
有的分號都沒加,下到單片機(jī)了也沒用,根本沒有用
作者:
77777770
時間:
2023-12-20 11:03
有的分號都沒加,下到單片機(jī)了也沒用,根本沒有用
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1