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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3835|回復: 5
收起左側

51單片機連LCD1602無法顯示的問題

[復制鏈接]
ID:327994 發表于 2020-3-17 01:57 | 顯示全部樓層 |閱讀模式
試了很多方法都無法讓顯示屏正常顯示,不知道是什么原因。用的是mini51單片機(AT89C52),顯示屏只是亮,一直無顯示。不知有沒有做過這個項目的或者熟悉的幫我看看。
213.jpg

以下是代碼部分:原計劃做一個蜂鳴器警報和按鍵解除警報的,但現在卡在LCD顯示上了
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit busy=P0^7;//檢測忙
  6. sbit bee= P1^5;//蜂鳴器
  7. sbit io = P1^1 ;//數據接收端口
  8. sbit rs = P2^0 ; //數據命令選擇
  9. sbit rw = P2^1 ;//讀寫選擇
  10. sbit e  = P2^2 ;//使能
  11. sbit K1 = P1^2;//按鍵終止警報
  12. sbit K2 = P1^3;//按鍵恢復警報

  13. uchar Tem,Hum,TemHigh,TemLow,HumHigh,HumLow;//溫濕度高低8位數據
  14. uchar TemWarnHigh,TemWarnLow,HumWarnHigh,HumWarnLow;//報警的溫度和濕度
  15. uchar data1;//傳輸的數據存放
  16. uchar BeepFlag;//按鍵報警標志,1為禁用,0為啟用

  17. //設置報警溫濕度上下限
  18. #define TemWarnHigh 24
  19. #define TemWarnLow  16
  20. #define HumWarnHigh 60
  21. #define HumWarnLow  50


  22. /**********延時模塊**********/

  23. void Delay10us()                //11.0592MHz
  24. {
  25.         uchar i;

  26.         _nop_();
  27.         i = 25;
  28.         while (--i);
  29. }

  30. void DelayLong(uint times)
  31. {
  32.     while(times--)
  33.         Delay10us();
  34. }

  35. /**********LCD模塊**********/

  36. void LCDBusy()//測試LCD忙碌狀態
  37. {
  38.          uchar result ;
  39.          rs = 0 ;
  40.          rw = 1 ;
  41.          do
  42.      {
  43.          e  = 1 ;
  44.          result = busy;
  45.          e  = 0 ;
  46.      }while(result & 0x80);//判斷D7是否為1,D7=1表示忙
  47. }

  48. void LCDWriteCmd(uchar cmd)// 寫指令
  49. {
  50.         LCDBusy() ;//判斷LCD是否忙
  51.         rs = 0 ;
  52.         rw = 0 ;
  53.         P0 = cmd ;//寫入指令
  54.         e  = 1 ;
  55.         DelayLong(10);
  56.         e  = 0 ;
  57.         DelayLong(10);
  58. }

  59. void LCDWriteAddr(uchar addr)//寫地址
  60. {
  61.         LCDWriteCmd(addr|0x80) ;
  62. }

  63. void LCDWriteByte(uchar dat)//寫字節
  64. {
  65.         LCDBusy() ;//判斷LCD是否忙
  66.           rs = 1 ;
  67.           rw = 0 ;
  68.           P0 = dat ;//寫入數據
  69.           e  = 1 ;
  70.           DelayLong(10);
  71.           e  = 0 ;
  72.           DelayLong(10);
  73. }

  74. void LCDInit()// LCD初始化
  75. {
  76.          LCDWriteCmd(0x38) ;
  77.          DelayLong(500);
  78.          LCDWriteCmd(0x38) ;
  79.      DelayLong(500);
  80.          LCDWriteCmd(0x38) ;
  81.      DelayLong(500);
  82.          LCDWriteCmd(0x38) ;//設置16×2顯示,每個方塊5×7點陣,8位數據接口
  83.          LCDWriteCmd(0x0C) ;//顯示器開,光標關閉
  84.          LCDWriteCmd(0x06) ;//文字不動,地址自動加一
  85.          LCDWriteCmd(0x01) ;//清屏
  86. }

  87. void LCDDisplay(uchar addr, uchar q)//在某一地址顯示一字節
  88. {
  89.          Delay10us();
  90.          LCDWriteAddr(addr) ;
  91.      LCDWriteByte(q) ;
  92.          Delay10us();
  93. }

  94. void LCDWarning()
  95. {
  96.     if(Tem>=TemWarnHigh)  //檢測的溫度高于額定上限
  97.     {
  98.         LCDDisplay(0x08,'T') ;
  99.         LCDDisplay(0x09,'e') ;
  100.         LCDDisplay(0x0A,'m') ;
  101.         LCDDisplay(0x0B,'H') ;
  102.         LCDDisplay(0x0C,'i') ;
  103.         LCDDisplay(0x0D,'g') ;
  104.         LCDDisplay(0x0E,'h') ;
  105.         LCDDisplay(0x0F,'!') ;
  106.     }

  107.     if(Tem<=TemWarnLow)  //檢測的溫度低于額定下限
  108.     {
  109.         LCDDisplay(0x08,'T') ;
  110.         LCDDisplay(0x09,'e') ;
  111.         LCDDisplay(0x0A,'m') ;
  112.         LCDDisplay(0x0B,'L') ;
  113.         LCDDisplay(0x0C,'o') ;
  114.         LCDDisplay(0x0D,'w') ;
  115.         LCDDisplay(0x0E,'!') ;
  116.     }

  117.         if(Hum>=HumWarnHigh)  //檢測的濕度高于額定上限
  118.     {
  119.         LCDDisplay(0x48,'H') ;
  120.         LCDDisplay(0x49,'u') ;
  121.         LCDDisplay(0x4A,'m') ;
  122.         LCDDisplay(0x4B,'H') ;
  123.         LCDDisplay(0x4C,'i') ;
  124.         LCDDisplay(0x4D,'g') ;
  125.         LCDDisplay(0x4E,'h') ;
  126.         LCDDisplay(0x4F,'!') ;
  127.     }

  128.     if(Hum<=HumWarnLow)  //檢測的濕度低于額定下限
  129.     {
  130.         LCDDisplay(0x48,'H') ;
  131.         LCDDisplay(0x49,'u') ;
  132.         LCDDisplay(0x4A,'m') ;
  133.         LCDDisplay(0x4B,'L') ;
  134.         LCDDisplay(0x4C,'o') ;
  135.         LCDDisplay(0x4D,'w') ;
  136.         LCDDisplay(0x4E,'!') ;
  137.     }

  138. }

  139. /**********蜂鳴器模塊***********/

  140. void BEEP()  //報警函數
  141. {
  142.     if(Tem<=TemWarnLow || Tem>=TemWarnHigh)  //檢測的溫度超標
  143.         bee=0; //報警

  144.         if(Hum<=HumWarnLow || Hum>=HumWarnHigh)  //檢測的濕度超標
  145.         bee=0; //報警
  146. }

  147. /**********DHT11模塊***********/

  148. void DHTStart()//開始信號
  149. {
  150.         io=1;//拉高data
  151.         Delay10us();
  152.         io=0;
  153.         DelayLong(180);//微處理器IO設置為高電平且時間>18ms
  154.         io=1;//再拉高data
  155.     Delay10us();
  156. }

  157. uchar DHTReceive()//接收一個字節
  158. {
  159.         uint i;
  160.         uchar temp,count;//temp記錄是0還是1,count計數收到第幾位
  161.         data1=0;
  162.         for(i=0;i<8;i++)//一次接受8位
  163.         {
  164.         temp=0;//初始收到0,低電平
  165.                 DelayLong(4);//延時40us后判斷收到的電平
  166.                 if(io==1)temp=1;//如果收到1,那么傳送的是1,否則傳送的是0
  167.                 count=2;
  168.                 while((io)&&count++);//io=0則等待,count防止死循環
  169.                 if(count==1)break;
  170.                 data1<<=1;//左移1位
  171.                 data1|=temp;//傳輸當前位給data存儲
  172.         }
  173.         return data1;
  174. }

  175. void receive()//接收數據
  176. {
  177.         uchar TemH,TemL,HumH,HumL,check,sum;
  178.         uint time;
  179.         DHTStart();//開始信號

  180.         //DHT11收到開始信號后進行應答
  181.         time=8;
  182.         while(!io & time>0)time--;//等待DHT拉高80us
  183.         time=8;
  184.         while(io && time>0)time--;//等待DHT拉低80us

  185.         //開始接收數據
  186.         io=1;//主機拉高data
  187.         Delay10us();
  188.         if(!io)//讀取DHT11響應信號,DHT11拉低data
  189.         {
  190.         HumH=DHTReceive();//濕度高8位
  191.         HumL=DHTReceive();//濕度低8位
  192.         TemH=DHTReceive();//溫度高8位
  193.         TemL=DHTReceive();//溫度低8位
  194.         check=DHTReceive();//校驗位
  195.         io=0;//拉低延時50us,代表讀取結束
  196.         DelayLong(5);
  197.         io=1;

  198.         sum=HumH+HumL+TemH+TemL;//校驗
  199.         if(sum==check)//校驗通過數據錄入
  200.         {
  201.             HumHigh=HumH;
  202.             HumLow=HumL;
  203.             TemHigh=TemH;
  204.             TemLow=TemL;
  205.         }
  206.         }
  207. }

  208. /**********主程序**********/

  209. void main()
  210. {
  211.         BeepFlag=1;
  212.     LCDInit();//LCD初始化
  213.         while(1)
  214.         {

  215.         LCDDisplay(0x00,'T') ; //LCD顯示Tem:
  216.         LCDDisplay(0x01,'e') ;
  217.         LCDDisplay(0x02,'m') ;
  218.         LCDDisplay(0x03,':') ;

  219.         LCDDisplay(0x40,'H') ; //LCD顯示Hum:
  220.         LCDDisplay(0x41,'u') ;
  221.         LCDDisplay(0x42,'m') ;
  222.         LCDDisplay(0x43,':') ;

  223.                 receive();
  224.                 LCDDisplay(0x04,TemHigh/10+0x30) ;//溫度顯示
  225.                 LCDDisplay(0x05,TemLow%10+0x30) ;
  226.                 LCDDisplay(0x44,HumHigh/10+0x30) ;//濕度顯示
  227.                 LCDDisplay(0x45,HumLow%10+0x30) ;
  228.                 LCDWarning();//超標顯示

  229.                 if(!K1)BeepFlag=0;//若K1被按下,則禁用蜂鳴器
  230.         if(!K2)BeepFlag=1;//若K2被按下,則啟用蜂鳴器
  231.                 if(BeepFlag) BEEP();
  232.         }
  233. }
