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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2473|回復: 3
收起左側

51單片機數字電壓表程序 新手遇問題求大佬指點

[復制鏈接]
ID:1006510 發表于 2022-2-26 20:45 | 顯示全部樓層 |閱讀模式
整個程序是,使用ADDC0808、LCD1602實現電壓的測量和顯示,串口是后期加的功能,按下K3向PC機發送電壓值。K1,K2開關控制電壓表量程。
現在問題是當一個開關放下,LCD的D0到D7會出現間斷黃信號,并且LCD1602無法正常顯示。我自己找不出程序里哪里錯了。希望有大佬能耐心幫忙找出問題。
P}70SMTFL0$`GX$@[Z7ICIT.png
LCD出現問題,信號口黃色


4(J_JMO@%T@B)WKAIKJK{{X.png
整體仿真圖

下面是單片機程序:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <stdio.h>
  4. #define uchar unsigned char
  5. #define  uint unsigned int
  6. #define  FREQ 11059200

  7. sbit OE=P1^4;                                                //AD數據輸出控制端口
  8. sbit EOC=P3^3;                                        //數據轉換結束由0變1
  9. sbit START=P3^4;                          //AD轉換啟動  ALE接口
  10. sbit CLK=P1^3;
  11. sbit  rw=P3^6;                                        //1602讀寫選擇
  12. sbit  rs=P3^5;                                        //1602寄存器選擇端
  13. sbit  en=P3^7;                                        //1602讀寫使能端
  14. sbit a=P1^0;                                                //a,b,c為轉換器通道選擇地址
  15. sbit b=P1^1;
  16. sbit c=P1^2;
  17. sbit d=P1^5;                                                //報警信號端
  18. sbit K1=P1^6;                                                //量程選擇開關
  19. sbit K2=P1^7;                                                
  20. uchar dis[4]={0,0,0,0};        //緩存數據處理結果



  21. /****************************************************
  22. 延時程序
  23. *****************************************************/
  24. void delay(uchar i)                        
  25. {
  26.         uchar n;
  27.         while(i--)
  28.         {
  29.                 for(n=0;n<250;n++);
  30.         }
  31. }
  32. /****************************************************
  33. //串口初始化(Timer1定時器)
  34. *****************************************************/
  35. void Init_USART_uT1()
  36. {
  37.         SCON = 0x50;    //串口方式1
  38.         TMOD = 0x20;    //T1工作方式2(8位自動重裝)
  39.         PCON = 0x80;    //波特率不倍增
  40.         TH1 = TL1 = - FREQ/384/9600;//波特率配置(TH1 = TL1 = 0xFD)
  41.         TR1 = 1;        //啟動定時器T1
  42. }
  43. /****************************************************
  44. //1602狀態檢測是否忙碌
  45. *****************************************************/
  46. bit lcd_busy_check()                                 
  47. {
  48.         bit  result;
  49.         rs=0;
  50.         rw=1;
  51.         en=1;
  52.         delay(10);

  53.         result=(bit)(P0&0x80);
  54.         en=0;
  55.         return  result;
  56. }
  57. /****************************************************
  58. //寫LCD命令
  59. *****************************************************/
  60. void w_comd(uchar command)                          
  61. {
  62.         while(lcd_busy_check());
  63.         rw=0;
  64.         rs=0;
  65.         en=0;
  66.         P0=command;
  67.         delay(10);
  68.         en=1;
  69.         delay(10);
  70.         en=0;
  71. }
  72. /****************************************************
  73. //向1602發送數據
  74. *****************************************************/
  75. void  vWriteData(uchar dat)                          
  76. {
  77.         while(lcd_busy_check());
  78.         rs=1;
  79.         rw=0;
  80.         en=0;
  81.         P0=dat;
  82.         delay(1);
  83.         en=1;
  84.         delay(1);
  85.         en=0;
  86. }
  87. /****************************************************
  88. //LCD1602初始化
  89. *****************************************************/
  90. void lcd_init()                                                         
  91. {
  92.         w_comd(0x38);
  93.         delay(5);
  94.         w_comd(0x0c);          //開顯示屏,關光標
  95.         delay(5);
  96.         w_comd(0x06);   //字符進入模式:屏幕不動,字符后移
  97.         delay(5);
  98.         w_comd(0x01);   //清屏
  99. }
  100. /****************************************************
  101. //LCD1602字庫表
  102. *****************************************************/
  103. void show_lcd_char(uchar ucChar)                                
  104. {
  105.         switch(ucChar)
  106.         {
  107.         case ' ': vWriteData(0x20);break;
  108.         case '!': vWriteData(0x21);break;
  109.         case '"': vWriteData(0x22);break;
  110.         case '#': vWriteData(0x23);break;
  111.         case '


  112. : vWriteData(0x24);break;
  113.         case '%': vWriteData(0x25);break;
  114.         case '&': vWriteData(0x26);break;
  115.         case '>': vWriteData(0x27);break;
  116.         case '(': vWriteData(0x28);break;
  117.         case ')': vWriteData(0x29);break;
  118.         case '.': vWriteData(0x2E);break;
  119.                
  120.         case '0': vWriteData(0x30);break;
  121.         case '1': vWriteData(0x31);break;
  122.         case '2': vWriteData(0x32);break;
  123.         case '3': vWriteData(0x33);break;
  124.         case '4': vWriteData(0x34);break;
  125.         case '5': vWriteData(0x35);break;
  126.         case '6': vWriteData(0x36);break;
  127.         case '7': vWriteData(0x37);break;
  128.         case '8': vWriteData(0x38);break;
  129.         case '9': vWriteData(0x39);break;
  130.                
  131.                
  132.         case 'V': vWriteData(0x56);break;
  133.                
  134.         case 'a': vWriteData(0x61);break;
  135.         case 'd': vWriteData(0x64);break;
  136.         case 'e': vWriteData(0x65);break;
  137.         case 'f': vWriteData(0x66);break;
  138.         case 'g': vWriteData(0x67);break;
  139.         case 'h': vWriteData(0x68);break;
  140.         case 'i': vWriteData(0x69);break;
  141.         case 'j': vWriteData(0x6A);break;
  142.         case 'k': vWriteData(0x6B);break;
  143.         case 'l': vWriteData(0x6C);break;
  144.         case 'm': vWriteData(0x6D);break;
  145.         case 'n': vWriteData(0x6E);break;
  146.         case 'o': vWriteData(0x6F);break;
  147.         case 'p': vWriteData(0x70);break;
  148.         case 'q': vWriteData(0x71);break;
  149.         case 'r': vWriteData(0x72);break;
  150.         case 's': vWriteData(0x73);break;
  151.         case 't': vWriteData(0x74);break;
  152.         case 'u': vWriteData(0x75);break;
  153.         case 'v': vWriteData(0x76);break;
  154.                
  155.                
  156.         default: break;
  157.         }
  158. }
  159. /****************************************************
  160. //顯示字符
  161. *****************************************************/
  162. void show_lcd(uchar xschar[])                        
  163. {
  164.         uchar i;
  165.         for(i=0;;i++)
  166.         {
  167.                 show_lcd_char(xschar[i]);
  168.                 if(xschar[i+1]=='\0')
  169.                         break;        
  170.     }               
  171. }
  172. /****************************************************
  173. //顯示數據
  174. *****************************************************/
  175. void v_display0(uint getdata)                          
  176. {
  177.         uint m,i;
  178.         m=getdata*1.0/255*500;
  179.         dis[0]=m/100;                                //把計算的數據每個位存入數組
  180.         dis[1]=m/10%10;
  181.         dis[2]=m%10;
  182.         for(i=0;i<3;i++)                //數據逐一輸出
  183.         {
  184.                 show_lcd_char(dis[i]+48);
  185.                 if(i==0)
  186.                 {
  187.                         show_lcd_char('.');
  188.                 }
  189.         }
  190. }
  191. /****************************************************
  192. //顯示數據
  193. *****************************************************/
  194. void v_display1(uint getdata)                          
  195. {
  196.         uint m,i;
  197.         m=getdata*1.0/255*500*3;
  198.         if(m>=1000)
  199.         {
  200.                 dis[0]=m/1000;                        //把計算的數據每個位存入數組
  201.                 dis[1]=m/100%10;
  202.                 dis[2]=m/10%10;
  203.                 dis[3]=m%10;
  204.                 for(i=0;i<4;i++)                //數據逐一輸出
  205.                 {
  206.                         show_lcd_char(dis[i]+48);
  207.                         if(i==1)
  208.                                 show_lcd_char('.');
  209.                 }
  210.         }
  211.         else
  212.         {
  213.                 dis[0]=m/100;                                //把計算的數據每個位存入數組
  214.                 dis[1]=m/10%10;
  215.                 dis[2]=m%10;
  216.                 for(i=0;i<3;i++)                //數據逐一輸出
  217.                 {
  218.                         show_lcd_char(dis[i]+48);
  219.                         
  220.                         if(i==0)
  221.                         {
  222.                                 show_lcd_char('.');
  223.                         }
  224.                 }
  225.         }
  226. }
  227. void main()
  228. {
  229.   Init_USART_uT1();  //串口初始化 
  230.         EX0 = 1; IT0 = 1;  //允許外部中斷,下降沿觸發
  231.         
  232.         TMOD=0x01;               //定時器0,模式1
  233.         TH0=0xfa;
  234.         TL0=0x00;
  235.         ES = 1;           //開串口中斷
  236.         EA=1;                                            //開總中斷
  237.         ET0=1;                                    //開定時中斷         
  238.         ET1=1;
  239.         TR0=1;                                    //啟動定時中斷
  240.         d=0;
  241.         
  242.         lcd_init();       //初始化
  243.         
  244.         w_comd(0x84);     //顯示起始地址
  245.         delay(10);
  246.         show_lcd("Voltage:");
  247.         
  248.         w_comd(0xc9);
  249.         delay(10);
  250.         show_lcd("(V)");
  251.         
  252.         
  253.         
  254.         while(1)
  255.         {
  256.                 w_comd(0xc4);
  257.                 d=0;
  258.                 if((K1==0)&&(K2!=0))  //測量0~5V電壓
  259.                 {a=0;
  260.                 b=0;
  261.                 c=0;
  262.                 START=0;
  263.                 OE=0;         
  264.                 START=1;                                      //啟動AD轉換
  265.                
  266.                 START=0;
  267.                 while(EOC==0);                    //等待轉換結束
  268.                 OE=1;
  269.                 v_display0(P2);
  270.                 OE=0;
  271.                 }
  272.                 if((K2==0)&&(K1!=0))  //測量5~10V電壓
  273.                 {a=1;
  274.                 b=0;
  275.                 c=0;
  276.                 START=0;
  277.                 OE=0;         
  278.                 START=1;                                      //啟動AD轉換
  279.                
  280.                 START=0;
  281.                 while(EOC==0);                    //等待轉換結束
  282.                 OE=1;
  283.                 v_display1(P2);
  284.                 OE=0;
  285.                
  286.                 }
  287.                 if((K1==0)&&(K2==0))        //若K1、K2同時摁下,LED點亮報警
  288.                         d=1;
  289.         }         
  290.         
  291. }
  292. /****************************************************
  293. //定時器0中斷函數
  294. *****************************************************/
  295. void time0() interrupt 1                 
  296. {
  297.         CLK=~CLK;
  298.         TH0=0xfa;
  299.         TL0=0x00;
  300. }
  301. /****************************************************
  302. //外部中斷0
  303. *****************************************************/
  304. void EX_INT0() interrupt 0
  305. {
  306.         uchar i = 0;
  307.         while(dis[i]!='\0')
  308.         {
  309.                 SBUF = dis[i++];  //發送1字節,索引遞增
  310.                 while(TI == 0); //等待發送完成
  311.                 TI = 0;         //軟件清零中斷標志位TI
  312.         }
  313. }
復制代碼
回復

使用道具 舉報

ID:123289 發表于 2022-2-28 15:33 | 顯示全部樓層
如果你的程序中,不用DELAY()來延時,估計就可以了。
回復

使用道具 舉報

ID:1006510 發表于 2022-3-25 17:39 | 顯示全部樓層
yzwzfyz 發表于 2022-2-28 15:33
如果你的程序中,不用DELAY()來延時,估計就可以了。

謝謝回復。實物我自己搞好了,由于是小白所以制作過程有很多新手問題。
回復

使用道具 舉報

ID:1011897 發表于 2022-4-14 15:40 | 顯示全部樓層
你好 我也是 這個 量程是0-200 我現在搞不明白了 看評論區 你好像明白的 可以教我一下嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 波多野结衣av中文字幕 | 成人毛片网站 | 久久高清免费视频 | 亚洲va欧美va天堂v国产综合 | 狠狠综合久久av一区二区老牛 | 久久逼逼 | 欧洲精品视频一区 | 国产乱码精品一区二区三区五月婷 | 亚洲精品免费在线观看 | 久久视频精品 | 亚洲97 | 欧美极品在线 | 久久国产精品免费一区二区三区 | 黄网站在线观看 | 蜜桃毛片 | 精品视频在线观看 | 国产a区 | 日韩成人在线观看 | 成人在线视频网址 | 精品亚洲一区二区三区 | 日韩黄色小视频 | 国产欧美一区二区三区在线看蜜臀 | 国产一区| 国产999精品久久久影片官网 | cao在线| 91在线网 | 91豆花视频| 毛片在线看片 | 日韩美香港a一级毛片免费 国产综合av | 三级在线观看 | 精品一区二区三区在线观看 | 亚洲精品久久久蜜桃 | 日本久草视频 | 久久狠狠| 中文字幕11页 | 成人免费看黄 | 国产在线观看网站 | 依人成人 | 久久免费国产 | 国产欧美日韩 | 亚洲精品久久久一区二区三区 |