久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
實用性強的8路單片機搶答器制作 帶程序電路圖pcb圖
[打印本頁]
作者:
dzdiy
時間:
2015-4-11 22:07
標題:
實用性強的8路單片機搶答器制作 帶程序電路圖pcb圖
這款實用性強的8路單片機搶答器,使用的是AT89S52單片機,四位數碼管作為搶答、回答時間的倒計時以及計分顯示用。該制作從實用性出發,8個按鍵都是分開來做的,做出來的東西是能夠使用的而不是模型。
這款實用性強的8路單片機搶答器主要的功能:可以顯示搶答、回答時間的倒計時,可以調節搶答、回答時間,能夠提示犯規搶答,可以計分,可以實現軟復位。
全部資料打包下載地址
實用性強的8路單片機搶答器.rar
(169.95 KB, 下載次數: 159)
2015-4-11 22:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
源程序如下:
/*八路搶答器-----能夠顯示搶答、回答時間倒計時,能夠調節搶答、回答時間,能夠報警犯規搶答,可以計分,可以實現軟復位*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit fmq=P3^6;
sbit Key_Start=P3^4;//開始鍵,時間設置時+
sbit Key_Stop=P3^5;//停止鍵,時間設置時-
sbit Key_Restart=P3^0;//復位鍵
sbit Key_set_Q=P3^2;//搶答時間設置鍵
sbit Key_set_H=P3^3;//回答時間設置鍵
sbit led=P3^7;//搶答LED提示
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xc6,0xf0,0xb6};//段碼表
uchar code table_char[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc7,0xc0,0x92,0x86,0xbf,0xb7,0xff,0xb9,0x8f};//0-9 L O S E -
uchar table_score[9]={0,50,50,50,50,50,50,50,50};//記分數組,初設值50分
void delay(uint z);//延時函數聲明
void init();//初始化函數聲明
void display(uchar XuanShou,uchar time);//顯示數字函數聲明
void display_char(uchar char_1,uchar char_2,uchar char_3,uchar char_4 );//顯示字符函數聲明
void display_set(uchar char_1,uchar time,uchar char_2);//時間設置閃動顯示函數聲明
void display_score(uchar xs_num);//分數查詢顯示函數
void beep();//蜂鳴器函數
void beep_last();//蜂鳴器特殊報警
void LED();//提示燈函數
uchar QiangDa_time,HuiDa_time,QiangDa_time_temp=20,HuiDa_time_temp=30;//搶答時間、回答時間變量
uchar count_0,count_1;//定時中計數用的
uint shan_count=0;//閃動顯示計數用
void main()
{
uchar AnJian,ShuJu,XuanShou_num;
Top:init();//初始化
XuanShou_num=1;//為分數查詢做好準備
while(1)
{
display(10,0);//顯示一杠
ShuJu=P1;
if(ShuJu!=0xff)//犯規搶答!!
{
// delay(10);
// if(ShuJu!=0xff)
// {
AnJian=ShuJu;
switch(AnJian)//取出選手編號
{
case 0xfe : XuanShou_num=1;break;//1111 1110
case 0xfd : XuanShou_num=2;break;//1111 1101
case 0xfb : XuanShou_num=3;break;//1111 1011
case 0xf7 : XuanShou_num=4;break;//1111 0111
case 0xef : XuanShou_num=5;break;//1110 1111
case 0xdf : XuanShou_num=6;break;//1101 1111
case 0xbf : XuanShou_num=7;break;//1011 1111
case 0x7f : XuanShou_num=8;break;//0111 1111
default : goto LOSE;//無法顯示了,有兩個以上的鍵同時按下了!!不過這種概率相當小
}
while(1)
{
display_char(13,14,14,XuanShou_num);//閃動顯示犯規選手并且報警
if(shan_count==50)
{
beep();
}
if(Key_Stop==0)
{
delay(10);
if(Key_Stop==0)
{
beep();
table_score[XuanShou_num]--;//扣分
}
}
while(!Key_Stop)
{
display_char(14,14,1,16);//按鍵不放開的情況下顯示-1
shan_count=1;//調用的是閃動顯示函數,但是不讓其閃動
}
if(Key_Restart==0)
{
delay(10);
if(Key_Restart==0)
{
beep();
goto Top;//熱復位
}
}
}
// }
}
if(Key_Start==0)
{
delay(10);
if(Key_Start==0)//主持人按下搶答鍵,搶答正式開始!
{
QiangDa_time=QiangDa_time_temp;
HuiDa_time=HuiDa_time_temp;
beep();
TR1=1;//搶答時間開始倒計時
break;//跳出犯規搶答查詢循環
}
}
//一下為查分程序測試
if(Key_Stop==0)
{
delay(10);
if(Key_Stop==0)//進入分數查詢顯示
{
beep();
while(!Key_Stop);
while(1)
{
display_score(XuanShou_num);
if(Key_Start==0)
{
delay(10);
if(Key_Start==0)
{
XuanShou_num++;
if(XuanShou_num==9) XuanShou_num=1;
}
}
while(!Key_Start);//等待按鍵釋放
if(Key_Stop==0)
{
delay(10);
if(Key_Stop==0)
{
XuanShou_num--;
if(XuanShou_num==0) XuanShou_num=8;
}
}
while(!Key_Stop);//等待按鍵釋放
if(Key_Restart==0)
{
delay(10);
if(Key_Restart==0)
{
beep();
goto Top;//熱復位
}
}
}
}
}
}
while(1) //查詢是否有按鍵按下,進入搶答循環
{
display(10,QiangDa_time);//顯示搶答倒計時
if(QiangDa_time==0)
{
// beep();
TR1=0;//關閉定時器1
LOSE: while(1)
{
display_char(10,11,12,13); //顯示lose 字符
if(Key_Restart==0)
{
delay(10);
if(Key_Restart==0)//熱復位鍵,從頭開始下一輪
{
beep();
goto Top;
}
}
}
}
ShuJu=P1;//把P1口的數據送給變量
if(ShuJu!=0xff)//有按鍵按下
{
// delay(10);
// if(ShuJu!=0xff)//確定有按鍵按下
// {
AnJian=ShuJu;//傳遞數據掃描值
// TR0=1;//啟動定時器0
TR1=0;//關閉定時器1
break;//不再進行查詢是否有按鍵按下了
// }
}
}
switch(AnJian)//取出選手編號
{
case 0xfe : XuanShou_num=1;beep();LED();break;//1111 1110
case 0xfd : XuanShou_num=2;beep();LED();break;//1111 1101
case 0xfb : XuanShou_num=3;beep();LED();break;//1111 1011
case 0xf7 : XuanShou_num=4;beep();LED();break;//1111 0111
case 0xef : XuanShou_num=5;beep();LED();break;//1110 1111
case 0xdf : XuanShou_num=6;beep();LED();break;//1101 1111
case 0xbf : XuanShou_num=7;beep();LED();break;//1011 1111
case 0x7f : XuanShou_num=8;beep();LED();break;//0111 1111
default : goto LOSE;//無法顯示了,有兩個以上的鍵同時按下了!!不過這種概率相當小
}
TR0=1;//啟動定時器0(在這里啟動比在前面好)
while(1)
{
display(XuanShou_num,HuiDa_time);//顯示選手編號和回答倒計時
if(HuiDa_time==0)
{
TR0=0;//關閉定時器0
goto LOSE;//跳到顯示lose字符那里
}
if(Key_Stop==0)
{
delay(30);
if(Key_Stop==0)//停止鍵按下
{
beep();
TR0=0;//關閉定時器0,選手開始回答
while(!Key_Stop);
while(1) //在顯示選手回答倒計時時只有在stop按鍵按下時,才可按復位鍵
{
display(XuanShou_num,HuiDa_time);//顯示選手編號和回答倒計時
if(Key_Start==0)
{
delay(10);
if(Key_Start==0)
{
beep();
table_score[XuanShou_num]++;//加分
}
}
while(!Key_Start)
{
display_char(17,18,1,16);//按鍵不放開的情況下顯示+1
shan_count=1;//調用的是閃動顯示函數,但是不讓其閃動
}
if(Key_Stop==0)
{
delay(10);
if(Key_Stop==0)
{
beep();
table_score[XuanShou_num]--;//扣分
}
}
while(!Key_Stop)
{
display_char(14,14,1,16);//按鍵不放開的情況下顯示-1
shan_count=1;//調用的是閃動顯示函數,但是不讓其閃動
}
if(Key_Restart==0)
{
delay(10);
if(Key_Restart==0)//熱復位鍵,從頭開始下一輪
{
beep();
goto Top;
}
}
}
}
}
// else
/* if(Key_Restart==0)
{
delay(10);
if(Key_Restart==0)//熱復位鍵,從頭開始下一輪
{
beep();
goto Top;
}
} */
}
}
void delay(uint z)//1ms基準延時
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init()//初始化函數
{
// P1=0xff
EA=1;//開總中斷;
TMOD=0x11;//定時器工作方式1,16位定時計數器
TH0=(65536-50000)/256;//50us
TL0=(65536-50000)%256;
ET0=1;//開定時器0中斷(暫時不啟動定時器)
// TMOD=0x01;//定時器工作方式1,16位定時計數器
TH1=(65536-50000)/256;//50us
TL1=(65536-50000)%256;
ET1=1;//開定時器0中斷(暫時不啟動定時器)
EX0=1;//啟動外中斷0
EX1=1;//啟動外中斷1
P1=0xff;//讀P1口的數據要先置1準備
count_0=0;//定時器中的計數清零
count_1=0;
shan_count=0;
}
void display(uchar XuanShou,uchar time)//顯示數字的函數
{
P2=0x7f;//0111 1111最后一位數碼管亮
P0=table[XuanShou];//選手編號
delay(1);
P2=0x7f;//0111 1111
P0=0xff;//消余輝
delay(1);
P2=0xdf;//1101 1111
P0=table[time%10];//時間的個位
delay(1);
P2=0xdf;//0111 1111
P0=0xff;//消余輝
delay(1);
P2=0xef;// 1110 1111
P0=table[time/10];//時間的十位
delay(1);
P2=0xef;//0111 1111
P0=0xff;//消余輝
delay(1);
}
void display_char(uchar char_1,uchar char_2,uchar char_3,uchar char_4 )//閃動!顯示字符的函數
{
shan_count++;
if(shan_count==150) shan_count=0;
if(shan_count>0&&shan_count<50)
{
P2=0x7f;//0111 1111
P0=table_char[char_4];
delay(1);
P2=0x7f;//0111 1111
P0=0xff;
delay(1);
P2=0xbf;//1011 1111
P0=table_char[char_3];
delay(1);
P2=0xbf;//1011 1111
P0=0xff;
delay(1);
P2=0xdf;//1101 1111
P0=table_char[char_2];
delay(1);
P2=0xdf;//1101 1111
P0=0xff;
delay(1);
P2=0xef;//1110 1111
P0=table_char[char_1];
delay(1);
P2=0xef;//1110 1111
P0=0xff;
delay(1);
}
else
{
P2=0x7f;//0111 1111
P0=0xff;
delay(1);
P2=0xbf;//
P0=0xff;
delay(1);
P2=0xdf;//
P0=0xff;
delay(1);
P2=0xef;//
P0=0xff;
delay(1);
}
}
void display_set(uchar char_1,uchar time,uchar char_2)//時間設置的閃動顯示
{
shan_count++;
if(shan_count==120) shan_count=0;
if(shan_count>0&&shan_count<40)
{
P2=0x7f;//0111 1111最后一位數碼管亮
P0=table[char_2];//顯示一個符號
delay(1);
P2=0x7f;//0111 1111
P0=0xff;//消余輝
delay(1);
P2=0xbf;//1011 1111
P0=table[time%10];//時間的個位
delay(1);
P2=0xbf;//1011 1111
P0=0xff;//消余輝
delay(1);
P2=0xdf;//1101 1111
P0=table[time/10];//時間的十位
delay(1);
P2=0xdf;//1101 1111
P0=0xff;//消余輝
delay(1);
P2=0xef;// 1110 1111
P0=table[char_1];//顯示一個符號
delay(1);
P2=0xef;//1110 1111
P0=0xff;//消余輝
delay(1);
}
else
{
P2=0x7f;//0111 1111
P0=table[char_2];
delay(1);
P2=0xbf;//
P0=0xff;
delay(1);
P2=0xdf;//
P0=0xff;
delay(1);
P2=0xef;//
P0=table[char_1];
delay(1);
}
}
void display_score(uchar xs_num)//分數查詢顯示函數
{
P2=0x7f;//0111 1111最后一位數碼管亮
P0=table[(table_score[xs_num]%10)];//分數的個位
delay(1);
P2=0x7f;//0111 1111
P0=0xff;//消余輝
delay(1);
P2=0xbf;//1011 1111
P0=table[(table_score[xs_num]/10)];//分數的十位
delay(1);
P2=0xbf;//1011 1111
P0=0xff;//消余輝
delay(1);
P2=0xdf;//1101 1111
P0=table_char[15];//間隔符號
delay(1);
P2=0xdf;//1101 1111
P0=0xff;//消余輝
delay(1);
P2=0xef;// 1110 1111
P0=table[xs_num];//選手編號
delay(1);
P2=0xef;//1110 1111
P0=0xff;//消余輝
delay(1);
}
void beep() //有源蜂鳴器函數
{
fmq=0;
delay(80);
fmq=1;
}
void beep_last()//最后一聲特殊聲調
{
fmq=0;
delay(300);
fmq=1;
}
void LED()
{
led=0;
delay(150);
led=1;
}
void T0_time() interrupt 1//定時器0中斷函數_回答時間
{
TH0=(65536-50000)/256;//50ms
TL0=(65536-50000)%256;//馬上重裝初值,以免有誤差
if(count_0==20)
{
count_0=0;
HuiDa_time--;
if(HuiDa_time<=5)
{
if(HuiDa_time==0)
{
beep_last();//最后一聲特殊警告
}
beep();
}
}
count_0++;
}
void T1_time() interrupt 3//定時器1中斷函數_搶答時間
{
TH1=(65536-50000)/256;//50us
TL1=(65536-50000)%256;//馬上重裝初值,這樣在后面調用beep()函數時就不會影響定時器的準確計時了
if(count_1==20)
{
count_1=0;
QiangDa_time--;
if(QiangDa_time<=5)
{
if(QiangDa_time==0)
{
beep_last();//最后一聲警告
}
else
beep();
}
}
count_1++;
}
void EX0_set_QiangDa_time() interrupt 0 //外中斷0,設置搶答時間
{
delay(10);//消抖一下
if(Key_set_Q==0)
{
beep();
while(1)
{
// display(11,QiangDa_time_temp);
// delay(100);//閃動效果
display_set(12,QiangDa_time_temp,13);//調用時間設置閃動顯示函數,效果為 [時間]
if(Key_Start==0)//時間+1鍵
{
delay(10);
if(Key_Start==0)
{
QiangDa_time_temp++;
if(QiangDa_time_temp==100)
{
QiangDa_time_temp=1;
}
}
}
while(!Key_Start);//等待按鍵釋放
// else
if(Key_Stop==0)//時間-1鍵
{
delay(10);
if(Key_Stop==0)
{
QiangDa_time_temp--;
if(QiangDa_time_temp==0)
{
QiangDa_time_temp=99;
}
}
}
while(!Key_Stop);//等待按鍵釋放
// else
if(Key_Restart==0)
{
if(Key_Restart==0)
{
beep();
break;
}
}
}
}
}
void EX1_set_HuiDa_time() interrupt 2 //外中斷1,設置回答時間
{
delay(10);//消抖一下
if(Key_set_H==0)
{
beep();
while(1)
{
display_set(12,HuiDa_time_temp,13);//調用時間設置閃動顯示函數,效果為 [時間]
if(Key_Start==0)//時間+1鍵
{
delay(10);
if(Key_Start==0)
{
HuiDa_time_temp++;
if(HuiDa_time_temp==100)
{
HuiDa_time_temp=1;
}
}
}
while(!Key_Start);//等待按鍵釋放
// else
if(Key_Stop==0)//時間-1鍵
{
delay(10);
if(Key_Stop==0)
{
HuiDa_time_temp--;
if(HuiDa_time_temp==0)
{
HuiDa_time_temp=99;
}
}
}
while(!Key_Stop);//等待按鍵釋放
// else
if(Key_Restart==0)
{
if(Key_Restart==0)
{
beep();
break;
}
}
}
}
}
復制代碼
作者:
727802492
時間:
2015-5-4 23:05
好厲害
作者:
zhangxuewen12a
時間:
2015-11-16 16:50
你的排阻用的是多大的??
作者:
落葉123秋風
時間:
2016-5-7 11:54
收藏了
作者:
happyner
時間:
2016-5-8 15:44
最簡單的8路搶答器好像只要一個4511就行,不用單片機的吧。
作者:
MX安心
時間:
2016-6-20 11:50
非常不錯很好
作者:
帝國猛虎
時間:
2016-6-20 16:43
學習了非常不錯
作者:
1084868171
時間:
2016-12-20 15:35
可以 很強
作者:
帥也是一種錯
時間:
2017-4-16 14:46
好棒,真厲害,
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
色婷婷综合久久久中文字幕
|
亚洲少妇综合网
|
中文字幕成人av
|
免费观看成人性生生活片
|
日日日干干干
|
亚洲欧美中文日韩在线v日本
|
亚洲激精日韩激精欧美精品
|
久久久精品综合
|
99久久精品国产一区二区三区
|
精品国产一区一区二区三亚瑟
|
亚洲综合中文字幕在线观看
|
av中文字幕在线播放
|
欧美精品一区二区三区在线播放
|
午夜天堂精品久久久久
|
在线观看免费av网
|
久久一区二区三区四区
|
日韩在线视频观看
|
国产视频中文字幕
|
亚洲高清一区二区三区
|
欧美久久久久久
|
又黄又爽的网站
|
中文字幕电影在线观看
|
伊人免费网
|
中文字幕四虎
|
国产精品成人一区二区三区夜夜夜
|
精品久久久久久红码专区
|
99热在线免费
|
黄a网站
|
999热在线视频
|
中文字幕亚洲一区二区va在线
|
精品国产免费一区二区三区五区
|
免费在线成人网
|
欧美在线高清
|
性欧美精品一区二区三区在线播放
|
一区免费观看
|
91免费小视频
|
日本三级全黄三级a
|
欧美a在线
|
色久影院
|
免费超碰
|
日本不卡一区二区三区
|