找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机四路抢答器源程序

[复制链接]
跳转到指定楼层
楼主
ID:388941 发表于 2018-8-22 16:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
主持人操 k3 和 k4 两个按键。选手共四位,分别操控S1 -- S2中的一个按键。
当主持人按下抢答开始按键S5后,倒计时开始,计时10s,此后最先按下按键的选手号码将显示在数码管上,后来按下的将无显示。
若十秒计时结束后,再按下按键也不会显示。
若支持人没有按开始按键,就有选手抢答,则视为犯规。此时犯规选手号码将被显示于数码管上(最多显示三位犯规选手,不显示时间),同时,蜂鸣器一直发出长笛声报警
而当主持人按下清零键 k4 后,一切状态均恢复,可以开始新一轮抢答。
  按键功能简介
K3 抢答开始    (使用外部中断0 )
k4 清零         (使用外部中断1 )

矩阵键盘        
S1 -- S4       分别为1到4号选手

单片机源程序如下:
  1. #include <reg52.h>
  2. typedef unsigned char u8;
  3. typedef unsigned int  u16;
  4. sbit led3=P2^2;
  5. sbit led2=P2^3;
  6. sbit led1=P2^4;
  7. sbit key1=P3^2;
  8. sbit key2=P3^3;
  9. sbit beep=P1^5;
  10. void delay(u16 i)
  11. {
  12.         u8 a;
  13.         while(i--)
  14.         {
  15.                 for(a=0;a<125;a++)
  16.                 {
  17.                         ;
  18.                 }
  19.         }
  20. }
  21. u16 code duanxuan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  22. void weixuan(u16 i)
  23. {
  24.         switch(i)
  25.         {
  26.                 case (0) : led1=0;led2=0;led3=0;break;
  27.                 case (1) : led1=0;led2=0;led3=1;break;
  28.                 case (2) : led1=0;led2=1;led3=0;break;
  29.                 case (3) : led1=0;led2=1;led3=1;break;
  30.                 case (4) : led1=1;led2=0;led3=0;break;
  31.                 case (5) : led1=1;led2=0;led3=1;break;
  32.                 case (6) : led1=1;led2=1;led3=0;break;
  33.                 case (7) : led1=1;led2=1;led3=1;break;
  34.   }
  35. }
  36. void display(u16 i,u16 j)
  37. {
  38.         weixuan(i);
  39.         P0=duanxuan[j];
  40. }
  41. u16 a=0;  //判断是否有选手按下
  42. void saomiao ()
  43. {
  44.         P1=0xf0;
  45.         if(P1!=0xf0)
  46.         {
  47.                 delay(10);
  48.                 if (P1!=0xf0)
  49.                 {     
  50.                         P1=0X7f;
  51.                         switch(P1)
  52.                         {
  53.                                 case(0x77) :  a=1;break;
  54.                                 case(0x7b) :  a=2;break;
  55.                                 case(0x7d) :  a=3;break;
  56.                                 case(0x7e) :  a=4;break;
  57.                         }       
  58.                         P1=0xf0;                       
  59.                         while(P1!=0xf0);
  60.                 }
  61.         }
  62. }
  63. u16 i=0,j=0,n=10,m=0,k,weigui[3],v=0;                 //m=1表示按下开始

  64. void daojishi()
  65. {
  66.                 P0=0x00;
  67.                 display(0,n%10);
  68.                 delay(1);
  69.                 P0=0x00;
  70.                 display(1,n/10);
  71.                 delay(1);
  72.                 if(n==0)
  73.                 {
  74.                         TR0=0;
  75.                 }
  76. }
  77. void main()
  78. {
  79.           EA=1;
  80.                 EX0=1;
  81.                 IT0=1;
  82.                 EX1=1;
  83.                 IT1=1;
  84.        
  85.           ET0=1;
  86.           TMOD=0X01;
  87.           TH0=(65536-1000)/256;
  88.           TL0=(65536-1000)%256;
  89.         while(1)
  90.         {
  91.                 v=0;
  92.                 P0=0x00;
  93.                 if(m==0)
  94.                 {
  95.                         saomiao();
  96.                         if(a!=0)
  97.                         {
  98.                                 while(1)
  99.                                 {
  100.                                         if(v==1)
  101.                                         {
  102.                                                 break;
  103.                                         }
  104.                                         saomiao();
  105.                                         if(a!=0)
  106.                                         {
  107.                                                 weigui[j]=a;
  108.                                                 if(j>0)
  109.                                                 {
  110.                                                         if(weigui[j]!=weigui[j-1])
  111.                                                         {
  112.                                                                 j++;
  113.                                                         }
  114.                                                 }
  115.                                                 if(j<1)
  116.                                                 {
  117.                                                         j++;
  118.                                                 }
  119.                                         }
  120.                                         a=0;
  121.                                         for(k=0;k<j;k++)
  122.                                         {
  123.                                                 P0=0x00;
  124.                                                 display(k,weigui[k]);
  125.                                                 beep=~beep;
  126.                                                 delay(10);
  127.                                         }
  128.                                         if(j==3)
  129.                                         {
  130.                                                 while(1)
  131.                                                 {
  132.                                                         for(k=0;k<j;k++)
  133.                                                         {
  134.                                                                 P0=0x00;
  135.                                                                 display(k,weigui[k]);
  136.                                                                 beep=~beep;
  137.                                                                 delay(1);
  138.                                                         }
  139.                                                         if(v==1)
  140.                                                         {
  141.                                                                 break;
  142.                                                         }
  143.                                                 }
  144.                                         }
  145.                                 }
  146.                         }
  147.                        
  148.                 }
  149.                 if(m==1)
  150.                 {
  151.                         daojishi();                         //开始倒计时
  152.                         saomiao();
  153.                         if(a!=0)
  154.                         {
  155.                                 while(1)
  156.                                 {
  157.                                         P0=0x00;
  158.                                         display(0,a);
  159.                                         delay(10);
  160.                                         if(v==1)
  161.                                         {
  162.                                                 break;
  163.                                         }
  164.                                 }
  165.                         }
  166.                        
  167.                 }
  168.         }
  169. }
  170. void zhongduan0() interrupt 0
  171. {
  172.         delay(10);
  173.         if(key1==0)
  174.         {
  175.                 TR0=1;
  176.                 m=1;
  177.                 while(key1==0);
  178.         }       
  179. }

  180. void zhongduan1() interrupt 2
  181. {
  182.         delay(10);
  183.         if(key2==0)
  184.         {
  185.                 n=10;
  186.                 m=0;
  187.                 a=0;
  188.                 j=0;
  189.                 v=1;
  190.                 TR0=0;
  191.                 while(key2==0);
  192.         }       
  193. }

  194. void dingshiqi() interrupt 1
  195. {
  196.         i++;
  197.         if(i==1000)
  198.         {
  199.                 i=0;
  200.                 n--;
  201.         }
  202.         TH0=(65536-1000)/256;
  203.         TL0=(65536-1000)%256;
  204. }
复制代码

所有资料51hei提供下载:
四路抢答器.rar (24.51 KB, 下载次数: 61)




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

使用道具 举报

沙发
ID:1 发表于 2018-8-22 18:40 | 只看该作者
楼主能分享下原理图吗?或者简单说明一下
回复

使用道具 举报

板凳
ID:388941 发表于 2018-8-23 10:38 | 只看该作者
admin 发表于 2018-8-22 18:40
楼主能分享下原理图吗?或者简单说明一下

好的   我先发原理图   有时间了我加点说明
回复

使用道具 举报

地板
ID:388941 发表于 2018-8-23 10:42 | 只看该作者
这个学习板的原理图

F103RCT6学习板(黑板).pdf

136.98 KB, 下载次数: 35, 下载积分: 黑币 -5

回复

使用道具 举报

5#
ID:508361 发表于 2019-4-9 22:48 | 只看该作者
谢谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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