找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求大佬,把这个单片机程序添上注释,实在看不懂,想学习

[复制链接]
跳转到指定楼层
楼主
ID:905437 发表于 2021-4-18 20:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

  1. *  标题:                           三路抢答器                                  *
  2.                                                    *
  3. *                                                                                                                                                           *
  4. *  实验说明:在10s的时间内,三位选手进行按键抢答,如果1号抢答,那么数码管将显示*
  5. 1号选手的号码。并且蜂鸣器响,以此类推。如果10s时间到,蜂鸣器响,选手
  6. 无法进行抢答                                                                                    *                                                      


  7. #include <reg52.h>

  8. //IO口定义
  9. #define GPIO_DIG P0
  10. #define GPIO_SHOW P2

  11. sbit LSA=P3^0;
  12. sbit beep=P1^5;
  13. sbit K1=P3^1;
  14. sbit K2=P1^0;
  15. sbit K3=P1^1;
  16. sbit K4=P1^2;

  17. //--定义全局变量--//
  18. typedef unsigned int u16;
  19. unsigned char code DIG_CODE[18]={
  20. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  21. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0xff};
  22. //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
  23. unsigned int Ge=0;
  24. unsigned int Shi=1;
  25. unsigned int num=0;
  26. unsigned int Res=10;
  27. unsigned int flag=0;

  28. //全局函数
  29. void DigDisplay();

  30. void delay(u16 i)
  31. {
  32.         while(i--);      
  33. }

  34. void main()
  35. {
  36.     TMOD = 0x01;
  37.     TH0 = 0x3C;
  38.     TL0 = 0x0B0;
  39.     EA = 1;
  40.     ET0 = 1;
  41.     TR0 = 1;
  42.         DigDisplay();


  43. }


  44. void DigDisplay()
  45. {
  46.         unsigned char i;
  47.         unsigned int j;
  48.         while(1)
  49.         {
  50.         for(i=0;i<2;i++)
  51.         {
  52.                 switch(i)         //位选,选择点亮的数码管,
  53.                 {
  54.                         case(0):
  55.                                 LSA=0;
  56.                                 GPIO_DIG=DIG_CODE[Shi];//发送段码
  57.                                 break;//显示第0位
  58.                         case(1):
  59.                                 LSA=1;
  60.                                 GPIO_DIG=DIG_CODE[Ge];//发送段码
  61.                                 break;//显示第1位
  62.                 }
  63.                
  64. /****************************************************************************/
  65. /*消隐函数要在数码管更新频率很快的条件下,才起作用,手动更换数码管位选完全达不到这么快的速度,因此在这种情况下也是没必要用消隐的  */
  66.                 j=10;                                                 //扫描间隔时间设定
  67.                 while(j--);        
  68.                 GPIO_DIG=0x00;//消隐
  69.                 }
  70.         if(K1==0)
  71.         {
  72.                 Res=10;
  73.                 flag=0;
  74.         }

  75.     else if(K2==0)
  76.         {
  77.                 GPIO_SHOW=~DIG_CODE[1];
  78.                 while(1)
  79.                 {
  80.                 beep=~beep;
  81.                 delay(10);
  82.                 if(K1==0)
  83.                 {
  84.                  Res=10;
  85.                  flag=0;
  86.                  GPIO_SHOW=~DIG_CODE[17];
  87.                  break;        
  88.                 }
  89.                 }

  90.         }

  91.         else if(K3==0)
  92.         {
  93.                 GPIO_SHOW=~DIG_CODE[2];
  94.                 while(1)
  95.                 {
  96.                 beep=~beep;
  97.                 delay(10);
  98.                 if(K1==0)
  99.                 {
  100.                  Res=10;
  101.                  flag=0;
  102.                  GPIO_SHOW=~DIG_CODE[17];
  103.                  break;
  104.                 }        
  105.                 }
  106.         }

  107.         else if(K4==0)
  108.         {
  109.                 GPIO_SHOW=~DIG_CODE[3];
  110.                 while(1)
  111.                 {
  112.                 beep=~beep;
  113.                 delay(10);
  114.                 if(K1==0)
  115.                 {
  116.                  Res=10;
  117.                  flag=0;
  118.                  GPIO_SHOW=~DIG_CODE[17];
  119.                  break;
  120.                 }        
  121.                 }
  122.         }

  123.         }


  124. }

  125. void Int1() interrupt 1
  126. {
  127.         TMOD = 0x01;
  128.     TH0 = 0x3C;
  129.     TL0 = 0x0B0;
  130.         num++;

  131.         if(num==20)
  132.         {
  133.                 num=0;
  134.                 flag++;
  135.                 Res--;
  136.                 Ge=Res%10;
  137.                 Shi=Res/10;               
  138.         }
  139.         
  140.         if(flag==10)
  141.         {
  142.                 while(1)
  143.                 {
  144.                 beep=~beep;
  145.                 delay(10);

  146.                 if(K1==0)
  147.             {
  148.                 Res=10;
  149.                 flag=0;
  150.                 break;
  151.             }
  152.                 }
  153.         }        
  154. }
复制代码


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

使用道具 举报

沙发
ID:584814 发表于 2021-4-20 10:42 | 只看该作者
按照VIP的路径会很快有答案的
回复

使用道具 举报

板凳
ID:889094 发表于 2021-4-20 12:28 | 只看该作者
看了显示2个数据管还用个for 循环,程序结构不怎么样。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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