標(biāo)題:
基于89C51單片機8位搶答器/帶蜂鳴器提示/lcd1602/proteus
[打印本頁]
作者:
了解@
時間:
2020-12-9 00:18
標(biāo)題:
基于89C51單片機8位搶答器/帶蜂鳴器提示/lcd1602/proteus
主要功能:
key9:主持人鍵 黃燈
key1~8:搶答人鍵 紅燈
只有主持人按下后,搶答才有效,都有聲音提示
主持人按下前:lcd顯示 SUSPEND 暫停
主持人按下,搶答人按下前://lcd顯示 START 開始 // D9亮//時間開始倒計時
搶答人按下:lcd顯示 AND 結(jié)束 相應(yīng)燈亮//時間停止
搶答結(jié)束所有按鍵不再起作用
Proteus仿真原理圖:
搶答器1602.PNG
(125.44 KB, 下載次數(shù): 107)
下載附件
2020-12-9 00:11 上傳
C程序代碼:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P3^5;
sbit rw=P3^6;
sbit lcden=P3^7;
sbit button=P3^0;
sbit D9=P3^1;
sbit beep=P3^2;
uchar table1[]="SUSPEND";//暫停 //要顯示的字表
uchar table2[]="START ";//開始
uchar table3[]="AND ";//結(jié)束
uchar table4[]=" 00:03:00";//搶答時間
uchar fen,miao,sfmshi,sfmge,count,temp,flag,num,aa,bb,cc;
/*************************************************************
延時函數(shù) ms
*************************************************************/
void delay(uint t)
{
uint x,y;
for(x=t;x>0;x--)
for(y=110;y>0;y--);
}
/*************************************************************
lcd1602指令寫入函數(shù)
*************************************************************/
void write_com(uchar com)
{
P0=com;
rs=0;//rs低,指令
rw=0;//低,寫
lcden=0;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
/*************************************************************
lcd1602數(shù)據(jù)寫入函數(shù)
*************************************************************/
void write_date(uchar date)
{
P0=date;
rs=1;//rs高,數(shù)據(jù)
rw=0;//低,寫
lcden=0;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
/*************************************************************
lcd1602初始化函數(shù)
*************************************************************/
void init()
{
fen=3;
miao=0;
write_com(0x38);//選擇16x2顯示,5x7點陣
delay(5);
write_com(0x0f);//開顯示,開光標(biāo),光標(biāo)閃爍
delay(5);
write_com(0x06);//讀或?qū)懞,指針加一,光?biāo)加一
delay(5);
write_com(0x01);//清屏
delay(5);
/***********************************
中斷初始化
************************************/
TMOD=0x01;//定時器T0,方式1
TH0=(65536-50000)/256;//裝高8位初值
TL0=(65536-50000)%256;//裝低8位初值
EA=1;//總中斷開
ET0=1;
TR0=0;//定時器T0關(guān)閉,待主持按下
}
/*************************************************************
顯示狀態(tài)函數(shù)
*************************************************************/
void display1()
{
uchar i;
write_com(0x80);//lcd1602第一行第一位 指令
delay(5);
for(i=0;i<7;i++)
{
if(flag==0)
write_date(table1[i]);
if(flag==1)
write_date(table2[i]);
if(flag==2)
write_date(table3[i]);
delay(5);
}
}
/*************************************************************
初始化時間函數(shù)
*************************************************************/
void display2()
{
uchar i;
write_com(0x80+0x40);//lcd1602第二行第一位 指令
delay(5);
for(i=0;i<12;i++)
{
write_date(table4[i]);
delay(5);
}
}
/*************************************************************
顯示時間函數(shù)
*************************************************************/
void sfm(uchar com,uchar date)
{
sfmshi=date/10;
sfmge=date%10;
write_com(0xc0+com);
delay(5);
write_date(0x30+sfmshi);
delay(5);
write_date(0x30+sfmge);
delay(5);
write_com(0x80+17);
}
/*************************************************************
按鍵檢測并時實還回按鍵號數(shù)
*************************************************************/
uchar keyscan()
{
if(P2!=0xff)
{
delay(5);//消抖
if(P2!=0xff)
switch(P2)
{
case 0xfe:num=1;break;
case 0xfd:num=2;break;
case 0xfb:num=3;break;
case 0xf7:num=4;break;
case 0xef:num=5;break;
case 0xdf:num=6;break;
case 0xbf:num=7;break;
case 0x7f:num=8;break;
default:break;
}
while(P2!=0xff);//松手檢測
}
if(button==0)
{
delay(5);
if(button==0&&cc==0)
{
while(button==0);
num=9;
TR0=1;
cc=1;
beep=0;
delay(500);
beep=1;
}
}
return num;
}
/*************************************************************
main函數(shù)
*************************************************************/
void main()
{
init();
display1();
display2();
write_com(0x0c);//開顯示,關(guān)閉光標(biāo),不閃爍
delay(5);
while(1)
{
keyscan();
if(num==9&&TR0!=0)
{display1();aa=1;}
if(aa==1)
{
D9=0;
flag=1;
switch(num)
{
case 1:
{P1=0xfe;TR0=0;flag=2;display1();aa=0;break;}
case 2:
{P1=0xfd;TR0=0;flag=2;display1();aa=0;break;}
case 3:
{P1=0xfb;TR0=0;flag=2;display1();aa=0;break;}
case 4:
{P1=0xf7;TR0=0;flag=2;display1();aa=0;break;}
case 5:
{P1=0xef;TR0=0;flag=2;display1();aa=0;break;}
case 6:
{P1=0xdf;TR0=0;flag=2;display1();aa=0;break;}
case 7:
{P1=0xbf;TR0=0;flag=2;display1();aa=0;break;}
case 8:
{P1=0x7f;TR0=0;flag=2;display1();aa=0;break;}
default:break;
}
}
if(flag==2&&bb==0)
{
write_com(0x80+12);
write_date(0x30+num);
write_date(0x50+7);
write_date(0x40+9);
write_date(0x40+14);
bb=1;
beep=0;
delay(500);
beep=1;
}
}
復(fù)制代碼
因文章限制,全部資料在下面壓縮包中........
多路搶答器.zip
(94.28 KB, 下載次數(shù): 64)
2020-12-9 00:18 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
wuwenyu
時間:
2020-12-17 12:32
為什么這個代碼我復(fù)制了,但是創(chuàng)建不了,麻煩大神求救!
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1