找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 17874|回复: 8
打印 上一主题 下一主题
收起左侧

四路抢答器电路图与单片机源程序

[复制链接]
跳转到指定楼层
楼主
电路原理图如下:


四路抢答器电路设计 设计指标: 基本功能 可同时供 4 名选手参赛,其编号分别是 1 到 4,各用一个抢答按钮

单片机源码:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. char s;
  5. uchar num=0;
  6. char time=20;         //抢答时间
  7. char datitime=30;        //答题限时时间
  8. uint tt,t1;        //T0,T1定时器定一秒时
  9. bit flag,s_flag=1,b_flag,fall_flag;        //标志位
  10. bit K_startcountflag,K_timecountflag;        //时间调整标志位
  11. sbit K0=P3^0;
  12. sbit beep=P3^7;         //蜂鸣器输出口
  13. sbit rled=P3^1;                //指示灯输出口
  14. sbit K1=P1^0;               
  15. sbit K2=P1^1;
  16. sbit K3=P1^2;
  17. sbit K4=P1^3;
  18. sbit K_Time=P3^2;        //答题计时键
  19. sbit K_startcount=P3^3;        //开始抢答时间调整键
  20. sbit K_timecount=P3^4;        //答题计时时间调整键
  21. void delay(uchar ms)
  22. {
  23.         uchar y;
  24.         for(;ms>0;ms--)
  25.                 for(y=120;y>0;y--);
  26. }
  27. uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,
  28. 0x66,0x6d,0x7d,0x07,
  29. 0x7f,0x6f,0x77,0x7c,
  30. 0x39,0x5e,0x79,0x71
  31. };
  32. uchar code tablewe[]={0XFE,0XFD,0XFB,0XF7};
  33. void T0_Init(void)
  34. {
  35.         TMOD=0X01;
  36.         TH0=(65536-2000)/256;
  37.         TL0=(65536-2000)%256;
  38.         TH1=(65536-2000)/256;
  39.         TL1=(65536-2000)%256;
  40.         ET0=1;
  41.         ET1=1;
  42.         EA=1;
  43.         P0=0;
  44. }
  45. void Key_Scan(void)                //开始键扫描
  46. {
  47.         if(K0==0)
  48.         {
  49.                 delay(10);
  50.                 if(K0==0)
  51.                 {
  52.                         while(!K0);
  53.                         TR0=1;
  54.                         s=time;
  55.                         tt=0;
  56.                         flag=1;
  57.                         s_flag=1;
  58.                         b_flag=1;
  59.                         num=0;
  60.                         beep=1;
  61.                         rled=1;
  62.                         fall_flag=0;        //清除违规标志位
  63.                         K_startcountflag=0;
  64.                         K_timecountflag=0;
  65.                 }
  66.         }
  67. }
  68. void Scan(void)                //四路热键扫描(哪个键先按下,哪个优先级最高)
  69. {
  70.         if(K1==0)
  71.         {
  72.                 delay(10);
  73.                 if(K1==0)
  74.                 {
  75.                         while(!K1);
  76.                         num=1;                //数码管显示1号"1"
  77.                         TR0=0;                //关闭定时器0,时间停止
  78.                         TR1=1;                //打开定时器1,使扬声器响一声
  79.                         s_flag=0;        //关闭开始键标志位,使再按其他三个键不会响应
  80.                 }
  81.         }
  82.         if(K2==0)                        //下面三个键的处理同上
  83.         {
  84.                 delay(10);
  85.                 if(K2==0)
  86.                 {
  87.                         while(!K2);
  88.                         num=2;               
  89.                         TR0=0;
  90.                         TR1=1;
  91.                         s_flag=0;        //重要
  92.                 }
  93.         }
  94.         if(K3==0)
  95.         {
  96.                 delay(10);
  97.                 if(K3==0)
  98.                 {
  99.                         while(!K3);
  100.                         num=3;
  101.                         TR0=0;
  102.                         TR1=1;
  103.                         s_flag=0;
  104.                 }
  105.         }
  106.         if(K4==0)
  107.         {
  108.                 delay(10);
  109.                 if(K4==0)
  110.                 {
  111.                         while(!K4);
  112.                         num=4;
  113.                         TR0=0;
  114.                         TR1=1;
  115.                         s_flag=0;
  116.                 }
  117.         }
  118. }
  119. void display(void)
  120. {
  121.         if(flag==1)                //开始键按下,开始计时抢答
  122.         {
  123.                 if(num!=0)        //如果有人抢答,则显示相应的几号
  124.                 {
  125.                         P0=tabledu[num];        //显示几号抢到了
  126.                         P2=tablewe[0];
  127.                         delay(2);
  128.                         P0=0;
  129.                         P2=0XFF;
  130.                 }
  131.                 else                //否则没人抢答,则前面不显示几号
  132.                 {
  133.                         P0=0;               
  134.                         P2=0XFF;
  135.                 }
  136.                 P0=tabledu[s/10];                //下面为显示抢答倒计时
  137.                 P2=tablewe[2];
  138.                 delay(2);
  139.                 P0=0;
  140.                 P2=0XFF;
  141.                 P0=tabledu[s%10];
  142.                 P2=tablewe[3];
  143.                 delay(2);
  144.                 P2=0XFF;
  145.                 P0=0;
  146.         }
  147.                
  148. }
  149. void Time_Scan(void)                //调整时间键扫描
  150. {
  151.         if(K_startcount==0)                //抢答时间调整
  152.         {
  153.                 delay(10);
  154.                 if(K_startcount==0)      
  155.                 {
  156.                         while(!K_startcount);
  157.                         time++;                       
  158.                         if(time==50)
  159.                         {
  160.                                 time=20;
  161.                         }
  162.                         K_startcountflag=1;        //将抢答时间标志位置1
  163.                         K_timecountflag=0;        //同时关闭答题时间标志位
  164.                 }
  165.         }
  166.         if(K_timecount==0)                //答题时间调整
  167.         {
  168.                 delay(10);
  169.                 if(K_timecount==0)
  170.                 {
  171.                         while(!K_timecount);
  172.                         datitime++;
  173.                         if(datitime==60)
  174.                         {
  175.                                 datitime=30;
  176.                         }
  177.                         K_timecountflag=1;
  178.                         K_startcountflag=0;
  179.                 }
  180.         }
  181. }
  182. void main(void)
  183. {
  184.         T0_Init();
  185.         while(1)
  186.         {
  187.                 Key_Scan();                //开始键扫描
  188.                 if((flag==0)&(s_flag==1))        //当开始键没按下及没有人违规时才可进行时间调整
  189.                 {
  190.                         Time_Scan();
  191.                 }
  192.                 if((flag==1)&(s_flag==0))//当开始键按下及有人抢答才进行开始回答计时倒计时
  193.                 {
  194.                         if(K_Time==0)
  195.                         {
  196.                                 delay(10);
  197.                                 if(K_Time==0)
  198.                                 {
  199.                                         while(!K_Time);
  200.                                         s=datitime;
  201.                                         TR0=1;
  202.                                         tt=0;
  203.                                         TR1=1;
  204.                                 }
  205.                         }
  206.                 }      
  207.                 if((flag==0)&(s_flag==1))        //违规
  208.                 {
  209.                         Scan();
  210.                         if(num!=0)                //开始键没有按下时,有人按下了抢答器,则置违规标志位
  211.                         {
  212.                                 fall_flag=1;
  213.                                 rled=0;
  214.                         }
  215.                 }
  216.                 if((flag==1)&(s_flag==1))        //如果开始键按下且抢答键没有人按下,则进行八路抢答键扫描
  217.                 {
  218.                         Scan();
  219.                 }      
  220.                 display();                //显示到数码管上
  221.         }
  222. }
  223. void timer0(void) interrupt 1
  224. {
  225.         TH0=(65536-2000)/256;        //2ms
  226.         TL0=(65536-2000)%256;
  227.         if(b_flag)        //开始(START)键按下,嘟一声(长1秒),表示开始抢答
  228.         {
  229.                 beep=~beep;
  230.         }
  231.         else
  232.         beep=1;
  233.         if(s<5)        //抢答时间快到报警,隔1秒响一声且红灯闪烁,响三声
  234.         {
  235.                 if(s%2==0)
  236.                 {
  237.                         b_flag=1;
  238.                         rled=0;      
  239.                 }
  240.                 else
  241.                 {
  242.                         b_flag=0;
  243.                         rled=1;
  244.                 }
  245.         }
  246.         tt++;      
  247.         if(tt==500)                //1秒
  248.         {
  249.                 tt=0;
  250.                 s--;
  251.                 b_flag=0;        //关闭开始键按下响一秒的嘟声
  252.                 if(s==-1)
  253.                 {
  254.                         s=20;      
  255.                         TR0=0;
  256.                         flag=0;        //显示F FF
  257.                         s_flag=1;
  258.                         num=0;
  259.                         rled=1;
  260.                 }
  261.         }
  262. }
  263. void timer1(void) interrupt 3        //定时器1处理有人按下抢答器嘟一声(长1秒)
  264. {
  265.         TH1=(65536-2000)/256;
  266.         TL1=(65536-2000)%256;
  267.         beep=~beep;
  268.         t1++;
  269.         if(t1==500)
  270.         {
  271.                 t1=0;
  272.                 TR1=0;
  273.         }
  274. }
