找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機(jī)數(shù)碼管顯示程序問題求助

[復(fù)制鏈接]
ID:1001745 發(fā)表于 2023-2-7 14:40 | 顯示全部樓層 |閱讀模式
各位大神:新年好!    最近做了一個溫度報警器,數(shù)碼管為3位的共陰數(shù)碼管。在全顯時顯示正常的,在動態(tài)顯示時就會出現(xiàn)筆畫暗淡不清楚的現(xiàn)象?戳艘幌抡搲,感覺應(yīng)該是程序中的消隱沒有處理好,因個人能力有限,程序基本上都是摘錄論壇各路大神的現(xiàn)有程序修改的。希望各位大神能幫忙看一下程序看看是否程序有問題,謝謝!
  1. /***********四位共陰數(shù)碼管驅(qū)動程序************/
  2. //stc15w單片機(jī)
  3. //1在主程序前加上初始化init();程序
  4. //2硬件連接變動時需修改下面的參數(shù)
  5. sbit H1        = P1^0;//設(shè)置第1位數(shù)碼管陰極連接的I/O口
  6. sbit H2        = P1^1;//設(shè)置第2位數(shù)碼管陰極連接的I/O口
  7. sbit H3        = P1^2;//設(shè)置第3位數(shù)碼管陰極連接的I/O口
  8. //sbit H4        = P1^5;//設(shè)置第4位數(shù)碼管陰極連接的I/O口
  9. sbit a        = P3^5;
  10. sbit b        = P3^4;
  11. sbit c        = P3^3;
  12. sbit d        = P3^2;
  13. sbit e        = P2^1;
  14. sbit f        = P2^0;
  15. sbit g        = P3^7;
  16. sbit dp        = P3^6;

  17. #define P1M0SET                0x00 //設(shè)置I/O口工作方式//00000000(左到右,高到低位)
  18. #define P1M1SET                0x00 //設(shè)置I/O口工作方式//00000000
  19. #define P3M0SET                0xff //設(shè)置I/O口工作方式//11111111
  20. #define P3M1SET                0x00 //設(shè)置I/O口工作方式//00000000
  21. #define P2M0SET     0xff //設(shè)置IO口工作方式11111111
  22. #define P2M1SET     0x00 //設(shè)置IO口工作方式00000000
  23. /*****以上定義需要根據(jù)實際硬件情況更改******/
  24. data unsigned char PWM;//顯示亮度
  25. #define light                        9         //設(shè)置LED顯示的亮度(值域:1~9)
  26. #define DELAY_L                12         //設(shè)置每一個點顯示的時間長度(1~20)
  27. /********* 延時函數(shù)    ***************/
  28. void delay (unsigned int a){ // 用于點掃描的延時
  29.         unsigned int i;
  30.         while( a-- != 0){
  31.                 for(i = 0; i < DELAY_L; i++);
  32.         }                                      
  33. }
  34. /*********************************************************************************************/
  35. unsigned char code disdata[]={
  36. 0x3F,0x06,0x5B,0x4F,0x66,
  37. 0x6D,0x7D,0x07,0x7F,0x6F,
  38. 0x77,0x7C,0x39,0x5E,0x79,
  39. 0x71,0x40};//0-9,A-F,-



  40. //數(shù)碼管:正向位置;共YIN極;正向連接

  41. void dis_off (void)
  42. {
  43.         P3 = ~P3M0SET; //關(guān)所有顯示
  44.     P2 = ~P2M0SET;
  45.         H1=H2=H3=1;//P1 = ~P1M0SET;
  46.         delay(10-PWM);


  47. }
  48. /*********************************************************************************************/
  49. void displayHH1 (unsigned char q){ //第1位數(shù)碼管顯示程序
  50.         unsigned char i;
  51.         i = q & 0x01;
  52.         if(i == 0x01){
  53.                 H1 = 0;a = 1;}delay(PWM);dis_off();
  54.         i = q & 0x02;
  55.         if(i == 0x02){
  56.                 H1 = 0;b = 1;}delay(PWM);dis_off();
  57.         i = q & 0x04;
  58.         if(i == 0x04){
  59.                 H1 = 0;c = 1;}delay(PWM);dis_off();
  60.         i = q & 0x08;
  61.         if(i == 0x08){
  62.                 H1 = 0;d = 1;}delay(PWM);dis_off();
  63.         i = q & 0x10;
  64.         if(i == 0x10){
  65.                 H1 = 0;e = 1;}delay(PWM);dis_off();
  66.         i = q & 0x20;
  67.         if(i == 0x20){
  68.                 H1 = 0;f = 1;}delay(PWM);dis_off();
  69.         i = q & 0x40;
  70.         if(i == 0x40){
  71.                 H1 = 0;g = 1;}delay(PWM);dis_off();
  72.         i = q & 0x80;
  73.         if(i == 0x80){
  74.                 H1 = 0;dp = 1;}delay(PWM);dis_off();
  75. }
  76. /*********************************************************************************************/
  77. void displayHH2 (unsigned char q){ //第2位數(shù)碼管顯示程序
  78.         unsigned char i;
  79.         i = q & 0x01;
  80.         if(i == 0x01){
  81.                 H2 = 0;a = 1;}delay(PWM);dis_off();
  82.         i = q & 0x02;
  83.         if(i == 0x02){
  84.                 H2 = 0;b = 1;}delay(PWM);dis_off();
  85.         i = q & 0x04;
  86.         if(i == 0x04){
  87.                 H2 = 0;c = 1;}delay(PWM);dis_off();
  88.         i = q & 0x08;
  89.         if(i == 0x08){
  90.                 H2 = 0;d = 1;}delay(PWM);dis_off();
  91.         i = q & 0x10;
  92.         if(i == 0x10){
  93.                 H2 = 0;e = 1;}delay(PWM);dis_off();
  94.         i = q & 0x20;
  95.         if(i == 0x20){
  96.                 H2 = 0;f = 1;}delay(PWM);dis_off();
  97.         i = q & 0x40;
  98.         if(i == 0x40){
  99.                 H2 = 0;g = 1;}delay(PWM);dis_off();
  100.         i = q & 0x80;
  101.         if(i == 0x80){
  102.                 H2 = 0;dp = 1;}delay(PWM);dis_off();
  103. }
  104. /*********************************************************************************************/
  105. void displayHH3 (unsigned char q){ //第3位數(shù)碼管顯示程序
  106.         unsigned char i;
  107.         i = q & 0x01;
  108.         if(i == 0x01){
  109.                 H3 = 0;a = 1;}delay(PWM);dis_off();
  110.         i = q & 0x02;
  111.         if(i == 0x02){
  112.                 H3 = 0;b = 1;}delay(PWM);dis_off();
  113.         i = q & 0x04;
  114.         if(i == 0x04){
  115.                 H3 = 0;c = 1;}delay(PWM);dis_off();
  116.         i = q & 0x08;
  117.         if(i == 0x08){
  118.                 H3 = 0;d = 1;}delay(PWM);dis_off();
  119.         i = q & 0x10;
  120.         if(i == 0x10){
  121.                 H3 = 0;e = 1;}delay(PWM);dis_off();
  122.         i = q & 0x20;
  123.         if(i == 0x20){
  124.                 H3 = 0;f = 1;}delay(PWM);dis_off();
  125.         i = q & 0x40;
  126.         if(i == 0x40){
  127.                 H3 = 0;g = 1;}delay(PWM);dis_off();
  128.         i = q & 0x80;
  129.         if(i == 0x80){
  130.                 H3 = 0;dp = 1;}delay(PWM);dis_off();
  131. }
  132. void diplay_data (unsigned char l,unsigned char q){
  133.                 switch (l){//顯示的數(shù)碼管位置               
  134.                                 case 1://                        
  135.                                         displayHH1(q); //將顯示數(shù)據(jù)送入               
  136.                                         break;//               
  137.                                 case 2://                        
  138.                                         displayHH2(q); //將顯示數(shù)據(jù)送入               
  139.                                         break;//               
  140.                                 case 3://                        
  141.                                         displayHH3(q); //將顯示數(shù)據(jù)送入               
  142.                                         break;//
  143. //                                case 4://                        
  144. //                                        displayHH4(q); //將顯示數(shù)據(jù)送入               
  145. //                                        break;//                        
  146.                                 
  147.                 }
  148. }

  149. /*******************************************/
  150. void init (void){        
  151.                 P3M1=P3M1SET;
  152.                 P3M0=P3M0SET;
  153.                 P1M0=P1M0SET;
  154.                 P1M1=P1M1SET;
  155.                 dis_off();
  156.                 PWM = light;}
  157. /******************顯示程序*************************
  158. i=t/100;
  159. diplay_data (1,disdata[i]);
  160. i=t%100/10;
  161. diplay_data (2,disdata[i]+0x80);
  162. i=t%100%10;
  163. diplay_data (3,disdata[i]); */
