標(biāo)題: STC單片機(jī)動(dòng)態(tài)顯示數(shù)碼管程序顯示亮度不一致原因是什么? [打印本頁(yè)]

作者: hjx5548    時(shí)間: 2024-1-17 16:41
標(biāo)題: STC單片機(jī)動(dòng)態(tài)顯示數(shù)碼管程序顯示亮度不一致原因是什么?


單片機(jī)源程序如下:
  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. * 函數(shù)名: void Led_Code(Lint date)  
  32. * 功  能: 數(shù)碼管顯示函數(shù)
  33. * 參  數(shù): 無(wú)符號(hào)長(zhǎng)整型,要顯示的數(shù)字
  34. * 返回值: 無(wú)
  35. ***********************************************/
  36. void Led_adc(unsigned int date) //顯示函數(shù)
  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;                                          //求個(gè)位
  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];               //個(gè)
  62.           P13=0;P10=1;P11=1;P12=1;
  63.           DelayXms(2);
  64. }

  65. /************************************************
  66. * 函數(shù)名: void Led_Code(Lint date)  
  67. * 功  能: 數(shù)碼管顯示函數(shù)
  68. * 參  數(shù): 無(wú)符號(hào)長(zhǎng)整型,要顯示的數(shù)字
  69. * 返回值: 無(wú)
  70. ***********************************************/
  71. void Led_Off(unsigned int date) //顯示函數(shù)
  72. {        
  73.         unsigned int a,b,c;
  74.         
  75.           a=date/100%10;                        //求百位
  76.           b=date/10%10;                                  //求十位
  77.           c=date%10;                                          //求個(gè)位
  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];//個(gè)位
  91.           P33=0;P14=1;P15=1;
  92.           DelayXms(2);
  93. }

  94. /************************************************
  95. * 函數(shù)名: void Led_Code(Lint date)  
  96. * 功  能: 數(shù)碼管顯示函數(shù)
  97. * 參  數(shù): 無(wú)符號(hào)長(zhǎng)整型,要顯示的數(shù)字
  98. * 返回值: 無(wú)
  99. ***********************************************/
  100. void Led_On(unsigned int date) //顯示函數(shù)
  101. {        
  102.         unsigned int a,b,c;
  103.         
  104.           a=date/100%10;                        //求百位
  105.           b=date/10%10;                                  //求十位
  106.           c=date%10;                                          //求個(gè)位
  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];//個(gè)位
  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. {      //數(shù)碼管掃描定時(shí)器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. }
復(fù)制代碼

數(shù)碼管亮度顯示不一致,是什么原因?


作者: lkc8210    時(shí)間: 2024-1-17 17:17
        Timer0_init();
        Timer2_init();
        Timer3_init();
這三個(gè)函數(shù)呢?
作者: xianfajushi    時(shí)間: 2024-1-17 19:12
可能同消隱有些關(guān)聯(lián)
作者: wulin    時(shí)間: 2024-1-17 20:38
如果硬件沒(méi)問(wèn)題數(shù)碼管亮度不一致通常是顯示函數(shù)中各數(shù)碼管點(diǎn)亮?xí)r間不均衡所致。從貼圖和代碼看,硬件和軟件設(shè)計(jì)都不合理。STC8H的IO可以直接驅(qū)動(dòng)數(shù)碼管,根本用不著加三極管放大。
作者: hjx5548    時(shí)間: 2024-1-17 20:54
lkc8210 發(fā)表于 2024-1-17 17:17
Timer0_init();
        Timer2_init();
        Timer3_init();

void Timer0_init()  //1ms
{
        AUXR &= 0x7F;                        //定時(shí)器時(shí)鐘12T模式
        TMOD &= 0xF0;                        //設(shè)置定時(shí)器模式
                                TL0 = 0xCD;                                //設(shè)置定時(shí)初始值
                                TH0 = 0xD4;                                //設(shè)置定時(shí)初始值
        TF0 = 0;                                //清除TF0標(biāo)志
        TR0 = 1;                                //定時(shí)器0開(kāi)始計(jì)時(shí)
        ET0 = 1;      //開(kāi)T0中斷
        EA=1;       
}

void Timer2_init()  //1ms
{
        AUXR &= 0xFB;                        //定時(shí)器時(shí)鐘12T模式
        T2L = 0x66;                                //設(shè)置定時(shí)初始值
        T2H = 0xFC;                                //設(shè)置定時(shí)初始值
        AUXR |= 0x10;                        //定時(shí)器2開(kāi)始計(jì)時(shí)
    IE2 =  0x04;                                  //使能定時(shí)器中斷
    EA = 1;
}

void Timer3_init()  //1ms
{
        T4T3M &= 0xFD;                        //定時(shí)器時(shí)鐘12T模式
        T3L = 0x66;                                //設(shè)置定時(shí)初始值
        T3H = 0xFC;                                //設(shè)置定時(shí)初始值
        T4T3M |= 0x08;                        //定時(shí)器3開(kāi)始計(jì)時(shí)                              
        IE2 = 0x20;         //使能定時(shí)器中斷
    EA = 1;
}
忘記貼上了
作者: hjx5548    時(shí)間: 2024-1-17 21:31
wulin 發(fā)表于 2024-1-17 20:38
如果硬件沒(méi)問(wèn)題數(shù)碼管亮度不一致通常是顯示函數(shù)中各數(shù)碼管點(diǎn)亮?xí)r間不均衡所致。從貼圖和代碼看,硬件和軟件 ...

