基于51单片机的16人抢答器
(仿真+程序+设计报告)
功能介绍
具体功能:
1.主持人按键可以调整倒计时间,初始时间97s;
2.若没开始,选手进行抢答,数码管会显示违规选手号码;
3.当主持人按下“开始”按钮,数码管显示倒计时,选手开始抢答;
4.当选手抢答到,数码管会显示选手号码和抢答到的时间,对应选手的LED灯也会闪烁;
5.主持人按复位按键重新开始;
添加图片注释,不超过 140 字(可选)
程序
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
#define uchar unsigned char; //定义数据类型 程序中遇到unsigned char 则用uchar替换
#define uint unsigned int; //定义数据类型 程序中遇到unsigned int 则用uint替换
/***微信公众号:木子单片机********/
sbit add=P2^0;
sbit jian=P2^1;
sbit beep=P2^2; //定义报警输入端口
sbit start=P2^3;
sbit WEI=P2^7; //定义锁存使能端口 位锁存
sbit DUAN=P2^6; //定义锁存使能端口 段锁存
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
sbit key5=P1^4;
sbit key6=P1^5;
sbit key7=P1^6;
sbit key8=P1^7;
sbit key9=P3^0;
sbit key10=P3^1;
sbit key11=P3^2;
sbit key12=P3^3;
sbit key13=P3^4;
sbit key14=P3^5;
sbit key15=P3^6;
sbit key16=P3^7;
uchar code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
uchar code dofly_WeiMa[10]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
uchar code table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar TempData[8]; //存储显示值的全局变量
//函数声明
void DelayUs2x(unsigned char t);
void DelayMs(unsigned char t);
void Delay(unsigned char t);
void Display(unsigned char FirstBit,unsigned char Num);
void check1();
void check2();
void keyscan();
uchar n,m,num,t,time;
bit flag;
/*---------------------------------------------------
主函数
---------------------------------------------------*/
void main (void)
{
EA=1;
TMOD=0x11;
TH0=(65536-50000)/256;//这是50ms的
TL0=(65536-50000)%256;
ET0=1;
TR0=0;
TH1=(65536-50000)/256;//这是50ms的
TL1=(65536-50000)%256;
ET1=1;
TR1=1;
time=97;
num=0;
flag=0;
while (1) //主循环
{
TempData[2]=dofly_DuanMa[time/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[3]=dofly_DuanMa[time%10];
if(num!=0)
m=1;
if(start==0)
{
DelayMs(10);
if(start==0)
{
flag=1;
while(!start);
}
}
if(add==0)
{
DelayMs(10);
if(add==0)
{
time++;
while(!add);
}
}
if(jian==0)
{
DelayMs(10);
if(jian==0)
{
time--;
while(!jian);
}
}
if(time>=99)
time=99;
if(flag==0)
{
if(num!=0)
m=1;
keyscan();
check2();
}
if(flag==1)
{
TR0=1;
if(num!=0)
m=1;
keyscan();
check1();
}
//主循环中添加其他需要一直工作的程序
}
}
void timer_t0() interrupt 1
{
TH0=(65536-50000)/256;//这是50ms的
TL0=(65536-50000)%256;
t++;
beep=0;
if(t==20)//设置为20,就是1s为高1s为低
{
beep=1;
t=0;
time--;
TempData[2]=dofly_DuanMa[time/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[3]=dofly_DuanMa[time%10];
if(time<=0)
{
time=0;
}
}
}
void timer_t1() interrupt 3
{
TH1=(65536-50000)/256;//这是50ms的
TL1=(65536-50000)%256;
Display(0,8); //数码管显示函数
}
void check1()
{
if(num==1)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[4]=table[0];
beep=1;
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==2)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[4]=table[1];
beep=1;
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==3)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[4]=table[2];
beep=1;
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==4)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[4]=table[3];
beep=1;
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==5)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[4]=table[4];
beep=1;
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==6)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[4]=table[5];
beep=1;
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==7)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[4]=table[6];
beep=1;
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==8)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[4]=table[7];
beep=1;
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==9)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[5]=table[0];
beep=1;
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
//完整资料
8/***微信公众号:木子单片机********/
if(num==10)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[5]=table[1];
beep=1;
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==11)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[5]=table[2];
beep=1;
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==12)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[5]=table[3];
beep=1;
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==13)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[5]=table[4];
beep=1;
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==14)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[5]=table[5];
beep=1;
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==15)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[5]=table[6];
beep=1;
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==16)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[5]=table[7];
beep=1;
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
}
void check2()
{
if(num==1)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[3]=0x40;
TempData[4]=table[0];
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==2)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[3]=0x40;
TempData[4]=table[1];
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==3)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[3]=0x40;
TempData[4]=table[2];
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==4)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[3]=0x40;
TempData[4]=table[3];
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==5)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[3]=0x40;
TempData[4]=table[4];
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==6)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[3]=0x40;
TempData[4]=table[5];
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==7)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[3]=0x40;
TempData[4]=table[6];
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==8)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[3]=0x40;
TempData[4]=table[7];
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==9)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[3]=0x40;
TempData[5]=table[0];
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==10)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[3]=0x40;
TempData[5]=table[1];
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==11)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[5]=table[2];
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==12)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[3]=0x40;
TempData[5]=table[3];
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==13)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[3]=0x40;
TempData[5]=table[4];
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==14)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[3]=0x40;
TempData[5]=table[5];
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==15)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[3]=0x40;
TempData[5]=table[6];
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
if(num==16)
{
TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6 68%10=8
TempData[3]=0x40;
TempData[5]=table[7];
Display(0,8); //数码管显示函数
TR0=0;
while(m);
}
}
硬件设计
使用元器件:
单片机:AT89C52;
(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)
添加图片注释,不超过 140 字(可选)
设计资料
01仿真图
本设计使用Proteus7.8和Proteus8.9两个版本设计!具体如图!
添加图片注释,不超过 140 字(可选)
02程序
本设计使用Keil5版本编程设计!具体如图!
添加图片注释,不超过 140 字(可选)
03参考报告
九千字参考报告,具体如下!
添加图片注释,不超过 140 字(可选)
04设计资料
全部资料包括程序(含注释)、仿真源文件 、参考报告等。具体内容如下,全网最全! !
添加图片注释,不超过 140 字(可选)
大家共同学习进步:
点赞分享一起学习成长。