找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机数字电子抢答器程序

[复制链接]
跳转到指定楼层
楼主
ID:573960 发表于 2019-6-28 10:50 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
用八路抢答器实现 1、4、6按下后,裁判键按下不能复位。 1、4、6的复位需要关断电源开关后约20秒 少于20秒重新开电源时,仍显示146 2、3、5、8、0正常 7无法自锁。

单片机源程序如下:
  1. #include <reg51.h>                          
  2. #define LED P2  //宏定义,使用LED代替P3口(相当于LED=P3)
  3. #define uchar unsigned char        //用uchar代替unsigned char方便操作
  4. #define uint unsigned int
  5. sbit beep=P2^7;//蜂鸣器
  6. sbit BG=P3^7;//指示灯

  7. sbit key4=P1^0;//按键D
  8. sbit key2=P1^1;//按键B
  9. sbit key1=P1^2;//按键A
  10. sbit key3=P1^3;//按键C

  11. bit time_over=0;//倒计时结束标记                                                                  
  12. bit WARNING=0;//倒数十秒控制变量
  13. bit INT_ON=0;//中断标记
  14. bit key_down=0;//键盘辅助变量
  15. uchar RIGHT=0xff;//按键暂存器          

  16. uchar CONT=0;         //定时器辅助变量
  17. uchar res_time=0;//时间
  18. uchar set_time=30;

  19. uchar leds[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
  20.                                 0x90,0x88,0x83,0xa7,0xa1,0x86,0x8e,0xff};

  21. /*------------------time ms延时函数-----------------*/
  22. void delay_ms(uint time)
  23. {
  24.         uchar tres;
  25.         for(;time>0;time--)
  26.         {
  27.                 tres=150;
  28.                 while(tres--);
  29.         }
  30. }         
  31. //外部中断1初始化程序
  32. void Init_Sys() //中断初始化函数
  33. {
  34.         TCON=0x00;        //外部中断1低电平触发
  35.         TMOD=0X01;   //定时器0方式1                          
  36.         IE=0x86;        //开启外部中断1,定时器中断0,及总中断        10000110B
  37.         IP=0X04;        //外部中断优先级高于定时器
  38.         CONT=0;                //时间清零
  39.         res_time=0;  
  40. }   
  41. //外部中断1处理程序
  42. void  exint1_int() interrupt 2 using 0
  43. {         
  44.         uchar t=200;                                                                   
  45.         EA=0;//关中断
  46.         TR0=0;//关定时器
  47.         WARNING=0;//关警告
  48.         while(t--)beep=0;//软件延时,消除抖动
  49.         RIGHT=P0; //获得按键值   
  50.         INT_ON=1; //标记中断                  
  51. }
  52. //定时器0中断处理程序
  53. void count_int() interrupt 1 using 1
  54. {       
  55.         TH0=0X4C;//重新装载
  56.         TL0=0X00;  
  57.         CONT++;
  58.         if(CONT==20)
  59.         {
  60.                 CONT=0;
  61.                 if(res_time==0)time_over=1;
  62.                 res_time--;            
  63.         }
  64. }            
  65. //遥控按键扫描程序
  66. uchar key_scan(void)
  67. {                                  
  68.         P1=0xff;
  69.         if(key1==1||key2==1||key3==1||key4==1)
  70.         {
  71.                 if(!key_down)
  72.                 {         
  73.                         delay_ms(10);                //延时
  74.                         key_down=1;                        //限制
  75.                         if(key1==1)return 1;//按键A
  76.                         if(key2==1)return 2;//按键B
  77.                         if(key3==1)return 3;//按键C
  78.                         if(key4==1)return 4;//按键D
  79.                 }
  80.                 else return 0;                                 
  81.         }
  82.         else if(key_down)key_down=0;//消除限制  
  83.         return 0; //未获得任何按键       
  84. }          
  85. uchar juder(void)
  86. {                          
  87.         switch(RIGHT)
  88.         {
  89.                 case 0xff:return 0;
  90.                 case 0xfe:return 1;
  91.                 case 0xfd:return 2;
  92.                 case 0xfb:return 3;
  93.                 case 0xf7:return 4;         
  94.                 case 0xef:return 5;
  95.                 case 0xdf:return 6;
  96.                 case 0xbf:return 7;
  97.                 case 0x7f:return 8;
  98.                 default:return 14;//E,错误       
  99.         }
  100. }
  101. //显示答案
  102. void show_answer(void)
  103. {
  104.         uchar ti=0;
  105.         uchar key=0;
  106.         while(1)
  107.         {
  108.                 key=key_scan();
  109.                 if(ti==100){BG=!BG;ti=0;}
  110.                 if(key!=0)
  111.                 {
  112.                         LED=leds[key+9];//显示答案
  113.                         BG=1;//灭灯
  114.                         break;
  115.                 }
  116.                 ti++;
  117.                 delay_ms(1);
  118.         }
  119. }
  120. void BELL(uchar times)
  121. {
  122.         while(times--)
  123.         {
  124.                 beep=0;
  125.                 delay_ms(100);
  126.                 beep=1;
  127.                 delay_ms(100);
  128.         }
  129. }
  130. //清除显示
  131. void clear(void)
  132. {
  133.         EA=0;          //关掉计时器
  134.         beep=0;          //开蜂鸣器
  135.         WARNING=0;        //清警告标记
  136.         time_over=0;//清溢出标记   
  137.         TR0=0;          //关定时器         
  138.         INT_ON=0;//清除中断标记
  139.         TL0=0X00;//初始值设置
  140.         TH0=0X4C;
  141.         CONT=0;
  142.         res_time=set_time;//赋初始值
  143.         delay_ms(100);
  144.         LED=leds[16];//清屏,同时关蜂鸣器  
  145.         BG=1;//关灯
  146. }
  147. void debug(void)//处理犯规队,显示犯规队队号
  148. {                          
  149.         RIGHT=P0;//获得犯规队的地址
  150.         LED=leds[juder()];//显示队号
  151.         BELL(4);         
  152. }
  153. //开启抢答器
  154. //1普通模式
  155. //0倒计时模式
  156. void start(uchar type)
  157. {
  158.         bit alarm=1;//提示音                            
  159.         uchar key=0;          
  160.         res_time=set_time;//获取初始值
  161.         while(1)
  162.         {       
  163.                 key=key_scan();//扫描键盘
  164.                 if(key!=0)
  165.                 {             
  166.                         switch(key)
  167.                         {
  168.                                 case 1://显示答案
  169.                                 {
  170.                                         clear();//清除
  171.                                         show_answer();
  172.                                         break;
  173.                                 }
  174.                                 case 2://开始抢答
  175.                                 {                                                          
  176.                                         if(P0!=0XFF)
  177.                                         {
  178.                                                 debug();//处理犯规
  179.                                                 break;
  180.                                         }           
  181.                                         if(!type)TR0=1;        //倒计时方式  
  182.                                         else                         //普通方式
  183.                                         {
  184.                                                 clear();
  185.                                                 BG=0;//开灯指示
  186.                                         }
  187.                                         EA=1;//使能中断          
  188.                                         break;
  189.                                 }
  190.                                 case 3:clear();break;//清除
  191.                                 case 4:return;//返回
  192.                         }                         
  193.                 }
  194.                 if(TR0==1)//倒计时
  195.                 {                                      
  196.                         if(CONT==0&&BG)
  197.                         {                  
  198.                                 if(res_time>=10)LED=leds[res_time/10];                                                  
  199.                                 BG=0;//每秒钟闪烁一次
  200.                                 if(WARNING)alarm=0;//最后十秒          
  201.                         }
  202.                         if(CONT==10&&!BG)
  203.                         {                         
  204.                                 BG=1;                                                 
  205.                                 if(WARNING)alarm=1;//最后十秒
  206.                                 else LED=leds[res_time%10];//显示个位数据;
  207.                         }                                                                    
  208.                         if(res_time<10)//最后十秒标记
  209.                         {
  210.                                 WARNING=1;
  211.                                 LED=leds[res_time];
  212.                         }  
  213.                         beep=alarm;
  214.                         delay_ms(5);      
  215.                 }
  216.                 if(time_over) //倒计时结束处理
  217.                 {
  218.                         clear();
  219.                         LED=leds[0];
  220.                         time_over=0;
  221.                         BELL(3);
  222.                 }  
  223.                 if(INT_ON)//有选手按下
  224.                 {
  225.                         TR0=0;//关定时器  
  226.                         beep=0;//开提示音
  227.                         BG=1;//关灯
  228.                         delay_ms(100);
  229.                         INT_ON=0;
  230.                         LED=leds[juder()];//显示选手号
  231.                 }                                    
  232.         }
  233. }                                                    
  234. void main()
  235. {          
  236.         bit set=0;//设置状态标记
  237.         bit model=1; //模式标记
  238.         uchar key;
  239.         Init_Sys();//初始化外部中断        1 捕获按键输入
  240.         P0=0XFF;
  241.         TR0=1;//开启定时器0                          
  242.         while(1)//死循环
  243.         {          
  244.                 key=key_scan();
  245.                 if(key!=0)
  246.                 {  
  247.                         if(!model)switch(key)
  248.                         {
  249.                                 case 1:
  250.                                 {                          
  251.                                         set=1;
  252.                                         set_time+=10;
  253.                                         if(set_time>90)set_time=10;
  254.                                         break;
  255.                                 }
  256.                                 case 3:
  257.                                 {
  258.                                         set=1;
  259.                                         if(set_time>10)set_time-=10;//范围限制
  260.                                         else set_time=90;
  261.                                         break;
  262.                                 }   
  263.                         }
  264.                         if(key==2)
  265.                         {
  266.                                 start(model);//开始抢答
  267.                                 set=0;//非设置状态
  268.                         }
  269.                         if(key==4)
  270.                         {
  271.                                 model=!model;//模式切换
  272.                                 set=0;                 //非设置状态
  273.                         }
  274.                 }
  275.                 if(model)LED=leds[14];
  276.                 else
  277.                 {
  278.                         if(set)LED=leds[set_time/10];//显示设置时间
  279.                         else LED=leds[15];
  280.                 }                                                                     
  281.         }
  282. }
复制代码

所有资料51hei提供下载:
抢答器.rar (1.01 MB, 下载次数: 7)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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