1001-基于51单片机LCD液晶显示器的8路抢答器(8路,串口,LCD1602)原理图 仿真 源代码
功能描述:
8路抢答器
1、提前抢答视为违规抢答,蜂鸣器提示
2、A机为选手按钮控制,B机为主持人控制。双机通过串口通信
3、可设置抢答时间:10s,20s,30s,40s
4、LCD显示抢答过程
有哪些资料:
1、仿真工程文件
2、源代码工程文件(A、B两套代码)
3、原理图工程文件
4、流程图(A、B)
5、功能介绍
6、元件清单
#include "reg51.h"
#include "lcd1602.h"
#define uchar unsigned char
#define uint unsigned int
sbit k1=P3^4;//按钮
sbit k2=P3^5;
sbit k3=P3^6;
sbit k4=P3^7;
sbit led1=P1^7;//led
sbit led2=P2^0;
sbit beep=P2^1;//蜂鸣器
sbit P15=P1^5;
uchar time=0,mode=0,sec=0;//系统变量
uchar start=0;//开始
uchar miao=0;//倒计时
uchar disp1[]="00s";
uchar disp2[]="00 ";
uchar beep_time=0;
uchar num=0;//选手编号
//键值读取
uchar key_scan()
{
return(P1 & 0x0f);
}
void main()//主函数
{
init_1602();//初始化LCD
TMOD|=0X01;
TH0=0X3C;
TL0=0XB0;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
while(1)
{
if(!k1)//开始
{
start=1;
num=0;
write_com(1);
beep_time=5;
while(!k1);
}
if(!k2)//停止
{
start=4;
write_com(1);
beep_time=5;
while(!k2);
}
if(start==0)//切换时间
{
if(!k4)
{
if(mode<3)
mode++;
else
mode=0;
while(!k4);
}
P15=1;
led1=1;
led2=1;
}
if(start==1) //抢答
{
P15=0;
if(key_scan()<0x0f)
{
num=key_scan();
start=4;
beep_time=10;
}
led1=0;
}
if(!k3)//复位
{
start=0;
miao=0;
num=0;
write_com(1);
while(!k3);
}
if(start==0)//违规抢答
{
if(key_scan()<0x0f)
{
beep_time=40;
start=2;
write_com(1);
disp1[0]=key_scan()/10+0x30;
disp1[1]=key_scan()%10+0x30;
while(key_scan()<0x0f);
while(beep_time>0);
start=0;
write_com(1);
}
}
}
}
//定时器中断
void Timer0() interrupt 1
{
if(time<20)//1s
time++;
else
{
time=0;
if(start==1) //倒计时
{
if(miao>0)
miao--;
else
{ //抢答超时
start=3;
beep_time=40;
write_com(1);
delay_uint(10000);
}
}
}
if(sec<10)//0.5s
sec++;
else
{
sec=0;
if(start==0)//初始界面
{
write_string(1,0,"Welcom!");
miao=mode*10+10;
disp1[0]=miao/10+0x30;
disp1[1]=miao%10+0x30;
write_string(2,6,disp1);
}
if(start==1)//抢答界面
{
write_string(1,0,"go!");
disp1[0]=miao/10+0x30;
disp1[1]=miao%10+0x30;
write_string(2,6,disp1);
}
if(start==2)//违规抢答
{
write_string(1,0,"Error:");
write_string(1,6,disp1);
}
if(start==3)//抢答超时
{
write_string(1,0,"Over Time");
}
if(start==4)//停止,结束
{
led2=0;
write_string(1,0,"Winner:");
disp2[0]=num/10+0x30;
disp2[1]=num%10+0x30;
write_string(2,6,disp2);
}
}
if(beep_time>0)//蜂鸣器控制
{
beep_time--;
beep=0;
}
else
beep=1;
TH0=0X3C;
TL0=0XB0;
}