復(fù)制代碼


篇幅限制,具體全部顯示代碼見附件。
4LED_YIN.rar (1.25 KB, 下載次數(shù): 7)



回復(fù)

使用道具 舉報

ID:1001745 發(fā)表于 2023-2-7 18:03 | 顯示全部樓層
111.png 測試圖片 222.png 顯示部分原理圖
回復(fù)

使用道具 舉報

ID:824490 發(fā)表于 2023-2-7 22:11 | 顯示全部樓層
你這個是MCU直驅(qū)數(shù)碼管,要想提高亮度只能是亮?xí)r延時加長,但是加太長會閃。。
小于20mS內(nèi)要掃一次,3個數(shù)碼管,每個點亮約6ms..這是沒有其它任務(wù)時的時間分配,若有其它任務(wù),則適當(dāng)調(diào)整;蚴怯枚〞r器中斷方式把時間分片,每6mS點亮一個數(shù)碼管。
回復(fù)

使用道具 舉報

ID:1001745 發(fā)表于 2023-2-8 08:36 | 顯示全部樓層
名字不是重點 發(fā)表于 2023-2-7 22:11
你這個是MCU直驅(qū)數(shù)碼管,要想提高亮度荒蓯橇潦毖郵奔映,但是吉qせ嶸。�
小于20mS內(nèi)要掃一次,3個數(shù) ...

