標(biāo)題:
51單片機(jī)智能八路搶答器源碼及proteus仿真
[打印本頁]
作者:
cx419320871
時(shí)間:
2016-10-10 09:30
標(biāo)題:
51單片機(jī)智能八路搶答器源碼及proteus仿真
51單片機(jī)做的一個(gè)智能八路搶答器的proteus仿真,下面是原理圖:
0.png
(36.83 KB, 下載次數(shù): 56)
下載附件
2016-10-10 20:20 上傳
0.png
(45.73 KB, 下載次數(shù): 49)
下載附件
2016-10-10 20:20 上傳
仿真及源碼等資料打包下載:
51智能8路搶答器.zip
(109.62 KB, 下載次數(shù): 36)
2016-10-10 09:29 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
單片機(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í)間內(nèi)進(jìn)行搶答************
******,搶答有效,定時(shí)器停止工作,顯************
******示器上顯示選手的編號(hào)和搶答的時(shí)間*********
******,并保持到主持人將系統(tǒng)清除為止。*********
******如果定時(shí)時(shí)間已到,無人搶答,本次*********
******搶答無效,系統(tǒng)報(bào)警并禁止搶答,定*********
******時(shí)顯示器上顯示00。*********************************
******************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code Tab0[]= //用于74HC595掃描的數(shù)組
{
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
};
unsigned char code LED_DATE [] = //共陽數(shù)碼管的編碼
{
0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90
};
sbit Set_Rest =P3^0; //主持人設(shè)置時(shí)間和復(fù)位按鍵
sbit Start_Jia =P3^1; //主持人開始和調(diào)整時(shí)間按鍵
sbit S1 =P2^0; // 1號(hào)選手按鍵
sbit S2 =P2^1; // 2號(hào)選手按鍵
sbit S3 =P2^2; // 3號(hào)選手按鍵
sbit S4 =P2^3; // 4號(hào)選手按鍵
sbit S5 =P2^4; // 5號(hào)選手按鍵
sbit S6 =P2^5; // 6號(hào)選手按鍵
sbit S7 =P2^6; // 7號(hào)選手按鍵
sbit S8 =P2^7; // 8號(hào)選手按鍵
sbit BUZZ =P3^2;
sbit DS =P1^5; //74HC595 I/O
sbit SHCP =P1^6;
sbit STCP =P1^7;
uint Time_Alarm=500; //搶答時(shí)間,默認(rèn)定時(shí)500ms
uchar Player=0; //選手號(hào)碼
bit K1_bit=0; //K1標(biāo)志位
bit Start_bit=0; //開始標(biāo)志位
bit Set_bit=0; //設(shè)置標(biāo)志位
uchar Set0=0; //用于設(shè)置時(shí)間時(shí)顯示閃爍控制
bit Set1=0; //用于設(shè)置時(shí)間時(shí)顯示閃爍控制
void Delay_ms(uint xms); //延時(shí)
void HC595(uchar Value); //74HC595驅(qū)動(dòng)函數(shù)
void Display(); //顯示函數(shù)
void Init();
void KEY1();
void KEY2(); //開始/加時(shí)間鍵函數(shù)
void Player_KEY(); //選手搶答按鍵
void main()
{
Init();
while(1)
{
KEY1();
KEY2();
Player_KEY();
Display();
}
}
void Player_KEY() //選手搶答按鍵
{
if(Start_bit==1)
{
if(S1==0)
{
Delay_ms(10);
if(S1==0)
{
Player=1;
Start_bit=0;
TR0=0;
while(!S1);
}
}
if(S2==0)
{
Delay_ms(10);
if(S2==0)
{
Player=2;
Start_bit=0;
TR0=0;
while(!S2);
}
}
if(S3==0)
{
Delay_ms(10);
if(S3==0)
{
Player=3;
Start_bit=0;
TR0=0;
while(!S3);
}
}
if(S4==0)
{
Delay_ms(10);
if(S4==0)
{
Player=4;
Start_bit=0;
TR0=0;
while(!S4);
}
}
if(S5==0)
{
Delay_ms(10);
if(S5==0)
{
Player=5;
Start_bit=0;
TR0=0;
while(!S5);
}
}
if(S6==0)
{
Delay_ms(10);
if(S6==0)
{
Player=6;
Start_bit=0;
TR0=0;
while(!S6);
}
}
if(S7==0)
{
Delay_ms(10);
if(S7==0)
{
Player=7;
Start_bit=0;
TR0=0;
while(!S7);
}
}
if(S8==0)
{
Delay_ms(10);
if(S8==0)
{
Player=8;
Start_bit=0;
TR0=0;
while(!S8);
}
}
}
}
void KEY2() //開始/加時(shí)間鍵函數(shù)
{
if(Start_Jia==0)
{
Delay_ms(10);
if(Start_Jia==0)
{
if(Set_bit==0)
{
if(Time_Alarm==0) //判斷是否搶答結(jié)束
{
TR0=0;
Time_Alarm=0;
}
else
{
TR0=~TR0;
Start_bit=~Start_bit;
}
}
else
{
Time_Alarm=(Time_Alarm+250);
if(Time_Alarm>1500)
{
Time_Alarm=500;
}
}
while(!Start_Jia);
}
}
}
void KEY1()
{
if(Set_Rest==0)
{
Delay_ms(100);
if(Set_Rest==0)
{
Delay_ms(500); //判斷長按還是短按
if(Set_Rest==0)
{
Time_Alarm=500;
TR0=0;
TR1=0;
Set_bit=0;
Player=0;
Start_bit=0;
BUZZ=1;
while(!Set_Rest);
}
else
{
if(Start_bit==0) //判斷是否開始
{
Set_bit=~Set_bit;
TR1=~TR1;
}
}
}
}
}
void Time_0() interrupt 1
{
TH0=0xfc; //定時(shí)器0定時(shí)1毫秒
TL0=0x18;
Time_Alarm--;
if(Time_Alarm<=0)
{
TR0=0;
Start_bit=0;
BUZZ=0;
}
}
void Time_1() interrupt 3
{
TH1=0x3c; //定時(shí)器1定時(shí)50ms
TL1=0xb0;
Set0++;
if(Set0==10)
{
Set0=0;
Set1=~Set1;
}
}
void Display() //顯示函數(shù)
{
uchar i=0;
for(i=0;i<3;i++) //選手編號(hào)數(shù)碼管前三位顯示0
{
P0=LED_DATE[0]; //送段數(shù)據(jù)
HC595(Tab0[i]); //送位數(shù)據(jù)
Delay_ms(5); //延時(shí)
P0=0XFF; //消隱
}
P0=LED_DATE[Player]; //數(shù)碼管第4位顯示選手編號(hào),送段數(shù)據(jù)
HC595(Tab0[3]); //送位數(shù)據(jù)
Delay_ms(5); //延時(shí)
P0=0XFF; //消隱
if(Set_bit==0)
{
P0=LED_DATE[Time_Alarm/1000]; //顯示定時(shí)時(shí)間千位
HC595(Tab0[4]); //送位數(shù)據(jù)
Delay_ms(5); //延時(shí)
P0=0XFF; //消隱
P0=LED_DATE[Time_Alarm%1000/100]; //顯示定時(shí)時(shí)間百位
HC595(Tab0[5]); //送位數(shù)據(jù)
Delay_ms(5); //延時(shí)
P0=0XFF; //消隱
P0=LED_DATE[Time_Alarm%100/10]; //顯示定時(shí)時(shí)間十位
HC595(Tab0[6]); //送位數(shù)據(jù)
Delay_ms(5); //延時(shí)
P0=0XFF; //消隱
P0=LED_DATE[Time_Alarm%10]; //顯示定時(shí)時(shí)間個(gè)位
HC595(Tab0[7]); //送位數(shù)據(jù)
Delay_ms(5); //延時(shí)
P0=0XFF; //消隱
}
if(Set_bit==1)
{
if(Set1==1)
{
P0=LED_DATE[Time_Alarm/1000]; //顯示定時(shí)時(shí)間千位
HC595(Tab0[4]); //送位數(shù)據(jù)
Delay_ms(5); //延時(shí)
P0=0XFF; //消隱
P0=LED_DATE[Time_Alarm%1000/100]; //顯示定時(shí)時(shí)間百位
HC595(Tab0[5]); //送位數(shù)據(jù)
Delay_ms(5); //延時(shí)
P0=0XFF; //消隱
P0=LED_DATE[Time_Alarm%100/10]; //顯示定時(shí)時(shí)間十位
HC595(Tab0[6]); //送位數(shù)據(jù)
Delay_ms(5); //延時(shí)
P0=0XFF; //消隱
P0=LED_DATE[Time_Alarm%10]; //顯示定時(shí)時(shí)間個(gè)位
HC595(Tab0[7]); //送位數(shù)據(jù)
Delay_ms(5); //延時(shí)
P0=0XFF; //消隱
}
else
{
P0=0xff; //顯示定時(shí)時(shí)間千位
HC595(Tab0[4]); //送位數(shù)據(jù)
Delay_ms(5); //延時(shí)
P0=0XFF; //消隱
P0=0xff; //顯示定時(shí)時(shí)間百位
HC595(Tab0[5]); //送位數(shù)據(jù)
Delay_ms(5); //延時(shí)
P0=0XFF; //消隱
P0=0xff; //顯示定時(shí)時(shí)間十位
HC595(Tab0[6]); //送位數(shù)據(jù)
Delay_ms(5); //延時(shí)
P0=0XFF; //消隱
P0=0xff; //顯示定時(shí)時(shí)間個(gè)位
HC595(Tab0[7]); //送位數(shù)據(jù)
Delay_ms(5); //延時(shí)
P0=0XFF; //消隱
}
}
}
void Init()
{
EA=1;
TMOD=0X11;
TH0=0xfc; //定時(shí)器0定時(shí)1毫秒
TL0=0x18;
ET0=1;
TH1=0x3c; //定時(shí)器1定時(shí)50ms
TL1=0xb0;
ET1=1;
TR1=0;
}
void HC595(uchar Value)
{
uchar i;
for(i=0;i<8;i++)
{
DS=Value&0x80; //取數(shù)據(jù)高位
if(DS==0x80)
DS=1;
else
DS=0;
SHCP=0; //發(fā)生一個(gè)高脈沖,數(shù)據(jù)移入寄存器
SHCP=1;
Value<<=1; //左移8次,取出數(shù)據(jù)的值
}
STCP=0;
STCP=1; //數(shù)據(jù)移入鎖存器
}
void Delay_ms(uint xms) //延時(shí)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1