找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC单片机动态显示数码管程序显示亮度不一致原因是什么?

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


单片机源程序如下:
  1. #include "STC8H.h"
  2. #include "intrins.h"

  3. unsigned char NixieTable[]={ 0x03,/*0*/
  4.         0x9F,/*1*/
  5.         0x25,/*2*/
  6.         0x0D,/*3*/
  7.         0x99,/*4*/
  8.         0x49,/*5*/
  9.         0x41,/*6*/
  10.         0x1F,/*7*/
  11.         0x01,/*8*/
  12.         0x09,/*9*/};

  13. void Delay1ms()                //@11.0592MHz
  14. {
  15.         unsigned char i, j;

  16.         i = 15;
  17.         j = 90;
  18.         do
  19.         {
  20.                 while (--j);
  21.         } while (--i);
  22. }

  23. void DelayXms(unsigned int x) //@11.0592MHz
  24. {
  25.         while (--x)
  26.         {
  27.    Delay1ms();
  28.          }

  29. }
  30. /************************************************
  31. * 函数名: void Led_Code(Lint date)  
  32. * 功  能: 数码管显示函数
  33. * 参  数: 无符号长整型,要显示的数字
  34. * 返回值: 无
  35. ***********************************************/
  36. void Led_adc(unsigned int date) //显示函数
  37. {        
  38.         unsigned int a,b,c,d;
  39.         
  40.           a=date/1000%10;                        //求千位
  41.           b=date/100%10;                        //求百位
  42.           c=date/10%10;                                  //求十位
  43.           d=date%10;                                          //求个位
  44.         
  45.           P10=1;P11=1;P12=1;P13=1;
  46.            P2=NixieTable[a];           //千
  47.           P10=0;P11=1;P12=1;P13=1;
  48.           DelayXms(2);
  49.                           
  50.           P10=1;P11=1;P12=1;P13=1;
  51.       P2=NixieTable[b];          //百
  52.          P11=0;//P12=1;P13=1; P10=1;
  53.           DelayXms(2);
  54.                
  55.                 P10=1;P11=1;P12=1;P13=1;
  56.       P2=NixieTable[c];          //十
  57.           P12=0;P13=1;P10=1;P11=1;
  58.           DelayXms(2);
  59.                
  60.                 P10=1;P11=1;P12=1;P13=1;
  61.       P2=NixieTable[d];               //个
  62.           P13=0;P10=1;P11=1;P12=1;
  63.           DelayXms(2);
  64. }

  65. /************************************************
  66. * 函数名: void Led_Code(Lint date)  
  67. * 功  能: 数码管显示函数
  68. * 参  数: 无符号长整型,要显示的数字
  69. * 返回值: 无
  70. ***********************************************/
  71. void Led_Off(unsigned int date) //显示函数
  72. {        
  73.         unsigned int a,b,c;
  74.         
  75.           a=date/100%10;                        //求百位
  76.           b=date/10%10;                                  //求十位
  77.           c=date%10;                                          //求个位
  78.         
  79.           P14=1;P15=1;P33=1;
  80.              P2=NixieTable[a];//百位
  81.           P14=0;P15=1;P33=1;
  82.           DelayXms(2);
  83.                
  84.           P14=1;P15=1;P33=1;  
  85.       P2=NixieTable[b];//十位
  86.           P15=0;P33=1;P14=1;
  87.           DelayXms(2);
  88.                
  89.                 P14=1;P15=1;P33=1;  
  90.     P2=NixieTable[c];//个位
  91.           P33=0;P14=1;P15=1;
  92.           DelayXms(2);
  93. }

  94. /************************************************
  95. * 函数名: void Led_Code(Lint date)  
  96. * 功  能: 数码管显示函数
  97. * 参  数: 无符号长整型,要显示的数字
  98. * 返回值: 无
  99. ***********************************************/
  100. void Led_On(unsigned int date) //显示函数
  101. {        
  102.         unsigned int a,b,c;
  103.         
  104.           a=date/100%10;                        //求百位
  105.           b=date/10%10;                                  //求十位
  106.           c=date%10;                                          //求个位
  107.         
  108.           P00=1;P01=1;P02=1;            
  109.              P2=NixieTable[a];//百位
  110.           P00=0;P01=1;P02=1;
  111.           DelayXms(2);
  112.                
  113.           P00=1;P01=1;P02=1;   
  114.       P2=NixieTable[b];//十位
  115.          P01=0;P02=1;P00=1;
  116.           DelayXms(2);
  117.                
  118.                 P00=1;P01=1;P02=1;  
  119.     P2=NixieTable[c];//个位
  120.           P02=0;P00=1;P01=1;
  121.           DelayXms(2);
  122. }

  123. void main ()
  124. {               P0M0 = 0x07; P0M1 = 0x00;


  125.         P1M0 = 0x00; P1M1 = 0xc0;
  126.         P2M0 = 0xff; P2M1 = 0x00;
  127.         P3M0 = 0x08; P3M1 = 0x00;
  128.         Timer0_init() ;
  129.               Timer2_init();
  130.               Timer3_init();
  131. while(1)
  132.         {                        


  133.         }

  134. }
  135. SMG_SaoMiao()interrupt 1
  136. {      //数码管扫描定时器0        
  137.         unsigned int s;
  138.         if(++s>1)
  139.   {      s=0;
  140.          Led_adc(temperature) ;         
  141.   }
  142. }        

  143. void TM2_Isr() interrupt 12
  144. {
  145.         unsigned int s;
  146.         kaiji_wendu = 012;
  147.         tingzhi_wendu = 055 ;        
  148.         if(++s>1)
  149.   {      s=0;
  150.     Led_On(kaiji_wendu) ;
  151.                     
  152.   }                             
  153. }

  154. void TM3_Isr() interrupt 19
  155. {  
  156.         unsigned int s;
  157.   tingzhi_wendu = 055 ;        
  158.         if(++s>1)
  159.   {      s=0;
  160.                                  Led_Off(tingzhi_wendu);      
  161.   }
  162. }
