找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4172|回复: 9
收起左侧

这一段单片机代码什么意思?求大佬解释

[复制链接]
ID:841280 发表于 2020-11-20 20:19 | 显示全部楼层 |阅读模式
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. }
复制代码

回复

使用道具 举报

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之类的锁存控制脚,有可能是光汇科技的单片机学习板
回复

使用道具 举报

ID:846847 发表于 2020-11-21 13:37 | 显示全部楼层
前面是数码管段码,后面是显示,应该是一个计时器之类的显示程序
回复

使用道具 举报

ID:213173 发表于 2020-11-21 15:07 | 显示全部楼层
给你详细注释。
无标题.jpg

  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. }
复制代码



回复

使用道具 举报

ID:553941 发表于 2020-11-21 16:02 | 显示全部楼层
hhdsdy 发表于 2020-11-21 10:41
“没有电路图,无法判断
sbit DULA = P2^6;
sbit WELA = P2^7;

对,应该是两个573,一个段数据,一个位数据
回复

使用道具 举报

ID:841280 发表于 2020-11-24 16:58 来自手机 | 显示全部楼层
wulin 发表于 2020-11-21 15:07
给你详细注释。

怎么修改下代码才能让led闪烁
回复

使用道具 举报

ID:841280 发表于 2020-11-24 17:17 来自手机 | 显示全部楼层
wulin 发表于 2020-11-21 15:07
给你详细注释。

大佬,如果我还想在用串口显示文字怎么改代码?
回复

使用道具 举报

ID:311846 发表于 2020-11-25 16:26 | 显示全部楼层
knight123. 发表于 2020-11-24 17:17
大佬,如果我还想在用串口显示文字怎么改代码?

%5SRO`WPO$%3HCY4Y[L4M1S.png
重定义printf函数到串口1,要先配置好串口1,同理可以换其他串口,然后调用printf函数就可以了。

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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