標(biāo)題:
8位競(jìng)賽搶答器 單片機(jī)程序
[打印本頁]
作者:
fishzy
時(shí)間:
2019-7-8 16:58
標(biāo)題:
8位競(jìng)賽搶答器 單片機(jī)程序
以單片機(jī)為核心,設(shè)計(jì)一個(gè)8位競(jìng)賽搶答器:同時(shí)供8名選手或8個(gè)代表隊(duì)比賽,分別8個(gè)按鈕S0~S7表示。設(shè)置一個(gè)系統(tǒng)清除和搶答控制開關(guān)S,開關(guān)由主持人控制。搶答器具有鎖存與顯示功能。即選手按按鈕,鎖存相應(yīng)的編號(hào),并在優(yōu)先搶答選手的編號(hào)一直保持到主持人將系統(tǒng)清除為止。搶答器具有定時(shí)搶答功能,且一次搶答的時(shí)間由主持人設(shè)定(如30秒)。當(dāng)主持人啟動(dòng)“開始”鍵后,定時(shí)器進(jìn)行減計(jì)時(shí),同時(shí)揚(yáng)聲器發(fā)出短暫的聲響,聲響持續(xù)的時(shí)間為0.5s左右。參賽選手在設(shè)定的時(shí)間搶答,搶答有效,定時(shí)器停止工作,顯示器上顯示選手的編號(hào)和搶答時(shí)間,并保持到主持人將系統(tǒng)清除為止。如果定時(shí)時(shí)間已到,無人搶答,本次搶答無效,系統(tǒng)報(bào)警并禁止搶答,定時(shí)顯示器上顯示00
1.png
(219.14 KB, 下載次數(shù): 55)
下載附件
2019-7-8 16:58 上傳
2.png
(385.79 KB, 下載次數(shù): 36)
下載附件
2019-7-8 16:58 上傳
單片機(jī)源程序如下:
#include<reg51.h>
sbit DIN=P3^0;//與max7219接口定義
sbit LOAD=P3^1;
sbit CLK=P3^2;
sbit key0=P1^0;//8路搶答器按鍵
sbit key1=P1^1;
sbit key2=P1^2;
sbit key3=P1^3;
sbit key4=P1^4;
sbit key5=P1^5;
sbit key6=P1^6;
sbit key7=P1^7;
sbit key_clear=P2^0;//主持人時(shí)間設(shè)置、清除
sbit begin=P2^1;//主持人開始按鍵
sbit sounder=P3^7;//蜂鳴器
unsigned char second=30;//秒表計(jì)數(shù)值
unsigned char counter=0;//counter每100,minite加1
unsigned char people=0;//搶答結(jié)果
unsigned char num_add[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};//max7219讀寫地址、內(nèi)容
unsigned char num_dat[]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89};
unsigned char keyscan()//鍵盤掃描函數(shù)
{
unsigned char keyvalue,temp;
keyvalue=0;
P1=0xff;
temp=P1;
if(~(P1&temp))
{
switch(temp)
{
case 0xfe:
keyvalue=1;
break;
case 0xfd:
keyvalue=2;
break;
case 0xfb:
keyvalue=3;
break;
case 0xf7:
keyvalue=4;
break;
case 0xef:
keyvalue=5;
break;
case 0xdf:
keyvalue=6;
break;
case 0xbf:
keyvalue=7;
break;
case 0x7f:
keyvalue=8;
break;
default:
keyvalue=0;
break;
}
}
return keyvalue;
}
void max7219_send(unsigned char add,unsigned char dat)//向max7219寫指令函數(shù)
{
unsigned char ADS,i,j;
LOAD=0;
i=0;
while(i<16)
{
if(i<8)
{
ADS=add;
}
else
{
ADS=dat;
}
for(j=8;j>=1;j--)
{
DIN=ADS&0x80;
ADS=ADS<<1;
CLK=1;
CLK=0;
}
i=i+8;
}
LOAD=1;
}
void max7219_init()//max7219初始化函數(shù)
{
max7219_send(0x0c,0x01);
max7219_send(0x0b,0x07);
max7219_send(0x0a,0xf5);
max7219_send(0x09,0xff);
}
void time_display(unsigned char x)//時(shí)間顯示
{
unsigned char i,j;
i=x/10;
j=x%10;
max7219_send(num_add[1],num_dat[j]);
max7219_send(num_add[0],num_dat[i]);
}
void scare_display(unsigned char x)//搶答結(jié)果顯示
{
unsigned char i,j;
i=x/10;
j=x%10;
max7219_send(num_add[3],num_dat[j]);
max7219_send(num_add[2],num_dat[i]);
}
void holderscan()//搶答時(shí)間設(shè)置,0-60s
{
time_display(second);
scare_display(people);
if(~key_clear)//如果有鍵按下,改變搶答時(shí)間
{
while(~key_clear);
if(people)//如果搶答結(jié)果沒有清空,搶答器重置
{
second=30;
people=0;
}
if(second<60)
{
second++;
}
else
{
second=0;
}
}
}
void timer_init()
{
EA=1;
ET0=1;
TMOD=0x01;
TH0=0xd8;//設(shè)定10ms中斷一次
TL0=0xef;
}
void main()
{
while(1)
{
do{
holderscan();
}while(begin);//開始前進(jìn)行設(shè)置,若未按下開始鍵
while(~begin);//防抖
max7219_init(); //芯片初始化
timer_init(); //中斷初始化
TR0=1; //開始中斷
do{
time_display(second);
scare_display(people);
people=keyscan();
}while((!people)&&(second));//運(yùn)行直到搶答結(jié)束或者時(shí)間結(jié)束
TR0=0;
}
}
void timer0() interrupt 1
{
if(counter<100)
{
counter++;
if(counter==50)
{
sounder=0;
}
}
else
{
sounder=1;
counter=0;
second=second-1;
}
TH0=0xd8;//重新裝載
TL0=0xef;
TR0=1;
}
復(fù)制代碼
作者:
呆呆燉燉
時(shí)間:
2020-6-14 22:18
很有用,謝謝
作者:
wdnmmd
時(shí)間:
2020-6-16 21:44
真的不錯(cuò)謝謝
作者:
帝鴻蒙
時(shí)間:
2020-6-17 09:41
真的不錯(cuò)謝謝樓主
作者:
商123
時(shí)間:
2021-8-25 12:26
為什么我的數(shù)碼管不亮呢,接的共陰極數(shù)碼管,換成共陽極后數(shù)碼管又全亮了,求大神教教我
作者:
快樂眼淚
時(shí)間:
2022-1-7 11:51
怎么顯示第一第二第三名次?
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1