找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2929|回复: 0
收起左侧

51单片机四路抢答器源码

[复制链接]
ID:326666 发表于 2018-5-11 23:50 | 显示全部楼层 |阅读模式
单片机源程序如下:
  1. /**********************BST-M51实验开发板例程************************
  2. *  平台:BST-M51 + Keil U4 + STC89C52
  3. *  名称:本例程为一抢答器;其中主持人操控k3与k4两个按键。选手共2位,分别操控k1、k2中的一个按键。
  4.                   当主持人按下抢答开始按键k3后,倒计时开始,计时5s。此后最先按下按键的选手号码将显示与数码管上。
  5.                   后来按下的将无显示。
  6.                   若五秒计时结束后,再按下按键也不会显示。
  7.                   若主持人没有按开始键,就有选手抢答,则视为犯规。此时犯规的选手号码将被显示于数码管上
  8.                   同时,蜂鸣器发出长笛声报警,数码管全亮。
  9.                   而当主持人按下清零键K4后,一切状态均恢复,可以开始新一轮的抢答。
  10.                                            按键功能简介
  11.                          k3抢答开始         k4 清零
  12.                           k1、k2   分别为两个选手按键
  13. *  晶振:11.0592MHZ
  14. *  说明:免费开源,不提供源代码分析.
  15. ******************************************************************/


  16. #include<reg51.h>

  17. #define uchar unsigned char

  18. #define dula P0                //段选信号的锁存器控制
  19. #define wela P2                //位选信号的锁存器控制,这里只用到P2.4-P2.7
  20. sbit beep=P2^3;
  21. sbit k1 =P3^4;
  22. sbit k2 =P3^5;
  23. sbit k3 =P3^6;
  24. sbit k4 =P3^7;
  25. uchar key,j,k,daojishi=5,wei;
  26. bit begin,end,clear,fangui;
  27. uchar a0,b0=16;c0=16;d0=16;
  28. unsigned int pp;
  29. unsigned char code weitable[]={0x8f,0x4f,0x2f,0x1f};
  30.                                                 //数码管各位的码表
  31. unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  32.                         0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

  33. void delay(unsigned char i)
  34. {
  35.   for(j=i;j>0;j--)
  36.     for(k=125;k>0;k--);
  37. }

  38. void display1(uchar wei,uchar shu)//在任意一位显示任意的数字
  39. {
  40.    wei=wei-1;
  41.    wela|=0xf0;//给P2.4-P2.7置1
  42.    P0=table[shu];
  43.    wela=wela&weitable[wei];//给P2需要显示的那一位置1,其他置0
  44.    delay(5);
  45. }

  46. void display(uchar a,uchar b,uchar c,uchar d)
  47. {                                                  //一次显示4个数字,且每位显示数字可自定。
  48.    display1(1,a);
  49.    display1(2,b);
  50.    display1(3,c);
  51.    display1(4,d);
  52. }
  53. void keyscan()
  54. {
  55.         if(k1==0)
  56.         {
  57.                 while(k1==0);
  58.                 key= 1;
  59.         }
  60.         if(k2==0)
  61.         {
  62.                 while(k2==0);
  63.                 key=2;
  64.         }
  65.         if(k3==0)
  66.         {
  67.                 while(k3==0);
  68.                 begin =1;
  69.         }
  70.         if(k4==0)
  71.         {
  72.                 while(k4==0);
  73.                 clear = 1;
  74.         }
  75. }
  76. void main()
  77. {
  78.         TMOD=0x01;
  79.         
  80.         TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。
  81.         TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12
  82.         ET0=1;
  83.         EA=1;
  84.         a0=table[16];
  85.         beep =1;
  86.         P1=0xff;
  87.         begin=0;
  88.         key=0;
  89.         end = 0;
  90.         fangui = 0;
  91.         while(1)
  92.         {
  93.                 keyscan();//按键扫描
  94.                 if(begin)
  95.                 {
  96.                         if(!end)
  97.                                 TR0=1;//开始计时
  98.                                 if(pp==20)//定时1s
  99.                                 {
  100.                                         pp=0;
  101.                                         daojishi--;
  102.                                 }
  103.                                 if(key!=0)
  104.                                 {
  105.                                         a0=key;
  106.                                         end = 1;
  107.                                         daojishi = 0;
  108.                                 }
  109.                                 if(!daojishi)
  110.                                 {
  111.                                         TR0=0;
  112.                                         pp=0;
  113.                                 }

  114.                 }
  115.                 else
  116.                 {        
  117.                         if(key!=0)
  118.                         {
  119.                                 fangui=1;
  120.                                 a0 = key;
  121.                         }
  122.                 }
  123.                 if(clear)
  124.                 {
  125.                         a0=0;key=0;begin=0;fangui=0;beep=1;daojishi=5;clear=0;
  126.                         b0=16;c0=16;d0=16;P1=0xff;pp=0;end = 0;
  127.                 }
  128.                 d0 = daojishi;
  129.                 display(a0,b0,c0,d0);
  130.                 if(fangui)        
  131.                 {
  132.                         beep=0;
  133.                         P1=0x00;;
  134.                 }

  135.         }
  136. }

  137. void time0() interrupt 1
  138. {        TH0=(65536-46080)/256;
  139.         TL0=(65536-46080)%256;
  140.         pp++;
  141. }
复制代码

所有资料51hei提供下载:
51单片机四路抢答器.rar (18.12 KB, 下载次数: 50)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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