標(biāo)題:
單片機(jī)搶答器程序
[打印本頁]
作者:
晨小小小
時(shí)間:
2016-6-25 11:53
標(biāo)題:
單片機(jī)搶答器程序
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key9=P2^0; //主持人清除鍵
sbit key10=P2^1; //主持人非定時(shí)搶答開啟鍵
sbit key11=P2^2; //主持人定時(shí)搶答開啟鍵
sbit wei1=P2^4; //數(shù)碼管位選段
sbit wei2=P2^5;
sbit wei3=P2^6;
sbit wei4=P2^7;
sbit contr=P2^3;
uchar code seg7[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
}; //共陰極數(shù)碼管顯示編碼
//定義搶答時(shí)間,中斷次數(shù),選手編號(hào)三個(gè)全局變量
uchar time=30,count,playernum;
//存儲(chǔ)8個(gè)選手按鍵狀態(tài),若對(duì)應(yīng)選手按鍵被按下,則
//相應(yīng)存儲(chǔ)位置存儲(chǔ)選手編號(hào),否則對(duì)應(yīng)存儲(chǔ)位置存儲(chǔ)數(shù)字0
uchar num[8];
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar time,uchar num) //數(shù)碼管顯示函數(shù)
{
uchar shi,ge;
shi=time/10; //顯示搶答時(shí)間
ge=time%10;
P0=seg7[shi]; //段選數(shù)據(jù)
wei1=0; //位選數(shù)據(jù)
delayms(10);
wei1=1;
P0=seg7[ge];
wei2=0;
delayms(10);
wei2=1;
shi=num/10; //顯示選手編號(hào)
ge=num%10;
P0=seg7[shi];
wei3=0;
delayms(10);
wei3=1;
P0=seg7[ge];
wei4=0;
delayms(10);
wei4=1;
}
void keyscan()
{
if(key9==0) //主持人清除鍵
{
delayms(2);
if(key9==0)
{
while(!key9) ;
P3=0xff; //關(guān)閉和被按下?lián)尨疰I對(duì)應(yīng)的發(fā)光二極管
time=0; //清除搶答時(shí)間
contr=1; //開發(fā)搶答按鈕輸入
playernum=0; //清除選手編號(hào)
TR0=0; //關(guān)閉定時(shí)器
}
}
if(key10==0) //非定時(shí)搶答開始鍵
{
delayms(2);
if(key10==0)
{
while(!key10);
contr=0; //只允許首先按下?lián)尨疰I者的狀態(tài)輸入
time=0; //清除時(shí)間
TR0=0; //關(guān)閉定時(shí)器
}
}
if(key11==0) //定時(shí)搶答開啟鍵
{
delayms(2);
if(key11==0)
{
while(!key11);
contr=0; //只允許首先按下?lián)尨疰I者的狀態(tài)輸入
time=30; //初始化搶答時(shí)間
TR0=1; //開啟定時(shí)器
}
}
}
void getplayernum() //獲取搶答鍵被按下編號(hào)
{
uchar i,temp;
temp=P1;
P3=P1; //將被按下的搶答鍵對(duì)應(yīng)二極管點(diǎn)亮
for(i=0;i<8;i++)
{
temp=temp>>1;
if(CY==0) //該選手按下?lián)尨疰I
{
num[i]=(i+1);
}
else
num[i]=0;
}
}
void main()
{
uchar i;
P2=0xFF;
TMOD=0x01; //定時(shí)器0工作在方式1
TH0=(65536-50000)/256; //定時(shí)時(shí)間50ms
TL0=(65536-50000)%256;
EA=1;
ET0=1;
while(1)
{
keyscan();
getplayernum();
for(i=0;i<8;i++)
{
if(num[i]!=0)
{
playernum=num[i];
}
display(time,playernum); //顯示搶答鍵被按下編號(hào)和時(shí)間
}
}
}
void timer0_int() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
time--;
if(time==0)
time=30;
count=0;
}
TR0=1;
}
復(fù)制代碼
作者:
MX安心
時(shí)間:
2016-6-26 19:19
ww位學(xué)習(xí)了最好弄個(gè)圖
作者:
wangpanbest
時(shí)間:
2017-9-19 10:21
求大神哥哥給個(gè)圖啊
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1