久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4368|回復: 9
打印 上一主題 下一主題
收起左側

這一段單片機代碼什么意思?求大佬解釋

[復制鏈接]
跳轉到指定樓層
樓主
100黑幣
  1. #include <reg52.h>

  2. sbit DULA = P2^6;
  3. sbit WELA = P2^7;

  4. unsigned char code DUTable[16] =
  5. {
  6.         0x3F,0x06,0x5B,0x4F,
  7.         0x66,0x6D,0x7D,0x07,
  8.         0x7F,0x6F,0x77,0x7C,
  9.         0x39,0x5E,0x79,0x71
  10. };

  11. unsigned char code WETable[8] =
  12. {
  13.         ~0x80,~0x40,~0x20,~0x10,
  14.         ~0x08,~0x04,~0x02,~0x01
  15. };

  16. unsigned char LedBuff[8] =
  17. {
  18.         0x3F,0x3F,0x00,0X00,
  19.         0X00,0X00,0X00,0X00
  20. };

  21. unsigned char T0RH,T0RL;
  22. bit flag1s = 0;

  23. void ConfigTimer0(unsigned char ms);
  24. void TransLED(void);

  25. void main(void)
  26. {
  27.         ConfigTimer0(1);
  28.         while(1)
  29.         {
  30.                 if(flag1s)
  31.                 {
  32.                         flag1s = 0;
  33.                         TransLED();
  34.                 }
  35.         }
  36. }

  37. void TransLED(void)
  38. {
  39.         static unsigned char num = 0;
  40.         static unsigned char led = 0;

  41.         if(0 == num)
  42.         {
  43.                 switch(led)
  44.                 {
  45.                         case 0 : led = 1; num = 9; P1 = ~0x04; break;
  46.                         case 1 : led = 2; num = 4; P1 = ~0x02; break;
  47.                         case 2 : led = 0; num = 9; P1 = ~0x01; break;
  48.                 }
  49.         }
  50.         else
  51.         {
  52.                 num--;
  53.         }

  54.         LedBuff[0] = DUTable[num/1%10];
  55.         LedBuff[1] = DUTable[num/10%10];
  56. }

  57. void ConfigTimer0(unsigned char ms)
  58. {
  59.         unsigned long tmp;

  60.         tmp = 11059200 / 12;
  61.         tmp = tmp * ms / 1000;
  62.         tmp = 65536 - tmp;
  63.         tmp += 12;

  64.         T0RH = (unsigned char)(tmp>>8);
  65.         T0RL = (unsigned char)tmp;

  66.         TH0 = T0RH;
  67.         TL0 = T0RL;
  68.         TMOD &= 0xF0;
  69.         TMOD |= 0x01;
  70.         EA = 1;
  71.         ET0 = 1;
  72.         TF0 = 0;
  73.         TR0 = 1;
  74. }

  75. void LedScan(void)
  76. {
  77.         static unsigned char i = 0;

  78.         P0 = 0x00;
  79.         DULA = 1;
  80.         DULA = 0;
  81.         P0 = WETable[i];
  82.         WELA = 1;
  83.         WELA = 0;
  84.         P0 = LedBuff[i];
  85.         DULA = 1;
  86.         DULA = 0;

  87.         i++;
  88.         if(i>=8)
  89.         {
  90.                 i = 0;
  91.         }
  92. }

  93. void InterruptTimer0(void) interrupt 1
  94. {
  95.         static unsigned int tmr1s = 0;

  96.         TH0 = T0RH;
  97.         TL0 = T0RL;

  98.         LedScan();

  99.         tmr1s++;
  100.         if(tmr1s>=1000)
  101.         {
  102.                 tmr1s = 0;
  103.                 flag1s = 1;
  104.         }
  105. }
復制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:451718 發表于 2020-11-21 10:00 | 只看該作者
//------------------共陰數碼管段碼表----------------------
unsigned char code DUTable[16] =
{
        0x3F,0x06,0x5B,0x4F,
        0x66,0x6D,0x7D,0x07,
        0x7F,0x6F,0x77,0x7C,
        0x39,0x5E,0x79,0x71
};

//------------------------不顯示單個段碼表,配合上面那個共陰數碼管用的----------------
unsigned char code WETable[8] =
{
        ~0x80,~0x40,~0x20,~0x10,
        ~0x08,~0x04,~0x02,~0x01
};

//-----------------------數碼管真值表,從這個表來看,可以提供8位數碼管顯示的真值-----------------
//-----------------------其中最低兩位初值顯示為0,其他位無顯示
unsigned char LedBuff[8] =
{
        0x3F,0x3F,0x00,0X00,
        0X00,0X00,0X00,0X00
};

沒有電路圖,無法判斷
sbit DULA = P2^6;
sbit WELA = P2^7;
的實際用途,估計是給某個邏輯器件提供觸發脈沖用的。

