久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2703|回復: 8
打印 上一主題 下一主題
收起左側

單片機數碼管顯示程序問題求助

[復制鏈接]
跳轉到指定樓層
樓主
ID:1001745 發表于 2023-2-7 14:40 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各位大神:新年好!    最近做了一個溫度報警器,數碼管為3位的共陰數碼管。在全顯時顯示正常的,在動態顯示時就會出現筆畫暗淡不清楚的現象。看了一下論壇,感覺應該是程序中的消隱沒有處理好,因個人能力有限,程序基本上都是摘錄論壇各路大神的現有程序修改的。希望各位大神能幫忙看一下程序看看是否程序有問題,謝謝!
  1. /***********四位共陰數碼管驅動程序************/
  2. //stc15w單片機
  3. //1在主程序前加上初始化init();程序
  4. //2硬件連接變動時需修改下面的參數
  5. sbit H1        = P1^0;//設置第1位數碼管陰極連接的I/O口
  6. sbit H2        = P1^1;//設置第2位數碼管陰極連接的I/O口
  7. sbit H3        = P1^2;//設置第3位數碼管陰極連接的I/O口
  8. //sbit H4        = P1^5;//設置第4位數碼管陰極連接的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 //設置I/O口工作方式//00000000(左到右,高到低位)
  18. #define P1M1SET                0x00 //設置I/O口工作方式//00000000
  19. #define P3M0SET                0xff //設置I/O口工作方式//11111111
  20. #define P3M1SET                0x00 //設置I/O口工作方式//00000000
  21. #define P2M0SET     0xff //設置IO口工作方式11111111
  22. #define P2M1SET     0x00 //設置IO口工作方式00000000
  23. /*****以上定義需要根據實際硬件情況更改******/
  24. data unsigned char PWM;//顯示亮度
  25. #define light                        9         //設置LED顯示的亮度(值域:1~9)
  26. #define DELAY_L                12         //設置每一個點顯示的時間長度(1~20)
  27. /********* 延時函數    ***************/
  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. //數碼管:正向位置;共YIN極;正向連接

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


  47. }
  48. /*********************************************************************************************/
  49. void displayHH1 (unsigned char q){ //第1位數碼管顯示程序
  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位數碼管顯示程序
  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位數碼管顯示程序
  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){//顯示的數碼管位置               
  134.                                 case 1://                        
  135.                                         displayHH1(q); //將顯示數據送入               
  136.                                         break;//               
  137.                                 case 2://                        
  138.                                         displayHH2(q); //將顯示數據送入               
  139.                                         break;//               
  140.                                 case 3://                        
  141.                                         displayHH3(q); //將顯示數據送入               
  142.                                         break;//
  143. //                                case 4://                        
  144. //                                        displayHH4(q); //將顯示數據送入               
  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]); */
復制代碼


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



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

使用道具 舉報

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

使用道具 舉報

板凳
ID:824490 發表于 2023-2-7 22:11 | 只看該作者
你這個是MCU直驅數碼管,要想提高亮度只能是亮時延時加長,但是加太長會閃。。
小于20mS內要掃一次,3個數碼管,每個點亮約6ms..這是沒有其它任務時的時間分配,若有其它任務,則適當調整。或是用定時器中斷方式把時間分片,每6mS點亮一個數碼管。
回復

使用道具 舉報

地板
ID:1001745 發表于 2023-2-8 08:36 | 只看該作者
名字不是重點 發表于 2023-2-7 22:11
你這個是MCU直驅數碼管,要想提高亮度荒蓯橇潦毖郵奔映ぃ羌猶せ嶸痢!�
小于20mS內要掃一次,3個數 ...

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

使用道具 舉報

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

