找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于抢答器,请大佬帮忙看看我截图的那几行单片机代码是什么意思?

[复制链接]
跳转到指定楼层
楼主
ID:857089 发表于 2020-12-10 08:22 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式


单片机源程序如下:
  1. #include<reg51.h>

  2. #define JZKEY P1

  3. #define GPIO_DIG P0

  4. sbit LSA=P2^2;
  5. sbit LSB=P2^3;
  6. sbit LSC=P2^4;

  7. sbit K1=P3^2;
  8. sbit K2=P3^3;

  9. sbit BEEP=P1^5;

  10. sbit LED1=P2^7;
  11. sbit LED2=P2^6;
  12. sbit LED3=P2^5;
  13. sbit LED4=P2^1;
  14. sbit LED5=P2^0;

  15. unsigned char code COMD_CODE[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
  16. //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
  17. unsigned char COMD_Display[8];
  18. //用来存放要显示的8位数的值

  19. unsigned char k;

  20. unsigned char KeyValue;
  21. unsigned char flag=0;
  22. char Sec=10;
  23. char xuanshou=0;
  24. unsigned char Keyflag;        //记录按键的状态,0没有,1有

  25. void Delay10ms();   //延时10ms
  26. void KeyDown();                 //检测按键函数

  27. //--声明全局函数--//
  28. void DigDisplay(); //动态显示函数

  29. void Delay(unsigned int i)                //无符号类型的int
  30. {
  31.         char j;
  32.         for(i; i > 0; i--)
  33.                 for(j = 200; j > 0; j--);
  34. }

  35. void Delay10ms2(unsigned int c)   //误差 0us
  36. {
  37.     unsigned char a,b;
  38.     for(;c>0;c--)
  39.         for(b=38;b>0;b--)
  40.             for(a=130;a>0;a--);
  41. }

  42. void BZ1()                                                   //正确抢答蜂鸣器
  43. {
  44.         unsigned int t;
  45.         for(t=0;t<1000;t++)
  46.         {
  47.                 BEEP= 1;
  48.                 Delay(10);
  49.                 BEEP= 0;
  50.                 Delay(10);
  51.         }
  52. }

  53. void BZ2()                                                   //错误抢答蜂鸣器
  54. {
  55.         unsigned int t;
  56.         for(t=0;t<1000;t++)
  57.         {
  58.                 BEEP= 1;
  59.                 Delay(10);
  60.                 BEEP= 0;
  61.                 Delay(10);
  62.         }
  63.     Delay10ms2(30);
  64.     for(t=0;t<1000;t++)
  65.         {
  66.                 BEEP= 1;
  67.                 Delay(10);
  68.                 BEEP= 0;
  69.                 Delay(10);
  70.         }
  71. }

  72. void main(void)
  73. {
  74.         unsigned char i=0;
  75.         BEEP=1;
  76.         Keyflag=0;
  77.         TMOD=0x01;                                //定时器0方式1
  78.         TH0=(65536-50000)/256;                //定时器0:50ms
  79.         TL0=(65536-50000)%256;
  80.         TH1=(65536-50000)/256;                //定时器0:50ms
  81.         TL1=(65536-50000)%256;
  82.         EA=1;                                                //开启总中断
  83.         ET1=1;TR1=1;                                //开启T1定时器  T1定时器允许中断
  84.         while(1)
  85.         {
  86.                 ET0=0;TR0=0;
  87.                 while(flag==0)
  88.                 {
  89.                         COMD_Display[0] = COMD_CODE[Sec/10%10];
  90.                         COMD_Display[1] = COMD_CODE[Sec%10];
  91.                         DigDisplay();

  92.                         if(K1==0)
  93.                         {
  94.                                 flag=1;
  95.                                 ET0=1;TR0=1;
  96.                         }

  97.                         if(K2==0)
  98.                         {
  99.                                 Sec=10;
  100.                                 COMD_Display[0] = COMD_CODE[Sec/10%10];
  101.                                 COMD_Display[1] = COMD_CODE[Sec%10];
  102.                                 flag=0;
  103.                                 P2=0xff;
  104.                                 xuanshou=0;
  105.                         }

  106.                         KeyDown();
  107.                         if(Keyflag==1)
  108.                         {                        
  109.                                 if(KeyValue<5)
  110.                                 {
  111.                                         BZ2();
  112.                                         COMD_Display[0]=COMD_CODE[(KeyValue+1)/10];
  113.                                         COMD_Display[1]=COMD_CODE[(KeyValue+1)%10];
  114.                                         xuanshou=(KeyValue+1);
  115.                                         flag=3;
  116.                                 }
  117.                                 Keyflag=0;
  118.                         }        
  119.                 }

  120.                 while(flag==1)
  121.                 {
  122.                         KeyDown();
  123.                         if(Keyflag==1)
  124.                         {               
  125.                                 Keyflag=0;
  126.                                 if(KeyValue<5)
  127.                                 {
  128.                                         COMD_Display[0]=COMD_CODE[(KeyValue+1)/10];
  129.                                         COMD_Display[1]=COMD_CODE[(KeyValue+1)%10];
  130.                                         ET0=0;TR0=0;
  131.                                         xuanshou=(KeyValue+1);
  132.                                         flag=2;
  133.                         BZ1();
  134.                                 }
  135.                         }
  136.                         DigDisplay();
  137.                 }

  138.                 ET0=0;TR0=0;
  139.                 while(flag==2)
  140.                 {
  141.                         if(K2==0)
  142.                         {
  143.                                 Sec=10;
  144.                                 COMD_Display[0] = COMD_CODE[Sec/10%10];
  145.                                 COMD_Display[1] = COMD_CODE[Sec%10];
  146.                                 flag=0;
  147.                                 P2=0xff;                                                
  148.                                 xuanshou=0;
  149.                         }
  150.                         DigDisplay();
  151.                 }




  152.                 while(flag==3)
  153.                 {
  154.                         COMD_Display[0]=COMD_CODE[15];
  155.                         COMD_Display[1]=COMD_CODE[xuanshou];
  156.                         DigDisplay();
  157.                         if(K2==0)
  158.                         {
  159.                                 Sec=10;
  160.                                 COMD_Display[0] = COMD_CODE[Sec/10%10];
  161.                                 COMD_Display[1] = COMD_CODE[Sec%10];
  162.                                 flag=0;
  163.                                 P2=0xff;
  164.                                 xuanshou=0;
  165.                                 Keyflag=0;
  166.                         }
  167.                 }



  168.         }                                
  169. }

  170. void DigDisplay()
  171. {
  172.         unsigned char i;
  173.         unsigned int j;
  174.         for(i=0;i<8;i++)
  175.         {
  176.                 switch(7-i)         //位选,选择点亮的数码管,
  177.                 {
  178.                         case(0):
  179.                                 LSA=0;LSB=0;LSC=0; break;//显示第0位
  180.                         case(1):
  181.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  182.                         case(2):
  183.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  184.                         case(3):
  185.                                 LSA=1;LSB=1;LSC=0; break;//显示第3位
  186.                         case(4):
  187.                                 LSA=0;LSB=0;LSC=1; break;//显示第4位
  188.                         case(5):
  189.                                 LSA=1;LSB=0;LSC=1; break;//显示第5位
  190.                         case(6):
  191.                                 LSA=0;LSB=1;LSC=1; break;//显示第6位
  192.                         case(7):
  193.                                 LSA=1;LSB=1;LSC=1; break;//显示第7位        
  194.                 }
  195.                 GPIO_DIG=COMD_Display[i];//发送段码
  196.                 j=10;                                                 //扫描间隔时间设定
  197.                 while(j--);        
  198.                 GPIO_DIG=0x00;//消隐
  199.         }
  200. }

  201. void KeyDown(void)
  202. {
  203.         JZKEY=0x0f;
  204.         if(JZKEY!=0x0f)
  205.   {
  206.                 Delay10ms();
  207.                 if(JZKEY!=0x0f)
  208.                 {
  209.                         Keyflag=1;//有按键按下
  210.                         //测试列
  211.                         JZKEY=0X0F;        
  212.                         switch(JZKEY)
  213.                         {
  214.                                 case(0X07):        KeyValue=0;break;
  215.                                 case(0X0b):        KeyValue=1;break;
  216.                                 case(0X0d): KeyValue=2;break;
  217.                                 case(0X0e):        KeyValue=3;break;
  218.                         }
  219.                         //测试行
  220.                         JZKEY=0XF0;
  221.                         Delay10ms();
  222.                         switch(JZKEY)
  223.                         {
  224.                                 case(0X70):        KeyValue=KeyValue;break;
  225.                                 case(0Xb0):        KeyValue=KeyValue+4;break;
  226.                                 case(0Xd0): KeyValue=KeyValue+8;break;
  227.                                 case(0Xe0):        KeyValue=KeyValue+12;break;
  228.                         }
  229.                         while(JZKEY!=0xf0);
  230.                 }
  231.         }
  232. }
  233. void Delay10ms(void)   
  234. {
  235.     unsigned char a,b,c;
  236.     for(c=1;c>0;c--)
  237.         for(b=38;b>0;b--)
  238.             for(a=130;a>0;a--);
  239. }

  240. void Timer0() interrupt 1                                                                //倒计时
  241. {
  242.         unsigned char i;
  243.         TH0=(65536-50000)/256;                //恢复定时器0初值
  244.         TL0=(65536-50000)%256;
  245.         if(flag==1)
  246.         i++;
  247.         if(i>=20)                                //50ms*20=1s
  248.         {
  249.                 i=0;
  250.                 Sec--;
  251.                 if(Sec==0)
  252.                 {
  253.                         ET0=0;TR0=0;
  254.             BZ2();
  255.                         flag=2;
  256.                 }
  257.                 COMD_Display[0] = COMD_CODE[Sec/10%10];
  258.                 COMD_Display[1] = COMD_CODE[Sec%10];
  259.         }
  260. }

  261. void Timer1() interrupt 3                                                           //正确LED闪烁
  262. {
  263.         TH1=(65536-50000)/256;                //恢复定时器0初值
  264.         TL1=(65536-50000)%256;
  265.         k++;
  266.         if(flag==2)
  267.         {
  268.                 if(k>=200)                        
  269.                 {
  270.                         k=0;
  271.                         if(xuanshou==1)
  272.                         {
  273.                                 LED1=!LED1;
  274.                         }
  275.                         if(xuanshou==2)
  276.                         {
  277.                                 LED2=!LED2;
  278.                         }
  279.                         if(xuanshou==3)
  280.                         {
  281.                                 LED3=!LED3;
  282.                         }
  283.                         if(xuanshou==4)
  284.                         {
  285.                                 LED4=!LED4;
  286.                         }
  287.                         if(xuanshou==5)
  288.                         {
  289.                                 LED5=!LED5;
  290.                         }

  291.                 }
  292.         }

  293.         if(flag==3)                                                                                  //错误抢答时的LED闪烁
  294.         {
  295.                 if(k>=20)                        
  296.                 {
  297.                         k=0;
  298.                         if(xuanshou==1)
  299.                         {
  300.                                 LED1=!LED1;
  301.                         }
  302.                         if(xuanshou==2)
  303.                         {
  304.                                 LED2=!LED2;
  305.                         }
  306.                         if(xuanshou==3)
  307.                         {
  308.                                 LED3=!LED3;
  309.                         }
  310.                         if(xuanshou==4)
  311.                         {
  312.                                 LED4=!LED4;
  313.                         }
  314.                         if(xuanshou==5)
  315.                         {
  316.                                 LED5=!LED5;
  317.                         }
  318.                 }     
复制代码
                           

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

使用道具 举报

沙发
ID:517466 发表于 2020-12-10 11:00 | 只看该作者
COMD_Display[0]=COMD_CODE[(KeyValue+1)/10];
COMD_Display[1]=COMD_CODE[(KeyValue+1)%10];
xuanshou=(KeyValue+1);

前两行是为了能在LED上显示选手的编号做的处理,分被显示抢答按键的10位和个位。最后一行是确定选手的按键值。因为KeyValue默认从0开始计数,对应的额选手默认从1开始,所以做加一处理。
KeyValue=0时,对应的是1号选手。KeyValue=5时,对应的是6号选手。
程序里还有计时功能,flag的几个值都有特定意思,逻辑稍微复杂一些。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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