目录

  • 基于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单片机的八路竞赛抢答器设计相关推荐

  1. 单片机六位抢答器c语言程序,八路电子抢答器(基于51单片机的8路抢答器设计C语言程序)...

    哥,你还有AT89C51单片机8路抢答器的资料吗 哥,你还有AT89C51单片机8路抢答器的资料吗 AT89C51单片机8路抢答器的资料 源程序如下 #include #define uchar un ...

  2. 基于51单片机8位竞赛抢答器_倒计时可调+LED跑马灯

    基于51单片机8位竞赛抢答器_倒计时可调+LED跑马灯仿真设计 (程序+proteus仿真+报告) Proteus仿真版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C ...

  3. c语言六位抢答器课程设计,基于c语言单片机8位竞赛抢答器设计课程设计.docx

    基于c语言单片机8位竞赛抢答器设计课程设计 课程设计报告课程名称:单片机课程设计报告题目:8位竞赛抢答器的设计学生姓名:所在学院:信息科学与工程学院专业班级:学生学号:指导教师:2013 年12月25 ...

  4. c51的八位智力抢答器C语言编程,基于AT89C51单片机的八位智力抢答器设计.doc

    基于AT89C51单片机的八位智力抢答器设计 江 西 理 工 大 学 南 昌 校 区 毕 业 设 计(论文) 题 目:八位智力抢答器 系 :信息工程系 专 业:应用电子技术 班 级: 学 生: 学 号 ...

  5. android防丢器设计,☆基于51单片机的无线防丢器设计|可以防止儿童走丢的神奇...

    当前浏览器不支持播放音乐或语音,请在微信或其他浏览器中播放总体概述 本设计是基于51单片机和2.4g无线模块NRF24L01实现的防丢器.当发射器模块在无线接收范围的区域内时,接收器便会得到报警和指示 ...

  6. 【单片机系列】基于51单片机的16路抢答器

     1.功能介绍    抢答器是一种应用非常广泛的设备,在各种竞赛.抢答场合中,它能迅速.客观的分辨出最先获得发言权的选手.早期的抢答器只有几个三极管.可控硅.发光管等组成,能通过发光管的指示辨认出选手 ...

  7. 基于51单片机的8路抢答器proteus仿真 汇编语言程序设计

    硬件设计 上一篇讲了基于C语言的抢答器,下边讲一下基于汇编语言的抢答器. 仿真图: 程序设计 OK EQU 20H ;抢答开始标志位RING EQU 22H ;响铃标志位 DATA0 EQU 36H ...

  8. 基于51单片机蜂鸣器的音乐播放器设计C

    原理图: 代码: #include <reg51.h> #include <stdio.h> sbit beep = P2^3; unsigned char timer0h, ...

  9. 【Proteus仿真】基于51单片机的八路抢答器

    [Proteus仿真]基于51单片机的八路抢答器 Proteus仿真 主要功能和使用介绍 采用4位数码管设计. 下排按键一一对应八位选手. 上排三个按键,从走到右依次为:开始.暂停.复位. 操作流程: ...

最新文章

  1. javascript保留字
  2. 北京决心一试:如何打造中国的HHMI和贝尔实验室?
  3. FREE 开源 API 管理工具等
  4. 快速实现移动端短视频功能?没你想得那么难!
  5. 今日笔记!——分析Java应用性能
  6. windows上QT设置debugger的方法
  7. java 创建txt_JAVA读取TXT文件、新建TXT文件、写入TXT文件
  8. uint8_t和char的相互转换
  9. \t\t桌面图标无法删除 删除桌面IE图标 桌面图标整理
  10. 管理好团队的七个要点,你做到了几个?
  11. 使用TestCafe进行UI测试
  12. x-杂项-maven-repository-lombok-intro:使用PROJECT LOMBOK减少BOILERPLATE代码
  13. 【流体机械原理及设计03】
  14. MMX和SSE的运用
  15. ILSpy中baml转化为xaml的改进(三)
  16. python数据类型(一)
  17. ESL第十七章 无向图模型 学习/推断/成对马尔可夫独立/全局马尔可夫性、协方差图/高斯图/修改回归算法/图结构估计/图lasso、【受限】玻尔兹曼机/泊松对数线性建模/迭代比例过滤/对比散度
  18. [JZOJ5445]失格
  19. android 主题 设置统一背景_安卓自定义系统背景美化主题及修改教程
  20. yolov5识别吸烟(含数据集)

热门文章

  1. 菲涅尔透镜的原理及应用
  2. 决策树实例之预测隐形眼镜类型
  3. 矩阵加法python实现
  4. Storm集群安装及wordcount案例
  5. 向日葵控制ubuntu,显示连接已断开
  6. 用 Python 实现 扫雷小游戏
  7. WeakMap弱引用
  8. 红帽学习之红帽系统注册及登录
  9. window下如何设置屏幕扩展
  10. 安规电容知识详解,X电容和Y电容的作用以及应用、耐压选择