基于51单片机的八路竞赛抢答器设计
目录
- 基于51单片机的八路抢答器设计
- 1、主要功能
- 2、仿真图
- 3、测试图
- 4、程序源码
- 5、资源获取
基于51单片机的八路抢答器设计
1、主要功能
利用STC89C52单片机及外围接口实现的抢答系统;在抢答过程中,只有启动抢答后才有效,如果在开始抢答前抢答为无效;抢答限定时间为60秒,倒计时为5秒时蜂鸣器报警,选手抢答成功后显示选手编号以及剩余时间。
2、仿真图
3、测试图
当选手6抢答后,数码管会显示6号选手抢答成功。
4、程序源码
/*************************************** Copyright ****************************** File name: // 8路抢答器Author:KevinVersion: //1.0Description: // 用于详细说明此程序文件完成的主要功能Others: // 其它内容的说明Log: // 公众号:Kevin的学习站*******************************************************************************/#include<reg51.h>
#include<intrins.h>
sbit smg1=P2^4; //定义数码管第一位
sbit smg2=P2^6; //定义数码管第二位
sbit smg3=P2^7; //定义数码管第三位
sbit smg4=P2^5;sbit keyks=P2^2; //定义开始按键
sbit keytz=P2^1; //定义停止按键
sbit keyqc=P2^0; //定义清除按键sbit key1=P1^4; //定义1号抢答选手
sbit key2=P1^5; //定义2号抢答选手
sbit key3=P1^6; //定义3号抢答选手
sbit key4=P1^7; //定义4号抢答选手
sbit key5=P3^4; //定义5号抢答选手
sbit key6=P3^5; //定义6号抢答选手
sbit key7=P3^6; //定义7号抢答选手
sbit key8=P3^7; //定义8号抢答选手
sbit spk=P1^0; //定义蜂鸣器int djs=60,js=0; //djs和bt是初始倒计时时间,可修改
unsigned char flag=0;
//int table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int table[]={0x5f,0x44,0x9d,0xd5,0xc6,0xd3,0xdb,0x45,0xdf,0xd7,0x80};void delayms(int x) //延时函数
{char i;
while(x--){for(i=500;i>0;i--); }
}void Timer0_init() //定时器0初始化
{js=0;TMOD=0x01; //T0为定时器方式1TH0=60;TL0=176; //TR0=1;//IT1=1;ET0=1;//EX1=1;EA=1;
}void timer0() interrupt 1 using 1 //定时器0中断服务函数
{TF0=0;TH0=60;TL0=176; //赋初值js++;if(flag==1){if(js<8)spk=0;else spk=1;}if(js==20) { js=0;djs--; //产生1s的倒计时}
}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 djsxs30() //第二位数码管显示-
{P0=0x80; //第二位数码管smg4=0;delayms(3);smg4=1;
}
void djsxs22()
{ P0=0x80;smg1=0;delayms(3);smg1=1;//第一位数码管显示-P0=0x80; //第二位数码管smg4=0;delayms(3);smg4=1;P0=0x80;smg2=0;delayms(3); //第三位数码管显示-smg2=1;P0=0x80;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(8); //去除抖动if(key2==0) //再次判断是否按下复位按键{do{ while(!key2); //如果按下复位键,则回到- --状态delayms(5);}while(key2!=1);djs++;djs1=djs;}}if(key3==0) //复位按下按下{ delayms(8); //去除抖动if(key3==0) //再次判断是否按下复位按键{ do{while(!key3); //如果按下复位键,则回到- --状态delayms(5); }while(key3!=1);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; //定时器停止flag=0;//spk=1;}}}if(keyks==0){//spk=0;delayms(3);if(keyks==0){ while(!keyks); //以上表示按下清楚按键后 //spk=1; //蜂鸣器不响TR0=1; //定时器启动}}
/***************************以下是八个选手抢答,key1表示1号选手,依次类推,注释只写第一位选手,其他和第一个完全一致,************************************/if((key1==0)&&(TR0==1)) //在定时器运行状态下,key1==0 则说明1号选手按下按键{ spk=0; //蜂鸣器响delayms(3);if(key1==0){ while(!key1); //去除按键抖动后,重新在判断,是否确实按下{spk=1; //蜂鸣器不响flag=0;//清0最后五秒响蜂鸣器}while(1){TR0=0; //定时器停止djsxs1(); //显示选手编号djsxs30(); //第二位数码管显示-djsxs(); //显示剩余倒计时时间if(keyqc==0){ delayms(3); //去除抖动if(keyqc==0){ while(!keyqc); //如果按下清楚键,则回到- --状态goto LOOP1; //goto语句,回到loop1表号处}} }}}if((key2==0)&&(TR0==1)){ spk=0;delayms(3);if(key2==0){ while(!key2);{spk=1;flag=0;//清0最后五秒响蜂鸣器}while(1){TR0=0;djsxs2();djsxs30(); //第二位数码管显示-djsxs();if(keyqc==0){ delayms(3);if(keyqc==0){ while(!keyqc);goto LOOP1; }} }}}if((key3==0)&&(TR0==1)){ spk=0;delayms(3);if(key3==0){ while(!key3);{spk=1;flag=0;//清0最后五秒响蜂鸣器}while(1){TR0=0;djsxs3();djsxs30(); //第二位数码管显示-djsxs();if(keyqc==0){ delayms(3);if(keyqc==0){ while(!keyqc);goto LOOP1; }} }}}if((key4==0)&&(TR0==1)){ spk=0;delayms(3);if(key4==0){ while(!key4);{spk=1;flag=0;//清0最后五秒响蜂鸣器}while(1){TR0=0;djsxs4();djsxs30(); //第二位数码管显示-djsxs();if(keyqc==0){ delayms(3);if(keyqc==0){ while(!keyqc);goto LOOP1; }} }}}if((key5==0)&&(TR0==1)){ spk=0;delayms(3);if(key5==0){ while(!key5);{spk=1;flag=0;//清0最后五秒响蜂鸣器}while(1){TR0=0;djsxs5();djsxs30(); //第二位数码管显示-djsxs();if(keyqc==0){ delayms(3);if(keyqc==0){ while(!keyqc);goto LOOP1; }} }}}if((key6==0)&&(TR0==1)){ spk=0;delayms(3);if(key6==0){ while(!key6);{spk=1;flag=0;//清0最后五秒响蜂鸣器}while(1){TR0=0;djsxs6();djsxs30(); //第二位数码管显示-djsxs();if(keyqc==0){ delayms(3);if(keyqc==0){ while(!keyqc);goto LOOP1; }} }}}if((key7==0)&&(TR0==1)){ spk=0;delayms(3);if(key7==0){ while(!key7);{spk=1;flag=0;//清0最后五秒响蜂鸣器}while(1){TR0=0;djsxs7();djsxs30(); //第二位数码管显示-djsxs();if(keyqc==0){ delayms(3);if(keyqc==0){ while(!keyqc);goto LOOP1; }} }}}if((key8==0)&&(TR0==1)){ spk=0;delayms(3);if(key8==0){ while(!key8);{spk=1;flag=0;//清0最后五秒响蜂鸣器}while(1){TR0=0;djsxs8();djsxs30(); //第二位数码管显示-djsxs();if(keyqc==0){ delayms(3);if(keyqc==0){ while(!keyqc);goto LOOP1; }} }}} if(djs<=5) flag=1; //spk=0; //到倒计时小于5是,蜂鸣器响if(djs==0) //当倒计时时间等于0后,需要按清楚键恢复{flag=0;spk=1;while(1){if(keyqc==0){ delayms(3);if(keyqc==0){ while(!keyqc);spk=1; goto LOOP1; }}}} }}}}
}
5、资源获取
项目的仿真和程序工程已经放在下面公众号里面,可以关注公众号:Kevin的学习站,输入关键字:“051”,就可以获取啦!创作不易,但您的点赞、关注、收藏就是对我最大的鼓励!
基于51单片机的八路竞赛抢答器设计相关推荐
- 单片机六位抢答器c语言程序,八路电子抢答器(基于51单片机的8路抢答器设计C语言程序)...
哥,你还有AT89C51单片机8路抢答器的资料吗 哥,你还有AT89C51单片机8路抢答器的资料吗 AT89C51单片机8路抢答器的资料 源程序如下 #include #define uchar un ...
- 基于51单片机8位竞赛抢答器_倒计时可调+LED跑马灯
基于51单片机8位竞赛抢答器_倒计时可调+LED跑马灯仿真设计 (程序+proteus仿真+报告) Proteus仿真版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C ...
- c语言六位抢答器课程设计,基于c语言单片机8位竞赛抢答器设计课程设计.docx
基于c语言单片机8位竞赛抢答器设计课程设计 课程设计报告课程名称:单片机课程设计报告题目:8位竞赛抢答器的设计学生姓名:所在学院:信息科学与工程学院专业班级:学生学号:指导教师:2013 年12月25 ...
- c51的八位智力抢答器C语言编程,基于AT89C51单片机的八位智力抢答器设计.doc
基于AT89C51单片机的八位智力抢答器设计 江 西 理 工 大 学 南 昌 校 区 毕 业 设 计(论文) 题 目:八位智力抢答器 系 :信息工程系 专 业:应用电子技术 班 级: 学 生: 学 号 ...
- android防丢器设计,☆基于51单片机的无线防丢器设计|可以防止儿童走丢的神奇...
当前浏览器不支持播放音乐或语音,请在微信或其他浏览器中播放总体概述 本设计是基于51单片机和2.4g无线模块NRF24L01实现的防丢器.当发射器模块在无线接收范围的区域内时,接收器便会得到报警和指示 ...
- 【单片机系列】基于51单片机的16路抢答器
1.功能介绍 抢答器是一种应用非常广泛的设备,在各种竞赛.抢答场合中,它能迅速.客观的分辨出最先获得发言权的选手.早期的抢答器只有几个三极管.可控硅.发光管等组成,能通过发光管的指示辨认出选手 ...
- 基于51单片机的8路抢答器proteus仿真 汇编语言程序设计
硬件设计 上一篇讲了基于C语言的抢答器,下边讲一下基于汇编语言的抢答器. 仿真图: 程序设计 OK EQU 20H ;抢答开始标志位RING EQU 22H ;响铃标志位 DATA0 EQU 36H ...
- 基于51单片机蜂鸣器的音乐播放器设计C
原理图: 代码: #include <reg51.h> #include <stdio.h> sbit beep = P2^3; unsigned char timer0h, ...
- 【Proteus仿真】基于51单片机的八路抢答器
[Proteus仿真]基于51单片机的八路抢答器 Proteus仿真 主要功能和使用介绍 采用4位数码管设计. 下排按键一一对应八位选手. 上排三个按键,从走到右依次为:开始.暂停.复位. 操作流程: ...
最新文章
- javascript保留字
- 北京决心一试:如何打造中国的HHMI和贝尔实验室?
- FREE 开源 API 管理工具等
- 快速实现移动端短视频功能?没你想得那么难!
- 今日笔记!——分析Java应用性能
- windows上QT设置debugger的方法
- java 创建txt_JAVA读取TXT文件、新建TXT文件、写入TXT文件
- uint8_t和char的相互转换
- \t\t桌面图标无法删除 删除桌面IE图标 桌面图标整理
- 管理好团队的七个要点,你做到了几个?
- 使用TestCafe进行UI测试
- x-杂项-maven-repository-lombok-intro:使用PROJECT LOMBOK减少BOILERPLATE代码
- 【流体机械原理及设计03】
- MMX和SSE的运用
- ILSpy中baml转化为xaml的改进(三)
- python数据类型(一)
- ESL第十七章 无向图模型 学习/推断/成对马尔可夫独立/全局马尔可夫性、协方差图/高斯图/修改回归算法/图结构估计/图lasso、【受限】玻尔兹曼机/泊松对数线性建模/迭代比例过滤/对比散度
- [JZOJ5445]失格
- android 主题 设置统一背景_安卓自定义系统背景美化主题及修改教程
- yolov5识别吸烟(含数据集)