复制代码

数码管亮度显示不一致,是什么原因?

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

使用道具 举报

沙发
ID:161164 发表于 2024-1-17 17:17 | 只看该作者
        Timer0_init();
        Timer2_init();
        Timer3_init();
这三个函数呢?
回复

使用道具 举报

板凳
ID:332444 发表于 2024-1-17 19:12 | 只看该作者
可能同消隐有些关联
回复

使用道具 举报

地板
ID:213173 发表于 2024-1-17 20:38 | 只看该作者
如果硬件没问题数码管亮度不一致通常是显示函数中各数码管点亮时间不均衡所致。从贴图和代码看,硬件和软件设计都不合理。STC8H的IO可以直接驱动数码管,根本用不着加三极管放大。
回复

使用道具 举报

5#
ID:72649 发表于 2024-1-17 20:54 | 只看该作者
lkc8210 发表于 2024-1-17 17:17
Timer0_init();
        Timer2_init();
        Timer3_init();

void Timer0_init()  //1ms
{
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
                                TL0 = 0xCD;                                //设置定时初始值
                                TH0 = 0xD4;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;      //开T0中断
        EA=1;       
}

void Timer2_init()  //1ms
{
        AUXR &= 0xFB;                        //定时器时钟12T模式
        T2L = 0x66;                                //设置定时初始值
        T2H = 0xFC;                                //设置定时初始值
        AUXR |= 0x10;                        //定时器2开始计时
    IE2 =  0x04;                                  //使能定时器中断
    EA = 1;
}

void Timer3_init()  //1ms
{
        T4T3M &= 0xFD;                        //定时器时钟12T模式
        T3L = 0x66;                                //设置定时初始值
        T3H = 0xFC;                                //设置定时初始值
        T4T3M |= 0x08;                        //定时器3开始计时                              
        IE2 = 0x20;         //使能定时器中断
    EA = 1;
}
忘记贴上了
回复

使用道具 举报

6#
ID:72649 发表于 2024-1-17 21:31 | 只看该作者
wulin 发表于 2024-1-17 20:38
如果硬件没问题数码管亮度不一致通常是显示函数中各数码管点亮时间不均衡所致。从贴图和代码看,硬件和软件 ...

STC实验箱的原理图就是这样
回复

使用道具 举报

