找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2738|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1001745 發(fā)表于 2023-2-7 14:40 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
各位大神:新年好!    最近做了一個(gè)溫度報(bào)警器,數(shù)碼管為3位的共陰數(shù)碼管。在全顯時(shí)顯示正常的,在動(dòng)態(tài)顯示時(shí)就會(huì)出現(xiàn)筆畫(huà)暗淡不清楚的現(xiàn)象?戳艘幌抡搲,感覺(jué)應(yīng)該是程序中的消隱沒(méi)有處理好,因個(gè)人能力有限,程序基本上都是摘錄論壇各路大神的現(xiàn)有程序修改的。希望各位大神能幫忙看一下程序看看是否程序有問(wèn)題,謝謝!
  1. /***********四位共陰數(shù)碼管驅(qū)動(dòng)程序************/
  2. //stc15w單片機(jī)
  3. //1在主程序前加上初始化init();程序
  4. //2硬件連接變動(dòng)時(shí)需修改下面的參數(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ù)實(shí)際硬件情況更改******/
  24. data unsigned char PWM;//顯示亮度
  25. #define light                        9         //設(shè)置LED顯示的亮度(值域:1~9)
  26. #define DELAY_L                12         //設(shè)置每一個(gè)點(diǎn)顯示的時(shí)間長(zhǎng)度(1~20)
  27. /********* 延時(shí)函數(shù)    ***************/
  28. void delay (unsigned int a){ // 用于點(diǎn)掃描的延時(shí)
  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ù)制代碼


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



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

使用道具 舉報(bào)

沙發(fā)
ID:1001745 發(fā)表于 2023-2-7 18:03 | 只看該作者
測(cè)試圖片 顯示部分原理圖
回復(fù)

使用道具 舉報(bào)

板凳
ID:824490 發(fā)表于 2023-2-7 22:11 | 只看該作者
你這個(gè)是MCU直驅(qū)數(shù)碼管,要想提高亮度只能是亮?xí)r延時(shí)加長(zhǎng),但是加太長(zhǎng)會(huì)閃。。
小于20mS內(nèi)要掃一次,3個(gè)數(shù)碼管,每個(gè)點(diǎn)亮約6ms..這是沒(méi)有其它任務(wù)時(shí)的時(shí)間分配,若有其它任務(wù),則適當(dāng)調(diào)整。或是用定時(shí)器中斷方式把時(shí)間分片,每6mS點(diǎn)亮一個(gè)數(shù)碼管。
回復(fù)

使用道具 舉報(bào)

地板
ID:1001745 發(fā)表于 2023-2-8 08:36 | 只看該作者
名字不是重點(diǎn) 發(fā)表于 2023-2-7 22:11
你這個(gè)是MCU直驅(qū)數(shù)碼管,要想提高亮度荒蓯橇潦毖郵奔映,但是吉qせ嶸痢!�
小于20mS內(nèi)要掃一次,3個(gè)數(shù) ...

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

使用道具 舉報(bào)

5#
ID:213173 發(fā)表于 2023-2-8 10:44 | 只看該作者
mcuhui 發(fā)表于 2023-2-7 18:03
測(cè)試圖片顯示部分原理圖

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




  1. #include <STC15F2K60S2.H>
  2. /***********四位共陰數(shù)碼管驅(qū)動(dòng)程序************/
  3. //stc15w單片機(jī)
  4. //1在主程序前加上初始化init();程序
  5. //2硬件連接變動(dòng)時(shí)需修改下面的參數(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延時(shí)子程序(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)        //寫(xiě)入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)        //寫(xiě)入3位位碼
  45. {
  46.         H1=i&0x01;i>>=1;
  47.         H2=i&0x01;i>>=1;
  48.         H3=i&0x01;
  49. }
  50. void display()//數(shù)碼管動(dòng)態(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ù)點(diǎn)
  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)計(jì)數(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);                //延時(shí)控制主循環(huán)時(shí)間
  83.         }
  84. }
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

6#
ID:1001745 發(fā)表于 2023-2-10 19:44 | 只看該作者
wulin 發(fā)表于 2023-2-8 10:44
你這個(gè)數(shù)碼管動(dòng)態(tài)顯示函數(shù)太奇葩了,不可能正常顯示。按你的硬件圖,給你寫(xiě)個(gè)示例。適用于STC15系列MCU, ...

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

使用道具 舉報(bào)

7#
ID:1001745 發(fā)表于 2023-2-10 19:46 | 只看該作者
temp_detection.rar (39.78 KB, 下載次數(shù): 10) 整個(gè)代碼。
回復(fù)

使用道具 舉報(bào)

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

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

  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ù)碼管時(shí)鐘溫度表仿真.rar (332.03 KB, 下載次數(shù): 6)




回復(fù)

使用道具 舉報(bào)

9#
ID:1060328 發(fā)表于 2023-2-10 21:15 | 只看該作者
  Delay_ms(5);      

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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