找回密码
 立即注册

QQ登录

只需一步,快速开始

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

这是一段四位数码管的单片机代码,我想问问图片里面那段是什么意思

[复制链接]
跳转到指定楼层
楼主


  1. #include "reg51.h"
  2. #include "intrins.h"

  3. #define GPIO_DIG   P2                      //数据端

  4. #define uchar unsigned char              //重命名关键字
  5. #define uint unsigned int                     //重命名关键字

  6. sbit K1=P3^0;            //开始
  7. sbit K2=P3^1;            //暂停
  8. sbit K3=P3^2;            //复位

  9. sbit L1=P1^4;            //数码管1位选
  10. sbit L2=P1^5;            //数码管2位选
  11. sbit L3=P1^6;            //数码管3位选
  12. sbit L4=P1^7;            //数码管4位选

  13. sbit beep=P1^0;

  14. unsigned char code DIG_CODE[10] = {
  15. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  16. 0x7f,0x6f};
  17. //0、1、2、3、4、5、6、7、8、9的显示码
  18. unsigned char code DIG_CODE2[10] = {
  19. 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,
  20. 0xff,0xef};
  21. //0、1、2、3、4、5、6、7、8、9带小数点的显示码
  22. unsigned char DisplayData[4];
  23. //用来存放要显示的8位数的值

  24. uchar i,m;            //定义变量
  25. uchar min=0;
  26. long int k=0;
  27. uint Second_Counts;                     //定义变量

  28. void DigDisplay()                   //数码管显示子函数
  29. {
  30.          unsignedint j;              //定义变量

  31.          L1=0;                             //位选
  32.          L2=1;
  33.          L3=1;
  34.          L4=1;
  35.          GPIO_DIG= DisplayData[0];     //发送段码
  36.          j= 1000;                                                    //扫描间隔时间设定
  37.          while(j--);
  38.          L1=1;                              //消隐
  39.          L2=1;
  40.          L3=1;
  41.          L4=1;               

  42.          L1=1;
  43.          L2=0;                             //位选
  44.          L3=1;
  45.          L4=1;
  46.          GPIO_DIG= DisplayData[1];     //发送段码
  47.          j= 1000;                                                    //扫描间隔时间设定
  48.          while(j--);
  49.          L1=1;                              //消隐
  50.          L2=1;
  51.          L3=1;
  52.          L4=1;      

  53.          L1=1;
  54.          L2=1;
  55.          L3=0;                              //位选
  56.          L4=1;
  57.          GPIO_DIG= DisplayData[2];     //发送段码
  58.          j= 1000;                                                    //扫描间隔时间设定
  59.          while(j--);
  60.          L1=1;                              //消隐
  61.          L2=1;
  62.          L3=1;
  63.          L4=1;      

  64.          L1=1;
  65.          L2=1;
  66.          L3=1;
  67.          L4=0;                              //位选
  68.          GPIO_DIG= DisplayData[3];     //发送段码
  69.          j= 1000;                                                    //扫描间隔时间设定
  70.          while(j--);
  71.          L1=1;                              //消隐
  72.          L2=1;
  73.          L3=1;
  74.          L4=1;      

  75. }

  76. void main()
  77. {
  78. //      Second_Counts=570;
  79. //      min=9;
  80.          GPIO_DIG= 0x00;            //初始化数据口

  81.          TMOD=0x01;                               //定时器0方式1
  82.          TH0=(65536-50000)/256;                  //定时器0:50ms
  83.          TL0=(65536-50000)%256;
  84.          TH1=(65536-2000)/256;           
  85.          TL1=(65536-2000)%256;
  86.          EA=1;   
  87. //      ET1=1;
  88. //      TR1=1;         
  89.    while (1)
  90.     {
  91.                    if(K1==0)
  92.                    {
  93.                             ET0=1;
  94.                             TR0=1;               //开启定时器
  95.                    }
  96.                    if(K2==0)
  97.                    {
  98.                             ET0=0;
  99.                             TR0=0;               //关闭定时器
  100.                    }
  101.                    if(K3==0)                                                 //复位按键按下时
  102.                    {
  103.                             ET0=0;
  104.                             TR0=0;               //关闭定时器
  105.                             DisplayData[0]= DIG_CODE2[0];      //清零显示
  106.                             DisplayData[1]= DIG_CODE[0];         //清零显示
  107.                             DisplayData[2]= DIG_CODE2[0];      //清零显示
  108.                             DisplayData[3]= DIG_CODE[0];         //清零显示
  109.                             i=0;                                                            //清零计数
  110.                             Second_Counts=0;                                 //清零秒
  111.                    }

  112.                    if((Second_Counts>0)&&(m==0))
  113.                    {
  114.                             ET1=1;
  115.                             TR1=1;   
  116.                    }

  117.                    if((min==9)&&(Second_Counts==599))
  118.                    {
  119.                             ET0=0;
  120.                             TR0=0;               //关闭定时器
  121.                             ET1=1;
  122.                             TR1=1;
  123.                    }

  124.                    DigDisplay();               //执行数码管显示函数
  125.     }
  126. }


  127. //T0中断函数
  128. void DSY_Refresh() interrupt 1
  129. {
  130.          TH0=(65536-50000)/256;                  //恢复定时器0初值
  131.          TL0=(65536-50000)%256;
  132.          i++;
  133.          m++;
  134.          if(m>=20)
  135.          {
  136.                    m=0;
  137.          }
  138.          if(i==2)                                  //50ms*2=0.1s转换状态
  139.          {
  140.                    i=0;
  141.                    Second_Counts++;
  142.                    if(Second_Counts>=600)
  143.                    {
  144.                             Second_Counts=0;
  145.                             min++;
  146.                    }

  147.                    DisplayData[0]= DIG_CODE2[min%10];   //显示百位
  148.                    DisplayData[1]= DIG_CODE[Second_Counts/100%10];   //显示十位
  149.                    DisplayData[2]= DIG_CODE2[Second_Counts/10%10];   //显示个位
  150.                    DisplayData[3]= DIG_CODE[Second_Counts%10];                     //显示小数点后一位
  151. //               if(Second_Counts==10000)Second_Counts=0;                            //当秒计数到1000秒又变为0
  152.          }
  153. }

  154. void DSY_Refresh2() interrupt 3
  155. {
  156.          TH1=(65536-2000)/256;           
  157.          TL1=(65536-2000)%256;
  158.          k++;
  159.          beep=!beep;
  160.          if(k>=300)
  161.          {
  162.                    ET1=0;
  163.                    TR1=0;
  164.                    k=0;
  165.          }
  166. }
复制代码


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

使用道具 举报

沙发
ID:143244 发表于 2020-6-23 21:36 | 只看该作者
图片这段,是分钟计数。中断是50ms一次,if(i==2)是说两次一计数 每次0.1S  计数600就是60S也就是1分钟则分钟计数变量min加1
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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