總體從定時器的設置來看,應該是一個帶點花樣顯示的秒表計時器
回復

使用道具 舉報

板凳
ID:841280 發表于 2020-11-21 10:30 | 只看該作者
robinsonlin 發表于 2020-11-21 10:00
//------------------共陰數碼管段碼表----------------------
unsigned char code DUTable[16] =
{

大佬這是一個簡易交通燈的代碼
哪里是定時器倒計時  那里是led燈顯示
回復

使用道具 舉報

地板
ID:88256 發表于 2020-11-21 10:41 | 只看該作者
robinsonlin 發表于 2020-11-21 10:00
//------------------共陰數碼管段碼表----------------------
unsigned char code DUTable[16] =
{

“沒有電路圖,無法判斷
sbit DULA = P2^6;
sbit WELA = P2^7;
的實際用途,估計是給某個邏輯器件提供觸發脈沖用的。”

這個應該是74HC573之類的鎖存控制腳,有可能是光匯科技的單片機學習板
回復

使用道具 舉報

5#
ID:846847 發表于 2020-11-21 13:37 | 只看該作者
前面是數碼管段碼,后面是顯示,應該是一個計時器之類的顯示程序
回復

使用道具 舉報

6#
ID:213173 發表于 2020-11-21 15:07 | 只看該作者
給你詳細注釋。


  1. #include <reg52.h>

  2. sbit DULA = P2^6;//數碼管段鎖存端口
  3. sbit WELA = P2^7;//數碼管位鎖存端口

  4. unsigned char code DUTable[16] = //共陰數碼管段碼0~f數組
  5. {
  6.         0x3F,0x06,0x5B,0x4F,
  7.         0x66,0x6D,0x7D,0x07,
  8.         0x7F,0x6F,0x77,0x7C,
  9.         0x39,0x5E,0x79,0x71
  10. };

  11. unsigned char code WETable[8] = //8位共陽數碼管位碼數組取反即是共陰
  12. {
  13.         ~0x80,~0x40,~0x20,~0x10,
  14.         ~0x08,~0x04,~0x02,~0x01
  15. };

  16. /*
  17. //等同下表
  18. unsigned char code WETable[8] = //8位共陰數碼管位碼數組
  19. {
  20.        0x7f,0xbf,0xdf,0xef
  21.        0xf7,0xfb,0xfd,0xfe,
  22. };*/

  23. unsigned char LedBuff[8] = //顯示緩存數組
  24. {
  25.         0x3F,0x3F,0x00,0X00,
  26.         0X00,0X00,0X00,0X00
  27. };

  28. unsigned char T0RH,T0RL;//中間變量
  29. bit flag1s = 0;//秒標志

  30. void ConfigTimer0(/*unsigned char ms*/);//定時器初始化函數聲明
  31. void TransLED(void);//倒計數函數聲明

  32. void main(void)
  33. {
  34.         ConfigTimer0();//定時器初始化
  35.         while(1)
  36.         {
  37.                 if(flag1s)//如果flag1s為真
  38.                 {
  39.                         flag1s = 0;//清0復位
  40.                         TransLED();//倒計數
  41.                 }
  42.         }
  43. }
  44. //倒計數函數
  45. void TransLED(void)
  46. {
  47.         static unsigned char num = 0;//靜態局部變量
  48.         static unsigned char led = 0;//靜態局部變量
  49.         if(0 == num)//如果計數變量=0,則執行下一輪倒計數
  50.         {
  51.                 switch(led)
  52.                 {
  53.                         case 0 : led = 1; num = 9; P1 = ~0x04; break;//第一輪倒計數num賦初值
  54.                         case 1 : led = 2; num = 4; P1 = ~0x02; break;//第二輪倒計數num賦初值
  55.                         case 2 : led = 0; num = 9; P1 = ~0x01; break;//第三輪倒計數num賦初值 建議num>10測試
  56.                 }
  57.         }
  58.         else//num大于0
  59.         {
  60.                 num--;//num自減1
  61.         }
  62.        
  63.         LedBuff[0] = DUTable[num/1%10];//分解num的個位并轉換為代碼字符保存在緩存
  64.         LedBuff[1] = DUTable[num/10%10];//分解num的十位并轉換為代碼字符保存在緩存,實際用不到,num最大是9
  65. }
  66. //定時器初始化函數
  67. void ConfigTimer0(/*unsigned char ms*/)
  68. {
  69.         //計算定時初值
  70. /*
  71.         unsigned long tmp;       
  72.         tmp = 11059200 / 12;
  73.         tmp = tmp * ms / 1000;
  74.         tmp = 65536 - tmp;
  75.         tmp += 12;
  76.        
  77.         T0RH = (unsigned char)(tmp>>8);
  78.         T0RL = (unsigned char)tmp;
  79.        
  80.         TH0 = T0RH;//設置定時高8位初值
  81.         TL0 = T0RL;//設置定時低8位初值
  82. */
  83. //        直接賦值等同于上述復雜計算
  84.         TH0 = 0xFC;                //設置定時初值1ms
  85.         TL0 = 0x66;                //設置定時初值1ms

  86.         TMOD &= 0xF0;        //TMOD寄存器低4位清0
  87.         TMOD |= 0x01;        //設置T0工作模式1
  88.         EA = 1;                        //開總中斷
  89.         ET0 = 1;                        //開T0中斷
  90.         TF0 = 0;                        //T0中斷請求標志清0
  91.         TR0 = 1;                        //T0開始計時
  92. }
  93. //數碼管動態顯示函數
  94. void LedScan(void)
  95. {
  96.         static unsigned char i = 0;//靜態局部變量
  97. //        P0分時復用,輸出段碼和位碼
  98.         P0 = 0x00;//輸出段清0碼,消除殘影
  99.         DULA = 1;//送段碼
  100.         DULA = 0;//段碼鎖存
  101.         P0 = WETable[i];//輸出位碼
  102.         WELA = 1;//送位碼
  103.         WELA = 0;//位碼鎖存
  104.         P0 = LedBuff[i];//輸出段碼
  105.         DULA = 1;//送段碼
  106.         DULA = 0;//段碼鎖存
  107.        
  108.         i++;
  109.         if(i>=8)//8位數碼管輪流顯示計數
  110.         {
  111.                 i = 0;//清0
  112.         }
  113. }

  114. void InterruptTimer0(void) interrupt 1
  115. {
  116.         static unsigned int tmr1s = 0;
  117.        
  118. //        TH0 = T0RH;
  119. //        TL0 = T0RL;

  120.         TH0 = 0xFC;                //重裝定時初值1ms
  121.         TL0 = 0x66;                //重裝定時初值1ms       
  122.         LedScan();                //運行數碼管動態顯示程序
  123.        
  124.         tmr1s++;                //中斷計數
  125.         if(tmr1s>=1000) //1秒
  126.         {
  127.                 tmr1s = 0;  //清0
  128.                 flag1s = 1; //1秒標志置1
  129.         }
  130. }
復制代碼



回復

使用道具 舉報

7#
ID:553941 發表于 2020-11-21 16:02 | 只看該作者
hhdsdy 發表于 2020-11-21 10:41
“沒有電路圖,無法判斷
sbit DULA = P2^6;
sbit WELA = P2^7;

對,應該是兩個573,一個段數據,一個位數據
回復

使用道具 舉報

8#
ID:841280 發表于 2020-11-24 16:58 來自觸屏版 | 只看該作者
wulin 發表于 2020-11-21 15:07
給你詳細注釋。

怎么修改下代碼才能讓led閃爍
回復

使用道具 舉報

9#
ID:841280 發表于 2020-11-24 17:17 來自觸屏版 | 只看該作者
wulin 發表于 2020-11-21 15:07
給你詳細注釋。

大佬,如果我還想在用串口顯示文字怎么改代碼?
回復

使用道具 舉報

10#
ID:311846 發表于 2020-11-25 16:26 | 只看該作者
knight123. 發表于 2020-11-24 17:17
大佬,如果我還想在用串口顯示文字怎么改代碼?


重定義printf函數到串口1,要先配置好串口1,同理可以換其他串口,然后調用printf函數就可以了。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产剧情一区 | 日本一区二区三区四区 | 美女一级黄 | 成人欧美一区二区三区白人 | 在线看av的网址 | 久久精品国产v日韩v亚洲 | 91在线区 | 在线免费观看黄网 | 人人干97| 亚洲午夜av久久乱码 | 久久人人网 | 天天综合日日夜夜 | 亚洲女人天堂成人av在线 | 免费黄色网址视频 | 国产一区二区三区视频在线观看 | 国产在线一区二区 | 亚洲日本三级 | 国产精品久久一区二区三区 | 久久青青 | 久久日韩精品 | 午夜精品久久久久久久 | www.色.com | 综合色久| 亚洲国产精品福利 | 欧美日韩在线一区 | 成人在线视频免费观看 | 亚洲天堂中文字幕 | 国内自拍视频在线观看 | 精品免费视频一区二区 | 色婷婷av一区二区三区软件 | 操视频网站 | 亚洲国产精品va在线看黑人 | 亚洲高清成人在线 | 欧美极品少妇xxxxⅹ免费视频 | 亚洲一区在线播放 | 亚洲国产一区二区三区四区 | 精品一级毛片 | 亚洲精品一区国语对白 | a级大片免费观看 | 亚洲第一在线 | 亚洲性视频 |