你這個數碼管動態顯示函數太奇葩了,不可能正常顯示。按你的硬件圖,給你寫個示例。適用于STC15系列MCU,主函數中5ms延時不是必須的,是留有足夠的時間用于添加其它應用程序。主函數循環周期在1~6ms范圍都不會影響數碼管動態顯示。




  1. #include <STC15F2K60S2.H>
  2. /***********四位共陰數碼管驅動程序************/
  3. //stc15w單片機
  4. //1在主程序前加上初始化init();程序
  5. //2硬件連接變動時需修改下面的參數
  6. sbit H1        = P1^0;//設置第1位數碼管陰極連接的I/O口
  7. sbit H2        = P1^1;//設置第2位數碼管陰極連接的I/O口
  8. sbit H3        = P1^2;//設置第3位數碼管陰極連接的I/O口
  9. //sbit H4        = P1^5;//設置第4位數碼管陰極連接的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;//模擬欲顯示數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()//數碼管動態顯示函數
  51. {
  52.         static unsigned char i=0;
  53.         switch(i)//分解數據
  54.         {
  55.                 case 0: dis_buf[0] = disdata[num/100%10];    break;
  56.                 case 1: dis_buf[1] = disdata[num/10%10]|0x80;break;//加小數點
  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;    //循環計數
  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()//主函數
  77. {
  78.         init();
  79.         while(1)
  80.         {
  81.                 display();        //數碼管顯示
  82.                 Delay_ms(5);                //延時控制主循環時間
  83.         }
  84. }
復制代碼



回復

使用道具 舉報

6#
ID:1001745 發表于 2023-2-10 19:44 | 只看該作者
wulin 發表于 2023-2-8 10:44
你這個數碼管動態顯示函數太奇葩了,不可能正常顯示。按你的硬件圖,給你寫個示例。適用于STC15系列MCU, ...

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

使用道具 舉報

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

使用道具 舉報

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

數碼管各位亮度不均勻是各位顯示時間不相同。你沒有真正看懂給你的示例,為什么給你寫5ms的主循環周期,就是給你留有充足時間來調用讀取溫度值、按鍵掃描、報警等程序。可是你把大量的時間消耗在阻滯型延時上了,這是編程的大忌。由于ds18b20對時序要求很高,完整讀一次ds18b20溫度值遠遠超過5ms。這就要把讀ds18b20溫度拆分成5部分,主循環1次只完成1部分。這就完美解決了在時間上與數碼管、蜂鳴器的沖突。再給你一個示例參考,重點要理解這部分:
  1. void ReadTemperature()//讀取溫度的函數
  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);//啟動溫度轉換
  11.                                 break;
  12.                 case 1: break;//利用定時循環周期替代5ms延時
  13.                 case 2: int_DS18b20();
  14.                                 write_byte(0xCC);//跳過讀寫序列號
  15.                                 write_byte(0xBE);//讀溫度寄存器
  16.                                 break;
  17.                 case 3: break;//利用定時循環周期替代5ms延時

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




回復

使用道具 舉報

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

把5改小試試,用2或者3
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品自产拍 | 亚洲va在线va天堂va狼色在线 | 亚洲免费网站 | 欧美xxxⅹ性欧美大片 | 波多野结衣在线观看一区二区三区 | 一区二区伦理电影 | 日韩欧美专区 | 日本网站免费在线观看 | 中文字幕一区二区三区四区五区 | 欧美日韩一区二区视频在线观看 | 精品欧美一区二区三区久久久 | 综合国产 | 狠狠色香婷婷久久亚洲精品 | 精品国产青草久久久久96 | 黄色av网站免费看 | 国产在线观看一区 | 中文字幕亚洲视频 | 国产高清免费视频 | 黄色小视频大全 | 久久久不卡网国产精品一区 | 欧美日韩三级 | 中文字幕精品视频在线观看 | 午夜精品一区二区三区在线播放 | 久久里面有精品 | 特黄一级 | 一级a性色生活片久久毛片 一级特黄a大片 | 一区二区免费在线视频 | 伊人伊人| 99精品国产一区二区三区 | 国产精品久久久久久久一区探花 | 久久久久久亚洲精品 | 国产一区二区黑人欧美xxxx | 久久av一区二区三区 | 欧美一级片黄色 | 欧美三级视频 | 中文字幕91 | 国产激情一区二区三区 | 久久精品久久久久久 | 亚洲一区二区免费电影 | 久久久久免费精品国产小说色大师 | 亚洲精品一区在线观看 |