感謝大神的回復(fù),小弟不才。您說的這些小弟不知道如何修改啊。
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2023-2-8 10:44 | 顯示全部樓層
mcuhui 發(fā)表于 2023-2-7 18:03
測試圖片顯示部分原理圖

你這個數(shù)碼管動態(tài)顯示函數(shù)太奇葩了,不可能正常顯示。按你的硬件圖,給你寫個示例。適用于STC15系列MCU,主函數(shù)中5ms延時不是必須的,是留有足夠的時間用于添加其它應(yīng)用程序。主函數(shù)循環(huán)周期在1~6ms范圍都不會影響數(shù)碼管動態(tài)顯示。
無標(biāo)題.jpg



  1. #include <STC15F2K60S2.H>
  2. /***********四位共陰數(shù)碼管驅(qū)動程序************/
  3. //stc15w單片機(jī)
  4. //1在主程序前加上初始化init();程序
  5. //2硬件連接變動時需修改下面的參數(shù)
  6. sbit H1        = P1^0;//設(shè)置第1位數(shù)碼管陰極連接的I/O口
  7. sbit H2        = P1^1;//設(shè)置第2位數(shù)碼管陰極連接的I/O口
  8. sbit H3        = P1^2;//設(shè)置第3位數(shù)碼管陰極連接的I/O口
  9. //sbit H4        = P1^5;//設(shè)置第4位數(shù)碼管陰極連接的I/O口
  10. sbit a        = P3^5;//11111100
  11. sbit b        = P3^4;
  12. sbit c        = P3^3;
  13. sbit d        = P3^2;
  14. sbit e        = P2^1;//00000011
  15. sbit f        = P2^0;
  16. sbit g        = P3^7;
  17. sbit p        = P3^6;
  18. sbit DQ       = P2^4;
  19. unsigned char code disdata[]={
  20. 0x3F,0x06,0x5B,0x4F,0x66,
  21. 0x6D,0x7D,0x07,0x7F,0x6F,
  22. 0x77,0x7C,0x39,0x5E,0x79,
  23. 0x71,0x40};//0-9,A-F,-
  24. unsigned char data dis_buf[3];//緩存
  25. unsigned char num=123;//模擬欲顯示數(shù)12.3

  26. /****1ms延時子程序(12MHz 1T)****/
  27. void Delay_ms(unsigned int t)//1T@12MHz
  28. {
  29.         unsigned int i,j;
  30.         for(i=t;i>0;i--)
  31.                 for(j=1200;j>0;j--);//j=1100 1T@11.0592MHz
  32. }
  33. void dula(unsigned char i)        //寫入8位段碼
  34. {   
  35.         a=i&0x01;i>>=1;
  36.         b=i&0x01;i>>=1;
  37.         c=i&0x01;i>>=1;
  38.         d=i&0x01;i>>=1;
  39.         e=i&0x01;i>>=1;
  40.         f=i&0x01;i>>=1;
  41.         g=i&0x01;i>>=1;
  42.         p=i&0x01;
  43. }
  44. void wela(unsigned char i)        //寫入3位位碼
  45. {
  46.         H1=i&0x01;i>>=1;
  47.         H2=i&0x01;i>>=1;
  48.         H3=i&0x01;
  49. }
  50. void display()//數(shù)碼管動態(tài)顯示函數(shù)
  51. {
  52.         static unsigned char i=0;
  53.         switch(i)//分解數(shù)據(jù)
  54.         {
  55.                 case 0: dis_buf[0] = disdata[num/100%10];    break;
  56.                 case 1: dis_buf[1] = disdata[num/10%10]|0x80;break;//加小數(shù)點
  57.                 case 2: dis_buf[2] = disdata[num%10];        break;
  58.         }       
  59.         wela(0xff);//位碼消隱
  60.         dula(dis_buf[i]);//送段碼
  61.         wela(~(0x01<<i));//送位碼
  62.         i=++i%3;    //循環(huán)計數(shù)
  63. }
  64. /*******************************************/
  65. void init(void)
  66. {
  67.         P1M0 = 0x00;
  68.         P1M1 = 0x00;
  69.         P2M0 = 0x03;//0000 0011推挽
  70.         P2M1 = 0x00;
  71.         P3M0 = 0xfe;//1111 1100推挽
  72.         P3M1 = 0x00;
  73.         P5M0 = 0x00;
  74.         P5M1 = 0x00;
  75. }
  76. void main()//主函數(shù)
  77. {
  78.         init();
  79.         while(1)
  80.         {
  81.                 display();        //數(shù)碼管顯示
  82.                 Delay_ms(5);                //延時控制主循環(huán)時間
  83.         }
  84. }
