找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2123|回復(fù): 1
收起左側(cè)

這是一段四位數(shù)碼管的單片機(jī)代碼,我想問問圖片里面那段是什么意思

[復(fù)制鏈接]
ID:659173 發(fā)表于 2020-6-23 20:40 | 顯示全部樓層 |閱讀模式
1a5302204bfadfe1dc0967c3d019b64.jpg

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

  3. #define GPIO_DIG   P2                      //數(shù)據(jù)端

  4. #define uchar unsigned char              //重命名關(guān)鍵字
  5. #define uint unsigned int                     //重命名關(guān)鍵字

  6. sbit K1=P3^0;            //開始
  7. sbit K2=P3^1;            //暫停
  8. sbit K3=P3^2;            //復(fù)位

  9. sbit L1=P1^4;            //數(shù)碼管1位選
  10. sbit L2=P1^5;            //數(shù)碼管2位選
  11. sbit L3=P1^6;            //數(shù)碼管3位選
  12. sbit L4=P1^7;            //數(shù)碼管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帶小數(shù)點(diǎn)的顯示碼
  22. unsigned char DisplayData[4];
  23. //用來存放要顯示的8位數(shù)的值

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

  28. void DigDisplay()                   //數(shù)碼管顯示子函數(shù)
  29. {
  30.          unsignedint j;              //定義變量

  31.          L1=0;                             //位選
  32.          L2=1;
  33.          L3=1;
  34.          L4=1;
  35.          GPIO_DIG= DisplayData[0];     //發(fā)送段碼
  36.          j= 1000;                                                    //掃描間隔時(shí)間設(shè)定
  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];     //發(fā)送段碼
  47.          j= 1000;                                                    //掃描間隔時(shí)間設(shè)定
  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];     //發(fā)送段碼
  58.          j= 1000;                                                    //掃描間隔時(shí)間設(shè)定
  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];     //發(fā)送段碼
  69.          j= 1000;                                                    //掃描間隔時(shí)間設(shè)定
  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;            //初始化數(shù)據(jù)口

  81.          TMOD=0x01;                               //定時(shí)器0方式1
  82.          TH0=(65536-50000)/256;                  //定時(shí)器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;               //開啟定時(shí)器
  95.                    }
  96.                    if(K2==0)
  97.                    {
  98.                             ET0=0;
  99.                             TR0=0;               //關(guān)閉定時(shí)器
  100.                    }
  101.                    if(K3==0)                                                 //復(fù)位按鍵按下時(shí)
  102.                    {
  103.                             ET0=0;
  104.                             TR0=0;               //關(guān)閉定時(shí)器
  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;                                                            //清零計(jì)數(shù)
  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;               //關(guān)閉定時(shí)器
  121.                             ET1=1;
  122.                             TR1=1;
  123.                    }

  124.                    DigDisplay();               //執(zhí)行數(shù)碼管顯示函數(shù)
  125.     }
  126. }


  127. //T0中斷函數(shù)
  128. void DSY_Refresh() interrupt 1
  129. {
  130.          TH0=(65536-50000)/256;                  //恢復(fù)定時(shí)器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轉(zhuǎn)換狀態(tài)
  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];   //顯示個(gè)位
  150.                    DisplayData[3]= DIG_CODE[Second_Counts%10];                     //顯示小數(shù)點(diǎn)后一位
  151. //               if(Second_Counts==10000)Second_Counts=0;                            //當(dāng)秒計(jì)數(shù)到1000秒又變?yōu)?
  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. }
復(fù)制代碼


回復(fù)

使用道具 舉報(bào)

ID:143244 發(fā)表于 2020-6-23 21:36 | 顯示全部樓層
圖片這段,是分鐘計(jì)數(shù)。中斷是50ms一次,if(i==2)是說兩次一計(jì)數(shù) 每次0.1S  計(jì)數(shù)600就是60S也就是1分鐘則分鐘計(jì)數(shù)變量min加1
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表