标题:
基于89C51单片机8位抢答器/带蜂鸣器提示/lcd1602/proteus
[打印本页]
作者:
了解@
时间:
2020-12-9 00:18
标题:
基于89C51单片机8位抢答器/带蜂鸣器提示/lcd1602/proteus
主要功能:
key9:主持人键 黄灯
key1~8:抢答人键 红灯
只有主持人按下后,抢答才有效,都有声音提示
主持人按下前:lcd显示 SUSPEND 暂停
主持人按下,抢答人按下前://lcd显示 START 开始 // D9亮//时间开始倒计时
抢答人按下:lcd显示 AND 结束 相应灯亮//时间停止
抢答结束所有按键不再起作用
Proteus仿真原理图:
抢答器1602.PNG
(125.44 KB, 下载次数: 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 ";//结束
uchar table4[]=" 00:03:00";//抢答时间
uchar fen,miao,sfmshi,sfmge,count,temp,flag,num,aa,bb,cc;
/*************************************************************
延时函数 ms
*************************************************************/
void delay(uint t)
{
uint x,y;
for(x=t;x>0;x--)
for(y=110;y>0;y--);
}
/*************************************************************
lcd1602指令写入函数
*************************************************************/
void write_com(uchar com)
{
P0=com;
rs=0;//rs低,指令
rw=0;//低,写
lcden=0;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
/*************************************************************
lcd1602数据写入函数
*************************************************************/
void write_date(uchar date)
{
P0=date;
rs=1;//rs高,数据
rw=0;//低,写
lcden=0;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
/*************************************************************
lcd1602初始化函数
*************************************************************/
void init()
{
fen=3;
miao=0;
write_com(0x38);//选择16x2显示,5x7点阵
delay(5);
write_com(0x0f);//开显示,开光标,光标闪烁
delay(5);
write_com(0x06);//读或写后,指针加一,光标加一
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关闭,待主持按下
}
/*************************************************************
显示状态函数
*************************************************************/
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);
}
}
/*************************************************************
初始化时间函数
*************************************************************/
void display2()
{
uchar i;
write_com(0x80+0x40);//lcd1602第二行第一位 指令
delay(5);
for(i=0;i<12;i++)
{
write_date(table4[i]);
delay(5);
}
}
/*************************************************************
显示时间函数
*************************************************************/
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);
}
/*************************************************************
按键检测并时实还回按键号数
*************************************************************/
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函数
*************************************************************/
void main()
{
init();
display1();
display2();
write_com(0x0c);//开显示,关闭光标,不闪烁
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;
}
}
复制代码
因文章限制,全部资料在下面压缩包中........
多路抢答器.zip
(94.28 KB, 下载次数: 64)
2020-12-9 00:18 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
wuwenyu
时间:
2020-12-17 12:32
为什么这个代码我复制了,但是创建不了,麻烦大神求救!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1