微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 抢答器;按键理念;倒计时;四位数码管显示

抢答器;按键理念;倒计时;四位数码管显示

时间:10-02 整理:3721RD 点击:

两年前开始学习单片机,也是从最简单的51开始。现在整理一些以前写的东西,给后来者学习,希望能帮到你们。有需要自己下载。

按键:1主持人;4选手
主持人键按下,数码管倒计时,直到有选手按键按下,显示选手按键,停止计时

  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. #define LS P0                                //段选

  6. sbit beep=P1^5;                //蜂鸣器

  7. sbit LSA=P2^2;                        //位选
  8. sbit LSB=P2^3;
  9. sbit LSC=P2^4;

  10. sbit Key=P1^7;                //键盘行扫,置零

  11. sbit Host=P1^3;                //主持人键,0-按下
  12. sbit Player_1=P3^1;                //1号选手键,0-按下
  13. sbit Player_2=P3^0;                //2号选手键,0-按下
  14. sbit Player_3=P3^2;                //3号选手键,0-按下
  15. sbit Player_4=P3^3;                //4号选手键,0-按下

  16. //按键标志位 0-有效 1-无效
  17. uchar Host_flag=1;
  18. uchar P1_flag=1;
  19. uchar P2_flag=1;
  20. uchar P3_flag=1;
  21. uchar P4_flag=1;

  22. static uchar miaoH=6,miaoL=0;
  23. static uchar Player=0;

  24. uchar code DIG_CODE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示空/0~9的值

  25. uchar T=0;                        //计算定时器循环次数

  26. void Delay(uchar t)
  27. {
  28.     unsigned char a,b;
  29.                 for(;t>0;t--)
  30.                         for(b=13;b>0;b--)
  31.                                         for(a=20;a>0;a--);
  32. }

  33. void Init()
  34. {
  35.         Key=0;                //键盘行扫,置零
  36.         
  37.         TMOD=0x01;                        //定时器0中断方式1

  38.         //50ms
  39.         TH0=(65536-50000)/256;                        //赋初值
  40.         TL0=(65536-50000)%256;

  41.         EA=1;                        //总中断打开

  42.         ET0=1;                        //中断 定时器0打开

  43.         IT0=1;                        //下降沿有效

  44.         TR0=0;                        //定时器0未启动
  45.                                 //50ms时间到,跳转到中断程序中
  46. }

  47. void Timer() interrupt 1
  48. {
  49.         TH0=(65536-50000)/256;                        //定时T*50ms--T=20--1s
  50.         TL0=(65536-50000)%256;
  51.         T++;
  52. }

  53. void Clock()
  54. {
  55.         uchar t=50;
  56.         if(Host_flag==0)                //倒计时状态
  57.         {
  58.                 if(P1_flag==0)
  59.                 {
  60.                         Host_flag=1;
  61.                         Player=1;
  62.                 }
  63.                 else if(P2_flag==0)
  64.                 {
  65.                         Host_flag=1;
  66.                         Player=2;
  67.                 }
  68.                 else if(P3_flag==0)
  69.                 {
  70.                         Host_flag=1;
  71.                         Player=3;
  72.                 }
  73.                 else if(P4_flag==0)
  74.                 {
  75.                         Host_flag=1;
  76.                         Player=4;
  77.                 }
  78.                 else
  79.                 {
  80.                         if(T==20)
  81.                         {
  82.                                 T=0;
  83.                                 miaoL--;
  84.                                 if(miaoH==0&&miaoL<=5)                //倒计时五秒,蜂鸣器报警
  85.                                 {
  86.                                         for(;t>0;t--)                //循环50次        延时长,数码管闪
  87.                                         {
  88.                                                 beep=0;
  89.                                                 Delay(2);
  90.                                                 beep=1;
  91.                                                 Delay(2);
  92.                                         }
  93.                                 }
  94.                                 if(miaoH!=0)
  95.                                 {
  96.                                         if(miaoL==-1)
  97.                                         {
  98.                                                 miaoL=9;
  99.                                                 miaoH--;
  100.                                         }
  101.                                 }
  102.                                 else
  103.                                 {
  104.                                         if(miaoL==-1)
  105.                                         {
  106.                                                 miaoL=0;
  107.                                                 Host_flag=1;
  108.                                         }
  109.                                 }
  110.                         }
  111.                 }
  112.         }
  113.         else                //问题时间
  114.         {
  115.                 TR0=0;                //定时器关闭
  116.                 T=0;
  117.         }
  118. }

  119. void Key_Scan()
  120. {
  121.         static uchar SaveHt=1;                //保存主持人键状态 0-按下,1-弹起
  122.         static uchar SaveP1=1;                //保存一号选手键状态 0-按下,1-弹起
  123.         static uchar SaveP2=1;                //保存二号选手键状态 0-按下,1-弹起
  124.         static uchar SaveP3=1;                //保存三号选手键状态 0-按下,1-弹起
  125.         static uchar SaveP4=1;                //保存四号选手键状态 0-按下,1-弹起

  126.         uchar Ht=1;                //当前主持人键状态 弹起
  127.         uchar P1=1;                //当前一号选手按键状态 弹起
  128.         uchar P2=1;                //当前二号选手按键状态 弹起
  129.         uchar P3=1;                //当前三号选手按键状态 弹起
  130.         uchar P4=1;                //当前四号选手按键状态 弹起

  131. //获取各按键状态
  132.         if(Host==0)                //主持人键按下
  133.         {
  134.                 Delay(1);
  135.                 if(Host==0)
  136.                 {
  137.                         Ht=0;
  138.                 }
  139.                 else
  140.                 {
  141.                         Ht=1;
  142.                 }
  143.         }
  144.         else
  145.         {
  146.                 Ht=1;
  147.         }
  148.         
  149.         if(Player_1==0)                //一号选手键按下
  150.         {
  151.                 Delay(1);
  152.                 if(Player_1==0)
  153.                 {
  154.                         P1=0;
  155.                 }
  156.                 else
  157.                 {
  158.                         P1=1;
  159.                 }
  160.         }
  161.         else
  162.         {
  163.                 P1=1;
  164.         }
  165.         
  166.         if(Player_2==0)                //二号选手键按下
  167.         {
  168.                 Delay(1);
  169.                 if(Player_2==0)
  170.                 {
  171.                         P2=0;
  172.                 }
  173.                 else
  174.                 {
  175.                         P2=1;
  176.                 }
  177.         }
  178.         else
  179.         {
  180.                 P2=1;
  181.         }
  182.         
  183.         if(Player_3==0)                //三号选手键按下
  184.         {
  185.                 Delay(1);
  186.                 if(Player_3==0)
  187.                 {
  188.                         P3=0;
  189.                 }
  190.                 else
  191.                 {
  192.                         P3=1;
  193.                 }
  194.         }
  195.         else
  196.         {
  197.                 P3=1;
  198.         }
  199.         
  200.         if(Player_4==0)                //四号选手键按下
  201.         {
  202.                 Delay(1);
  203.                 if(Player_4==0)
  204.                 {
  205.                         P4=0;
  206.                 }
  207.                 else
  208.                 {
  209.                         P4=1;
  210.                 }
  211.         }
  212.         else
  213.         {
  214.                 P4=1;
  215.         }
  216.         
  217. //按键按下状态处理
  218.         if(SaveHt!=Ht)                //主持人键状态变化
  219.         {
  220.                 if(Ht==0)                //当前主持人键按下
  221.                 {
  222.                         if(Host_flag==1)                //抢答开始
  223.                         {
  224.                                 Host_flag=0;
  225.                                 
  226.                                 Player=0;                //选手位
  227.                                 
  228.                                 miaoH=6;
  229.                                 miaoL=0;
  230.                                 TR0=1;                //定时器启动
  231.                                 P1_flag=1;                //复位选手状态
  232.                                 P2_flag=1;
  233.                                 P3_flag=1;
  234.                                 P4_flag=1;
  235.                         }
  236.                 }
  237.         }
  238.         
  239.         if(SaveP1!=P1)                //一号选手键状态变化
  240.         {
  241.                 if(P1==0)
  242.                 {
  243.                         P1_flag=0;
  244.                 }
  245.         }
  246.         
  247.         if(SaveP2!=P2)                //二号选手键状态变化
  248.         {
  249.                 if(P2==0)
  250.                 {
  251.                         P2_flag=0;
  252.                 }
  253.         }
  254.         
  255.         if(SaveP3!=P3)                //三号选手键状态变化
  256.         {
  257.                 if(P3==0)
  258.                 {
  259.                         P3_flag=0;
  260.                 }
  261.         }
  262.         
  263.         if(SaveP4!=P4)
  264.         {
  265.                 if(P4==0)
  266.                 {
  267.                         P4_flag=0;
  268.                 }
  269.         }
  270.         
  271.         SaveHt=Ht;                //保存主持人键状态
  272.         SaveP1=P1;                //保存一号选手键状态
  273.         SaveP2=P2;                //保存二号选手键状态
  274.         SaveP3=P3;                //保存三号选手键状态
  275.         SaveP4=P4;                //保存四号选手键状态
  276. }

  277. void Display()
  278. {
  279.         Clock();
  280.                 LSA=0;LSB=0;LSC=0;        LS=DIG_CODE[miaoL];        Delay(1);        LS=0x00;//秒针低位-加 消隐
  281.                 LSA=1;LSB=0;LSC=0;        LS=DIG_CODE[miaoH];        Delay(1);        LS=0x00;//秒针高位-加 消隐
  282.                 LSA=0;LSB=1;LSC=0;        LS=0x40;        Delay(1);        LS=0x00;                //-消隐
  283.                 LSA=1;LSB=1;LSC=0;        LS=DIG_CODE[Player];        Delay(1);        LS=0x00;//选手位
  284. }

  285. main()
  286. {
  287.         Init();                        //执行初始化
  288.         while(1)
  289.         {
  290.                 Key_Scan();
  291.                
  292.                 Display();
  293.         }
  294. }

复制代码


不了解,围观一下。感谢分享

没有电路图吗

不好意思,

谢谢

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top