復制代碼




回復

使用道具 舉報

ID:452950 發表于 2020-3-17 14:26 | 顯示全部樓層
先看開發板引腳定義檢查顯示屏有沒有插反,有沒有跳線帽影響到顯示屏,調節一下對比度
回復

使用道具 舉報

ID:704545 發表于 2020-3-17 15:37 | 顯示全部樓層
檢查接口對應是否正確,把對比度調整到屏幕顯示有陰影了再調回去一點。對比度調節偏太遠了就算程序正常也無法顯示出來。先保證硬件正常再看程序有沒有問題。
回復

使用道具 舉報

ID:584814 發表于 2020-3-17 17:01 | 顯示全部樓層
程序都是抄來的一般不會錯。先查接口對應管腳,再調時序(可以換幾個不同的網上程序),個人經驗是現成的四線(僅數據線少一半)驅動程序一般比較容易啟動。1602還是比較容易上手的,網上極客甚至能用單線驅動(自行百度)。
回復

使用道具 舉報

ID:372579 發表于 2020-3-17 17:04 | 顯示全部樓層
樓主問題解決了嗎
回復

使用道具 舉報

ID:155507 發表于 2020-3-17 22:03 | 顯示全部樓層
單片機是根據硬件電路圖的設計來寫代碼的
QX-Mini51-LCD.jpg



  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit busy= P2^7; //P0^7;//檢測忙
  6. sbit bee= P3^6;  //P1^5;//蜂鳴器
  7. sbit io = P1^1; //數據接收端口
  8. sbit rs = P0^7; //P2^0 ; //數據命令選擇
  9. sbit rw = P0^6; //P2^1 ;//讀寫選擇
  10. sbit e  = P0^5; //P2^2 ;//使能
  11. sbit K1 = P3^5; //P1^2;//按鍵終止警報
  12. sbit K2 = P3^4; //P1^3;//按鍵恢復警報

  13. uchar Tem,Hum,TemHigh,TemLow,HumHigh,HumLow;//溫濕度高低8位數據
  14. uchar TemWarnHigh,TemWarnLow,HumWarnHigh,HumWarnLow;//報警的溫度和濕度
  15. uchar data1;//傳輸的數據存放
  16. uchar BeepFlag;//按鍵報警標志,1為禁用,0為啟用

  17. //設置報警溫濕度上下限
  18. #define TemWarnHigh 24
  19. #define TemWarnLow  16
  20. #define HumWarnHigh 60
  21. #define HumWarnLow  50


  22. /**********延時模塊**********/

  23. void Delay10us()                //11.0592MHz
  24. {
  25.         uchar i;

  26.         _nop_();
  27.         i = 25;
  28.         while (--i);
  29. }

  30. void DelayLong(uint times)
  31. {
  32.         while(times--)
  33.         Delay10us();
  34. }

  35. /**********LCD模塊**********/

  36. void LCDBusy()//測試LCD忙碌狀態
  37. {
  38.         uchar result ;
  39.         rs = 0 ;
  40.         rw = 1 ;
  41.         do
  42.         {
  43.                 e  = 1 ;
  44.                 result = busy;
  45.                 e  = 0 ;
  46.         }while(result & 0x80);//判斷D7是否為1,D7=1表示忙
  47. }

  48. void LCDWriteCmd(uchar cmd)// 寫指令
  49. {
  50.         LCDBusy() ;//判斷LCD是否忙
  51.         rs = 0 ;
  52.         rw = 0 ;
  53.         P2 = cmd ;//寫入指令
  54.         e  = 1 ;
  55.         DelayLong(10);
  56.         e  = 0 ;
  57.         DelayLong(10);
  58. }

  59. void LCDWriteAddr(uchar addr)//寫地址
  60. {
  61.         LCDWriteCmd(addr|0x80) ;
  62. }

  63. void LCDWriteByte(uchar dat)//寫字節
  64. {
  65.         LCDBusy() ;//判斷LCD是否忙
  66.         rs = 1 ;
  67.         rw = 0 ;
  68.         P2 = dat ;//寫入數據
  69.         e  = 1 ;
  70.         DelayLong(10);
  71.         e  = 0 ;
  72.         DelayLong(10);
  73. }

  74. void LCDInit()// LCD初始化
  75. {
  76.         LCDWriteCmd(0x38) ;
  77.         DelayLong(500);
  78.         LCDWriteCmd(0x38) ;
  79.         DelayLong(500);
  80.         LCDWriteCmd(0x38) ;
  81.         DelayLong(500);
  82.         LCDWriteCmd(0x38) ;//設置16×2顯示,每個方塊5×7點陣,8位數據接口
  83.         LCDWriteCmd(0x0C) ;//顯示器開,光標關閉
  84.         LCDWriteCmd(0x06) ;//文字不動,地址自動加一
  85.         LCDWriteCmd(0x01) ;//清屏
  86. }

  87. void LCDDisplay(uchar addr, uchar q)//在某一地址顯示一字節
  88. {
  89.         Delay10us();
  90.         LCDWriteAddr(addr) ;
  91.         LCDWriteByte(q) ;
  92.         Delay10us();
  93. }

  94. void LCDWarning()
  95. {
  96.         if(Tem>=TemWarnHigh)  //檢測的溫度高于額定上限
  97.         {
  98.                 LCDDisplay(0x08,'T') ;
  99.                 LCDDisplay(0x09,'e') ;
  100.                 LCDDisplay(0x0A,'m') ;
  101.                 LCDDisplay(0x0B,'H') ;
  102.                 LCDDisplay(0x0C,'i') ;
  103.                 LCDDisplay(0x0D,'g') ;
  104.                 LCDDisplay(0x0E,'h') ;
  105.                 LCDDisplay(0x0F,'!') ;
  106.         }

  107.         if(Tem<=TemWarnLow)  //檢測的溫度低于額定下限
  108.         {
  109.                 LCDDisplay(0x08,'T') ;
  110.                 LCDDisplay(0x09,'e') ;
  111.                 LCDDisplay(0x0A,'m') ;
  112.                 LCDDisplay(0x0B,'L') ;
  113.                 LCDDisplay(0x0C,'o') ;
  114.                 LCDDisplay(0x0D,'w') ;
  115.                 LCDDisplay(0x0E,'!') ;
  116.         }

  117.         if(Hum>=HumWarnHigh)  //檢測的濕度高于額定上限
  118.         {
  119.                 LCDDisplay(0x48,'H') ;
  120.                 LCDDisplay(0x49,'u') ;
  121.                 LCDDisplay(0x4A,'m') ;
  122.                 LCDDisplay(0x4B,'H') ;
  123.                 LCDDisplay(0x4C,'i') ;
  124.                 LCDDisplay(0x4D,'g') ;
  125.                 LCDDisplay(0x4E,'h') ;
  126.                 LCDDisplay(0x4F,'!') ;
  127.         }

  128.         if(Hum<=HumWarnLow)  //檢測的濕度低于額定下限
  129.         {
  130.                 LCDDisplay(0x48,'H') ;
  131.                 LCDDisplay(0x49,'u') ;
  132.                 LCDDisplay(0x4A,'m') ;
  133.                 LCDDisplay(0x4B,'L') ;
  134.                 LCDDisplay(0x4C,'o') ;
  135.                 LCDDisplay(0x4D,'w') ;
  136.                 LCDDisplay(0x4E,'!') ;
  137.         }

  138. }

  139. /**********蜂鳴器模塊***********/

  140. void BEEP()  //報警函數
  141. {
  142.         if(Tem<=TemWarnLow || Tem>=TemWarnHigh)  //檢測的溫度超標
  143.         bee=0; //報警

  144.         if(Hum<=HumWarnLow || Hum>=HumWarnHigh)  //檢測的濕度超標
  145.         bee=0; //報警
  146. }

  147. /**********DHT11模塊***********/

  148. void DHTStart()//開始信號
  149. {
  150.         io=1;//拉高data
  151.         Delay10us();
  152.         io=0;
  153.         DelayLong(180);//微處理器IO設置為高電平且時間>18ms
  154.         io=1;//再拉高data
  155.         Delay10us();
  156. }

  157. uchar DHTReceive()//接收一個字節
  158. {
  159.         uint i;
  160.         uchar temp,count;//temp記錄是0還是1,count計數收到第幾位
  161.         data1=0;
  162.         for(i=0;i<8;i++)//一次接受8位
  163.         {
  164.                 temp=0;//初始收到0,低電平
  165.                 DelayLong(4);//延時40us后判斷收到的電平
  166.                 if(io==1)temp=1;//如果收到1,那么傳送的是1,否則傳送的是0
  167.                 count=2;
  168.                 while((io)&&count++);//io=0則等待,count防止死循環
  169.                 if(count==1)break;
  170.                 data1<<=1;//左移1位
  171.                 data1|=temp;//傳輸當前位給data存儲
  172.         }
  173.         return data1;
  174. }

  175. void receive()//接收數據
  176. {
  177.         uchar TemH,TemL,HumH,HumL,check,sum;
  178.         uint time;
  179.         DHTStart();//開始信號

  180.         //DHT11收到開始信號后進行應答
  181.         time=8;
  182.         while(!io & time>0)time--;//等待DHT拉高80us
  183.         time=8;
  184.         while(io && time>0)time--;//等待DHT拉低80us

  185.         //開始接收數據
  186.         io=1;//主機拉高data
  187.         Delay10us();
  188.         if(!io)//讀取DHT11響應信號,DHT11拉低data
  189.         {
  190.                 HumH=DHTReceive();//濕度高8位
  191.                 HumL=DHTReceive();//濕度低8位
  192.                 TemH=DHTReceive();//溫度高8位
  193.                 TemL=DHTReceive();//溫度低8位
  194.                 check=DHTReceive();//校驗位
  195.                 io=0;//拉低延時50us,代表讀取結束
  196.                 DelayLong(5);
  197.                 io=1;

  198.                 sum=HumH+HumL+TemH+TemL;//校驗
  199.                 if(sum==check)//校驗通過數據錄入
  200.                 {
  201.                         HumHigh=HumH;
  202.                         HumLow=HumL;
  203.                         TemHigh=TemH;
  204.                         TemLow=TemL;
  205.                 }
  206.         }
  207. }

  208. /**********主程序**********/

  209. void main()
  210. {
  211.         BeepFlag=1;
  212.         LCDInit();//LCD初始化
  213.         while(1)
  214.         {

  215.                 LCDDisplay(0x00,'T') ; //LCD顯示Tem:
  216.                 LCDDisplay(0x01,'e') ;
  217.                 LCDDisplay(0x02,'m') ;
  218.                 LCDDisplay(0x03,':') ;

  219.                 LCDDisplay(0x40,'H') ; //LCD顯示Hum:
  220.                 LCDDisplay(0x41,'u') ;
  221.                 LCDDisplay(0x42,'m') ;
  222.                 LCDDisplay(0x43,':') ;

  223.                 receive();
  224.                 LCDDisplay(0x04,TemHigh/10+0x30) ;//溫度顯示
  225.                 LCDDisplay(0x05,TemLow%10+0x30) ;
  226.                 LCDDisplay(0x44,HumHigh/10+0x30) ;//濕度顯示
  227.                 LCDDisplay(0x45,HumLow%10+0x30) ;
  228.                 LCDWarning();//超標顯示

  229.                 if(!K1)BeepFlag=0;//若K1被按下,則禁用蜂鳴器
  230.                 if(!K2)BeepFlag=1;//若K2被按下,則啟用蜂鳴器
  231.                 if(BeepFlag) BEEP();
  232.         }
  233. }

復制代碼




回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕一区二区三区精彩视频 | 国产精品久久久久久久久久久免费看 | 久久久久久久一级 | 精品视频在线观看 | 国产高清一区二区 | 亚洲码欧美码一区二区三区 | 国产精品久久久久久久久免费软件 | 综合久久综合久久 | 亚洲激情专区 | 国产日韩av一区二区 | 成人av免费播放 | 久久国产精彩视频 | 亚洲国产中文在线 | 亚洲欧美激情四射 | 亚洲一区二区视频 | av毛片免费 | 国产免费一区二区 | 日韩亚洲一区二区 | 国精产品一区一区三区免费完 | 免费黄色录像片 | 欧美精品一区二区三区蜜桃视频 | 欧美偷偷| 日韩欧美在 | 久久久做 | 国产精品视频一 | 福利av在线 | 成人福利在线观看 | 超碰在线免费 | 黄色一级在线播放 | 久久久精品一区二区三区 | www.亚洲免费| 久久九九99 | 青青草视频免费观看 | 国产一区二区日韩 | 国产精品久久久久久一区二区三区 | 久久久久久久久久久福利观看 | 国产一区二区久久 | 日韩精品视频中文字幕 | 99热.com| 久久免费视频网 | 国产美女久久 |