復(fù)制代碼



回復(fù)

使用道具 舉報

ID:1001745 發(fā)表于 2023-2-10 19:44 | 顯示全部樓層
wulin 發(fā)表于 2023-2-8 10:44
你這個數(shù)碼管動態(tài)顯示函數(shù)太奇葩了,不可能正常顯示。按你的硬件圖,給你寫個示例。適用于STC15系列MCU, ...

感謝大神的不吝賜教,我按照你的這個代碼添加到程序中去,總算編譯過了,但只顯示12.3,其中12。很淡,3很亮。不知道什么原因。我把整個程序上傳上來,希望大師幫忙看看怎么修改。謝謝啦
回復(fù)

使用道具 舉報

ID:1001745 發(fā)表于 2023-2-10 19:46 | 顯示全部樓層
temp_detection.rar (39.78 KB, 下載次數(shù): 10) 整個代碼。
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2023-2-10 20:56 | 顯示全部樓層
mcuhui 發(fā)表于 2023-2-10 19:44
感謝大神的不吝賜教,我按照你的這個代碼添加到程序中去,總算編譯過了,但只顯示12.3,其中12。很淡,3 ...

數(shù)碼管各位亮度不均勻是各位顯示時間不相同。你沒有真正看懂給你的示例,為什么給你寫5ms的主循環(huán)周期,就是給你留有充足時間來調(diào)用讀取溫度值、按鍵掃描、報警等程序?墒悄惆汛罅康臅r間消耗在阻滯型延時上了,這是編程的大忌。由于ds18b20對時序要求很高,完整讀一次ds18b20溫度值遠(yuǎn)遠(yuǎn)超過5ms。這就要把讀ds18b20溫度拆分成5部分,主循環(huán)1次只完成1部分。這就完美解決了在時間上與數(shù)碼管、蜂鳴器的沖突。再給你一個示例參考,重點要理解這部分:
  1. void ReadTemperature()//讀取溫度的函數(shù)
  2. {
  3.         static uchar i=0;
  4.         uchar a=0,b=0;
  5.         uint t=0;
  6.         switch(i)
  7.         {
  8.                 case 0: int_DS18b20();
  9.                                 write_byte(0xcc);//跳過讀寫序列號
  10.                                 write_byte(0x44);//啟動溫度轉(zhuǎn)換
  11.                                 break;
  12.                 case 1: break;//利用定時循環(huán)周期替代5ms延時
  13.                 case 2: int_DS18b20();
  14.                                 write_byte(0xCC);//跳過讀寫序列號
  15.                                 write_byte(0xBE);//讀溫度寄存器
  16.                                 break;
  17.                 case 3: break;//利用定時循環(huán)周期替代5ms延時

  18.                 case 4: a=read_byte();//讀取溫度低8位
  19.                                 b=read_byte();  //讀取溫度高8位
  20.                                 t=b<<8|a;
  21.                                 sh=t>>4;//取整數(shù)
  22.                                 ge=(a&0x0f)*0.625;//取1位小數(shù)
  23.                                 break;
  24.         }
  25.         i++;i%=5;
  26. }
復(fù)制代碼
4位數(shù)碼管時鐘溫度表仿真.rar (332.03 KB, 下載次數(shù): 6)




回復(fù)

使用道具 舉報

ID:1060328 發(fā)表于 2023-2-10 21:15 | 顯示全部樓層
  Delay_ms(5);      

把5改小試試,用2或者3
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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