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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機(jī)數(shù)字電壓表程序 新手遇問題求大佬指點(diǎn)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
整個(gè)程序是,使用ADDC0808、LCD1602實(shí)現(xiàn)電壓的測量和顯示,串口是后期加的功能,按下K3向PC機(jī)發(fā)送電壓值。K1,K2開關(guān)控制電壓表量程。
現(xiàn)在問題是當(dāng)一個(gè)開關(guān)放下,LCD的D0到D7會(huì)出現(xiàn)間斷黃信號,并且LCD1602無法正常顯示。我自己找不出程序里哪里錯(cuò)了。希望有大佬能耐心幫忙找出問題。

LCD出現(xiàn)問題,信號口黃色



整體仿真圖

下面是單片機(jī)程序:
  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數(shù)據(jù)輸出控制端口
  8. sbit EOC=P3^3;                                        //數(shù)據(jù)轉(zhuǎn)換結(jié)束由0變1
  9. sbit START=P3^4;                          //AD轉(zhuǎn)換啟動(dòng)  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為轉(zhuǎn)換器通道選擇地址
  15. sbit b=P1^1;
  16. sbit c=P1^2;
  17. sbit d=P1^5;                                                //報(bào)警信號端
  18. sbit K1=P1^6;                                                //量程選擇開關(guān)
  19. sbit K2=P1^7;                                                
  20. uchar dis[4]={0,0,0,0};        //緩存數(shù)據(jù)處理結(jié)果



  21. /****************************************************
  22. 延時(shí)程序
  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定時(shí)器)
  34. *****************************************************/
  35. void Init_USART_uT1()
  36. {
  37.         SCON = 0x50;    //串口方式1
  38.         TMOD = 0x20;    //T1工作方式2(8位自動(dòng)重裝)
  39.         PCON = 0x80;    //波特率不倍增
  40.         TH1 = TL1 = - FREQ/384/9600;//波特率配置(TH1 = TL1 = 0xFD)
  41.         TR1 = 1;        //啟動(dòng)定時(shí)器T1
  42. }
  43. /****************************************************
  44. //1602狀態(tài)檢測是否忙碌
  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發(fā)送數(shù)據(jù)
  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);          //開顯示屏,關(guān)光標(biāo)
  95.         delay(5);
  96.         w_comd(0x06);   //字符進(jìn)入模式:屏幕不動(dòng),字符后移
  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. //顯示數(shù)據(jù)
  174. *****************************************************/
  175. void v_display0(uint getdata)                          
  176. {
  177.         uint m,i;
  178.         m=getdata*1.0/255*500;
  179.         dis[0]=m/100;                                //把計(jì)算的數(shù)據(jù)每個(gè)位存入數(shù)組
  180.         dis[1]=m/10%10;
  181.         dis[2]=m%10;
  182.         for(i=0;i<3;i++)                //數(shù)據(jù)逐一輸出
  183.         {
  184.                 show_lcd_char(dis[i]+48);
  185.                 if(i==0)
  186.                 {
  187.                         show_lcd_char('.');
  188.                 }
  189.         }
  190. }
  191. /****************************************************
  192. //顯示數(shù)據(jù)
  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;                        //把計(jì)算的數(shù)據(jù)每個(gè)位存入數(shù)組
  201.                 dis[1]=m/100%10;
  202.                 dis[2]=m/10%10;
  203.                 dis[3]=m%10;
  204.                 for(i=0;i<4;i++)                //數(shù)據(jù)逐一輸出
  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;                                //把計(jì)算的數(shù)據(jù)每個(gè)位存入數(shù)組
  214.                 dis[1]=m/10%10;
  215.                 dis[2]=m%10;
  216.                 for(i=0;i<3;i++)                //數(shù)據(jù)逐一輸出
  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;  //允許外部中斷,下降沿觸發(fā)
  231.         
  232.         TMOD=0x01;               //定時(shí)器0,模式1
  233.         TH0=0xfa;
  234.         TL0=0x00;
  235.         ES = 1;           //開串口中斷
  236.         EA=1;                                            //開總中斷
  237.         ET0=1;                                    //開定時(shí)中斷         
  238.         ET1=1;
  239.         TR0=1;                                    //啟動(dòng)定時(shí)中斷
  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;                                      //啟動(dòng)AD轉(zhuǎn)換
  265.                
  266.                 START=0;
  267.                 while(EOC==0);                    //等待轉(zhuǎn)換結(jié)束
  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;                                      //啟動(dòng)AD轉(zhuǎn)換
  279.                
  280.                 START=0;
  281.                 while(EOC==0);                    //等待轉(zhuǎn)換結(jié)束
  282.                 OE=1;
  283.                 v_display1(P2);
  284.                 OE=0;
  285.                
  286.                 }
  287.                 if((K1==0)&&(K2==0))        //若K1、K2同時(shí)摁下,LED點(diǎn)亮報(bào)警
  288.                         d=1;
  289.         }         
  290.         
  291. }
  292. /****************************************************
  293. //定時(shí)器0中斷函數(shù)
  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++];  //發(fā)送1字節(jié),索引遞增
  310.                 while(TI == 0); //等待發(fā)送完成
  311.                 TI = 0;         //軟件清零中斷標(biāo)志位TI
  312.         }
  313. }
復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:123289 發(fā)表于 2022-2-28 15:33 | 只看該作者
如果你的程序中,不用DELAY()來延時(shí),估計(jì)就可以了。
回復(fù)

使用道具 舉報(bào)

板凳
ID:1006510 發(fā)表于 2022-3-25 17:39 | 只看該作者
yzwzfyz 發(fā)表于 2022-2-28 15:33
如果你的程序中,不用DELAY()來延時(shí),估計(jì)就可以了。

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

使用道具 舉報(bào)

地板
ID:1011897 發(fā)表于 2022-4-14 15:40 | 只看該作者
你好 我也是 這個(gè) 量程是0-200 我現(xiàn)在搞不明白了 看評論區(qū) 你好像明白的 可以教我一下嗎
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲永久在线 | 黄色片网站国产 | 国产在线精品区 | 日韩电影一区二区三区 | 人人做人人澡人人爽欧美 | 好好的日在线视频 | 日韩在线免费观看视频 | 精品国产91亚洲一区二区三区www | 久久无毛| 亚洲一二三区精品 | 日韩1区 | 国产婷婷在线视频 | 黄色网址免费在线观看 | 欧美国产一区二区 | 高清久久| 亚洲精品免费视频 | 一区二区三区中文字幕 | 黄色免费网址大全 | 久久青草av | 中文字幕乱码一区二区三区 | 91看片网 | 欧美日韩一区二区三区四区五区 | 色综合一区| 亚洲视频免费在线看 | www.99精品 | 福利视频大全 | 国产精品久久久久久久久 | 青青久久 | 欧美色偷拍 | 久久成人av电影 | 精品在线播放 | 国产成人99久久亚洲综合精品 | 亚洲最新在线视频 | 欧美aaaaaaaa | 亚洲精品视频三区 | 91在线观看| 超碰91在线| 在线中文字幕日韩 | 国产欧美视频一区二区 | 国产精品99| 一区二区三区四区不卡 |