复制代码




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:433370 发表于 2018-12-1 19:33 | 只看该作者
很好,很有帮助
回复

使用道具 举报

板凳
ID:489600 发表于 2019-3-13 18:50 | 只看该作者
我复制仿真之后数码管乱码
回复

使用道具 举报

地板
ID:492353 发表于 2019-3-17 00:37 | 只看该作者
lilili171 发表于 2019-3-13 18:50
我复制仿真之后数码管乱码

请问 乱码这个问题有解决吗 同样的问题
回复

使用道具 举报

5#
ID:492353 发表于 2019-3-17 00:38 | 只看该作者
请问 晶体管乱码是 什么原因造成的
回复

使用道具 举报

6#
ID:542113 发表于 2019-5-19 15:51 来自手机 | 只看该作者
lilili171 发表于 2019-3-13 18:50
我复制仿真之后数码管乱码

数码管是共阴极还是共阳极
回复

使用道具 举报

7#
ID:782689 发表于 2020-6-21 18:58 | 只看该作者
请问乱码问题有人解决了吗
回复

使用道具 举报

8#
ID:785439 发表于 2020-6-21 22:57 | 只看该作者
乱码问题有人解决了吗?
回复

使用道具 举报

9#
ID:974727 发表于 2021-10-26 10:02 | 只看该作者
我的也是乱码,害,不知道这么解决
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表