基于51单片机的八路抢答器
(仿真+程序+原理图+PCB+设计报告)
功能介绍
具体功能:
1.主持人按下开始,8位选手开始抢答;
2.抢答时间60秒,主持人可以暂停抢答;
3.倒计时最后5秒蜂鸣器会滴滴提醒;
4.选手抢答成功,数码管会显示其号码;
5.按下复位按键进入新一轮;
演示视频:
基于51单片机的八路抢答器设计
添加图片注释,不超过 140 字(可选)
程序
#include<reg51.h>
/***微信公众号:木子单片机********/
#include<intrins.h>
sbit smg1=P2^0; //定义数码管第一位
sbit smg2=P2^1; //定义数码管第二位
sbit smg3=P2^2; //定义数码管第三位
sbit keyks=P3^0; //定义开始按键
sbit keytz=P3^1; //定义停止按键
sbit keyqc=P3^2; //定义清除按键
sbit key1=P1^0; //定义1号抢答选手
sbit key2=P1^1; //定义2号抢答选手
sbit key3=P1^2; //定义3号抢答选手
sbit key4=P1^3; //定义4号抢答选手
sbit key5=P1^4; //定义5号抢答选手
sbit key6=P1^5; //定义6号抢答选手
sbit key7=P1^6; //定义7号抢答选手
sbit key8=P1^7; //定义8号抢答选手
sbit spk=P3^7; //定义蜂鸣器
int djs=60,js=0; //djs和bt是初始倒计时时间,可修改
//int table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x40};
void delayms(int x) //延时函数
{
char i;
while(x--)
{
for(i=500;i>0;i--);
}
}
void Timer0_init() //定时器0初始化
{
js=0;
TMOD=0x01; //T0为定时器方式1
TH0=0x4c;
TL0=0x00;
//TR0=1;//IT1=1;
ET0=1;//EX1=1;
EA=1;
}
void timer0() interrupt 1 using 1 //定时器0中断服务函数
{
TF0=0;
TH0=0x4c;
TL0=0x00; //赋初值
js++;
if(js==15)
{ js=0;
djs--; //产生1s的倒计时
//led1=~led1;
}
}
void djsxs() //显示倒计时函数
{ int b1,b2;
b1=djs/10;
b2=djs%10; // 将倒计时时间分成高低位
P0=table[b1];
smg2=0;
delayms(3);
smg2=1; //显示十位数字
P0=table[b2];
smg3=0;
delayms(3); //显示个位数字
smg3=1;
}
void djsxs22()
{
P0=0x40;
smg1=0;
delayms(3);
smg1=1; //第一位数码管显示-
P0=0x40;
smg2=0;
delayms(3); //第三位数码管显示-
smg2=1;
P0=0x40;
smg3=0;
delayms(3);
smg3=1; //第四位数码管显示-
}
void djsxs1()
{
P0=table[1];
smg1=0;
delayms(3);
smg1=1; //第一位数码管显示1
}
void djsxs2()
{
P0=table[2];
smg1=0;
delayms(3);
smg1=1; //第一位数码管显示2
}
void djsxs3()
{
P0=table[3];
smg1=0;
delayms(3);
smg1=1; //第一位数码管显示3
}
void djsxs4()
{
P0=table[4];
smg1=0;
delayms(3);
smg1=1; //第一位数码管显示4
}
void djsxs5()
{
P0=table[5];
smg1=0;
delayms(3);
smg1=1; //第一位数码管显示5
}
void djsxs6()
{
P0=table[6];
smg1=0;
delayms(3);
smg1=1; //第一位数码管显示6
}
void djsxs7()
{
P0=table[7];
smg1=0;
delayms(3);
smg1=1; //第一位数码管显示7
}
void djsxs8()
{
P0=table[8];
smg1=0;
delayms(3);
smg1=1; //第一位数码管显示8
}
void main()
{
int djs1=60;
Timer0_init(); //初始化定时器中断
spk=1; //蜂鸣器不响
djs=60; //倒计时赋值
while(1)
{
LOOP1: djs=djs1;
djsxs22(); //LOOP1是标号,显示 - --
if(key1==0) //在定时器运行状态下,key1==0 则说明1号选手按下按键
{
delayms(3);
if(key1==0)
{
while(!key1); //去除按键抖动后,重新在判断,是否确实按下
djs=60;
/* while(1)
{
TR0=0; //定时器停止
djsxs();
if(key2==0) //复位按下按下
{
delayms(3); //去除抖动
if(key2==0) //再次判断是否按下复位按键
{
while(!key2); //如果按下复位键,则回到- --状态
djs++;
djs1=djs;
}
}
if(key3==0) //复位按下按下
{
delayms(3); //去除抖动
if(key3==0) //再次判断是否按下复位按键
{
while(!key3); //如果按下复位键,则回到- --状态
djs--;
djs1=djs;
}
}
if(key1==0) //复位按下按下
{
delayms(3); //去除抖动
if(key1==0) //再次判断是否按下复位按键
{
while(!key1); //如果按下复位键,则回到- --状态
goto LOOP1; //goto语句,回到loop1表号处
}
}
} */
}
}
if(keyks==0)
{
//spk=0;
delayms(3); //去除按键抖动
if(keyks==0)
{
while(!keyks); //以上表示按下开始按键
//spk=1; //蜂鸣器不响
TR0=1; //启动定时器 开始倒计时
while(1)
{
djsxs();
if(keytz==0)
{
delayms(3); //此处表示出去抖动, 以后不一一标出
if(keytz==0)
{
while(!keytz); //以上表示按下停止按键后
TR0=0; //定时器停止
}
}
if(keyks==0)
{
//spk=0;
delayms(3);
if(keyks==0)
{
while(!keyks); //以上表示按下清楚按键后
//spk=1; //蜂鸣器不响
TR0=1; //定时器启动
}
}
硬件设计
使用元器件:
单片机:STC89C52;
(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)
IC座:DIP40;万能板:9*15;
数码管:MT03621AR;
排阻:1K*8;电容:22pF;
三极管:9012;按键:6*6*5;
晶振:11.0592;电阻:1K;
接线端子:5.08*2P;
蜂鸣器:有源 5V;
电容:10uF/16V;
自锁开关:8*8;
导线:若干;
添加图片注释,不超过 140 字(可选)
流程图
添加图片注释,不超过 140 字(可选)
设计资料
01仿真图
本设计使用proteus7.8和proteus8.9两个版本设计,向下兼容,无需担心!具体如图!
添加图片注释,不超过 140 字(可选)
02原理图
本系统原理图采用Altium Designer19设计,具体如图!
添加图片注释,不超过 140 字(可选)
03程序
本设计使用软件keil5版本编程设计!具体如图!
添加图片注释,不超过 140 字(可选)
04设计报告
八千字设计报告,具体如下!
添加图片注释,不超过 140 字(可选)
05设计资料
全部资料包括程序(含注释)、仿真源文件 、AD原理图、PCB、设计报告、流程图、实物图、元件清单、实物演示视频等。具体内容如下,全网最全!!
添加图片注释,不超过 140 字(可选)
资料获取请观看前面演示视频!
点赞分享一起学习成长。