STC實(shí)驗(yàn)箱的原理圖就是這樣
作者: lkc8210    時(shí)間: 2024-1-17 22:13
hjx5548 發(fā)表于 2024-1-17 20:54
void Timer0_init()  //1ms
{
        AUXR &= 0x7F;                        //定時(shí)器時(shí)鐘12T模式

你定時(shí)1ms
但Led_adc耗時(shí)8ms
Led_On和Led_Off各耗時(shí)6ms
????????
作者: hjx5548    時(shí)間: 2024-1-18 05:02
lkc8210 發(fā)表于 2024-1-17 22:13
你定時(shí)1ms
但Led_adc耗時(shí)8ms
Led_On和Led_Off各耗時(shí)6ms

我不用定時(shí)器,把三個(gè)顯示放在主函數(shù)的大循環(huán)里面,也是這個(gè)情況。
作者: lkc8210    時(shí)間: 2024-1-18 09:21
hjx5548 發(fā)表于 2024-1-18 05:02
我不用定時(shí)器,把三個(gè)顯示放在主函數(shù)的大循環(huán)里面,也是這個(gè)情況。

消影順序問(wèn)題
第1,2,3位數(shù)碼管的亮光時(shí)間都是2ms
但第4位數(shù)碼管的亮光時(shí)間都是2+6+6=14ms
另外兩組數(shù)碼管同上
你把關(guān)燈代碼放到延時(shí)后試試



另外
中斷里不要用延時(shí)!
中斷里不要用延時(shí)!中斷里不要用延時(shí)!

作者: Graves    時(shí)間: 2024-1-18 09:23
可以看出都是數(shù)碼管最后一位比較亮,因?yàn)樽詈笠晃涣恋臅r(shí)間最長(zhǎng),前一二位是亮2毫秒,最后一位是等所有程序執(zhí)行一輪后才開(kāi)始繼續(xù)亮,估計(jì)得亮十幾個(gè)毫秒。軟件需要改動(dòng),把延時(shí)去掉,顯示邏輯改一下
作者: hjx5548    時(shí)間: 2024-1-18 09:47
qq475878026 發(fā)表于 2024-1-18 09:23
可以看出都是數(shù)碼管最后一位比較亮,因?yàn)樽詈笠晃涣恋臅r(shí)間最長(zhǎng),前一二位是亮2毫秒,最后一位是等所有程序 ...

顯示邏輯應(yīng)該怎么修改?
作者: Graves    時(shí)間: 2024-1-18 10:01
hjx5548 發(fā)表于 2024-1-18 09:47
顯示邏輯應(yīng)該怎么修改?

延時(shí)肯定是要去掉的了,可以把三個(gè)顯示函數(shù)放在同一個(gè)中斷,反正定時(shí)時(shí)間一樣,沒(méi)必要搞三個(gè)定時(shí)器。然后定義個(gè)全局變量來(lái)替代延時(shí),每進(jìn)一次中斷就+1,在中斷里判斷這個(gè)全局變量,判斷到比之前大1說(shuō)明就延時(shí)1毫秒,用這個(gè)邏輯來(lái)替代之前用的延時(shí)函數(shù),其他也沒(méi)什么了
作者: wulin    時(shí)間: 2024-1-18 15:38
hjx5548 發(fā)表于 2024-1-17 21:31
STC實(shí)驗(yàn)箱的原理圖就是這樣

STC實(shí)驗(yàn)箱有好幾款,你參照的是哪款。最好把你制作PCB的原理圖貼出來(lái),圖片中有兩處筆段只隱約顯示一半,確實(shí)匪夷所思。


作者: hjx5548    時(shí)間: 2024-1-21 21:47
wulin 發(fā)表于 2024-1-18 15:38
STC實(shí)驗(yàn)箱有好幾款,你參照的是哪款。最好把你制作PCB的原理圖貼出來(lái),圖片中有兩處筆段只隱約顯示一半, ...

找到原因了。非常感謝
作者: nxplpcexpresso    時(shí)間: 2024-1-22 08:25
加電源,獨(dú)立供電。
作者: lkc8210    時(shí)間: 2024-1-22 09:04
hjx5548 發(fā)表于 2024-1-21 21:47
找到原因了。非常感謝

不說(shuō)一下原因是啥?
作者: 人中狼    時(shí)間: 2024-1-22 11:10
原因估計(jì)是三個(gè)數(shù)碼管模塊是一起顯示的,做掃描顯示時(shí)是三個(gè)數(shù)碼管模塊單獨(dú)控制的,應(yīng)該把三個(gè)數(shù)碼管模塊當(dāng)作一個(gè)整體來(lái)考慮
作者: 老董    時(shí)間: 2024-2-9 22:45
第57行 P11=0;//P12=1;P13=1; P10=1; "//"為何要注釋掉這樣會(huì)導(dǎo)致P11和P10都是0,顯示會(huì)亂的
作者: xiaobendan001    時(shí)間: 2024-2-10 19:00
第50行挪到第68行后面試試
作者: 幻神神    時(shí)間: 2024-2-11 14:55
電容加的少了吧




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1