7#
ID:161164 发表于 2024-1-17 22:13 | 只看该作者
hjx5548 发表于 2024-1-17 20:54
void Timer0_init()  //1ms
{
        AUXR &= 0x7F;                        //定时器时钟12T模式

你定时1ms
但Led_adc耗时8ms
Led_On和Led_Off各耗时6ms
????????
回复

使用道具 举报

8#
ID:72649 发表于 2024-1-18 05:02 来自手机 | 只看该作者
lkc8210 发表于 2024-1-17 22:13
你定时1ms
但Led_adc耗时8ms
Led_On和Led_Off各耗时6ms

我不用定时器,把三个显示放在主函数的大循环里面,也是这个情况。
回复

使用道具 举报

9#
ID:161164 发表于 2024-1-18 09:21 | 只看该作者
hjx5548 发表于 2024-1-18 05:02
我不用定时器,把三个显示放在主函数的大循环里面,也是这个情况。

消影顺序问题
第1,2,3位数码管的亮光时间都是2ms
但第4位数码管的亮光时间都是2+6+6=14ms
另外两组数码管同上
你把关灯代码放到延时后试试



另外
中断里不要用延时!
中断里不要用延时!中断里不要用延时!
回复

使用道具 举报

10#
ID:192020 发表于 2024-1-18 09:23 | 只看该作者
可以看出都是数码管最后一位比较亮,因为最后一位亮的时间最长,前一二位是亮2毫秒,最后一位是等所有程序执行一轮后才开始继续亮,估计得亮十几个毫秒。软件需要改动,把延时去掉,显示逻辑改一下
回复

使用道具 举报

11#
ID:72649 发表于 2024-1-18 09:47 | 只看该作者
qq475878026 发表于 2024-1-18 09:23
可以看出都是数码管最后一位比较亮,因为最后一位亮的时间最长,前一二位是亮2毫秒,最后一位是等所有程序 ...

显示逻辑应该怎么修改?
回复

使用道具 举报

12#
ID:192020 发表于 2024-1-18 10:01 | 只看该作者
hjx5548 发表于 2024-1-18 09:47
显示逻辑应该怎么修改?

延时肯定是要去掉的了,可以把三个显示函数放在同一个中断,反正定时时间一样,没必要搞三个定时器。然后定义个全局变量来替代延时,每进一次中断就+1,在中断里判断这个全局变量,判断到比之前大1说明就延时1毫秒,用这个逻辑来替代之前用的延时函数,其他也没什么了
回复

使用道具 举报

13#
ID:213173 发表于 2024-1-18 15:38 | 只看该作者
hjx5548 发表于 2024-1-17 21:31
STC实验箱的原理图就是这样

STC实验箱有好几款,你参照的是哪款。最好把你制作PCB的原理图贴出来,图片中有两处笔段只隐约显示一半,确实匪夷所思。

回复

使用道具 举报

14#
ID:72649 发表于 2024-1-21 21:47 | 只看该作者
wulin 发表于 2024-1-18 15:38
STC实验箱有好几款,你参照的是哪款。最好把你制作PCB的原理图贴出来,图片中有两处笔段只隐约显示一半, ...

找到原因了。非常感谢
回复

使用道具 举报

15#
ID:1102070 发表于 2024-1-22 08:25 来自手机 | 只看该作者
加电源,独立供电。
回复

使用道具 举报

16#
ID:161164 发表于 2024-1-22 09:04 | 只看该作者
hjx5548 发表于 2024-1-21 21:47
找到原因了。非常感谢

不说一下原因是啥?
回复

使用道具 举报

17#
ID:384109 发表于 2024-1-22 11:10 | 只看该作者
原因估计是三个数码管模块是一起显示的,做扫描显示时是三个数码管模块单独控制的,应该把三个数码管模块当作一个整体来考虑
回复

使用道具 举报

18#
ID:849913 发表于 2024-2-9 22:45 | 只看该作者
第57行 P11=0;//P12=1;P13=1; P10=1; "//"为何要注释掉这样会导致P11和P10都是0,显示会乱的
回复

使用道具 举报

19#
ID:1109793 发表于 2024-2-10 19:00 | 只看该作者
第50行挪到第68行后面试试
回复

使用道具 举报

20#
ID:111875 发表于 2024-2-11 14:55 | 只看该作者
电容加的少了吧
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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