試了很多方法都無法讓顯示屏正常顯示,不知道是什么原因。用的是mini51單片機(AT89C52),顯示屏只是亮,一直無顯示。不知有沒有做過這個項目的或者熟悉的幫我看看。
以下是代碼部分:原計劃做一個蜂鳴器警報和按鍵解除警報的,但現在卡在LCD顯示上了
- #include <reg52.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit busy=P0^7;//檢測忙
- sbit bee= P1^5;//蜂鳴器
- sbit io = P1^1 ;//數據接收端口
- sbit rs = P2^0 ; //數據命令選擇
- sbit rw = P2^1 ;//讀寫選擇
- sbit e = P2^2 ;//使能
- sbit K1 = P1^2;//按鍵終止警報
- sbit K2 = P1^3;//按鍵恢復警報
- uchar Tem,Hum,TemHigh,TemLow,HumHigh,HumLow;//溫濕度高低8位數據
- uchar TemWarnHigh,TemWarnLow,HumWarnHigh,HumWarnLow;//報警的溫度和濕度
- uchar data1;//傳輸的數據存放
- uchar BeepFlag;//按鍵報警標志,1為禁用,0為啟用
- //設置報警溫濕度上下限
- #define TemWarnHigh 24
- #define TemWarnLow 16
- #define HumWarnHigh 60
- #define HumWarnLow 50
- /**********延時模塊**********/
- void Delay10us() //11.0592MHz
- {
- uchar i;
- _nop_();
- i = 25;
- while (--i);
- }
- void DelayLong(uint times)
- {
- while(times--)
- Delay10us();
- }
- /**********LCD模塊**********/
- void LCDBusy()//測試LCD忙碌狀態
- {
- uchar result ;
- rs = 0 ;
- rw = 1 ;
- do
- {
- e = 1 ;
- result = busy;
- e = 0 ;
- }while(result & 0x80);//判斷D7是否為1,D7=1表示忙
- }
- void LCDWriteCmd(uchar cmd)// 寫指令
- {
- LCDBusy() ;//判斷LCD是否忙
- rs = 0 ;
- rw = 0 ;
- P0 = cmd ;//寫入指令
- e = 1 ;
- DelayLong(10);
- e = 0 ;
- DelayLong(10);
- }
- void LCDWriteAddr(uchar addr)//寫地址
- {
- LCDWriteCmd(addr|0x80) ;
- }
- void LCDWriteByte(uchar dat)//寫字節
- {
- LCDBusy() ;//判斷LCD是否忙
- rs = 1 ;
- rw = 0 ;
- P0 = dat ;//寫入數據
- e = 1 ;
- DelayLong(10);
- e = 0 ;
- DelayLong(10);
- }
- void LCDInit()// LCD初始化
- {
- LCDWriteCmd(0x38) ;
- DelayLong(500);
- LCDWriteCmd(0x38) ;
- DelayLong(500);
- LCDWriteCmd(0x38) ;
- DelayLong(500);
- LCDWriteCmd(0x38) ;//設置16×2顯示,每個方塊5×7點陣,8位數據接口
- LCDWriteCmd(0x0C) ;//顯示器開,光標關閉
- LCDWriteCmd(0x06) ;//文字不動,地址自動加一
- LCDWriteCmd(0x01) ;//清屏
- }
- void LCDDisplay(uchar addr, uchar q)//在某一地址顯示一字節
- {
- Delay10us();
- LCDWriteAddr(addr) ;
- LCDWriteByte(q) ;
- Delay10us();
- }
- void LCDWarning()
- {
- if(Tem>=TemWarnHigh) //檢測的溫度高于額定上限
- {
- LCDDisplay(0x08,'T') ;
- LCDDisplay(0x09,'e') ;
- LCDDisplay(0x0A,'m') ;
- LCDDisplay(0x0B,'H') ;
- LCDDisplay(0x0C,'i') ;
- LCDDisplay(0x0D,'g') ;
- LCDDisplay(0x0E,'h') ;
- LCDDisplay(0x0F,'!') ;
- }
- if(Tem<=TemWarnLow) //檢測的溫度低于額定下限
- {
- LCDDisplay(0x08,'T') ;
- LCDDisplay(0x09,'e') ;
- LCDDisplay(0x0A,'m') ;
- LCDDisplay(0x0B,'L') ;
- LCDDisplay(0x0C,'o') ;
- LCDDisplay(0x0D,'w') ;
- LCDDisplay(0x0E,'!') ;
- }
- if(Hum>=HumWarnHigh) //檢測的濕度高于額定上限
- {
- LCDDisplay(0x48,'H') ;
- LCDDisplay(0x49,'u') ;
- LCDDisplay(0x4A,'m') ;
- LCDDisplay(0x4B,'H') ;
- LCDDisplay(0x4C,'i') ;
- LCDDisplay(0x4D,'g') ;
- LCDDisplay(0x4E,'h') ;
- LCDDisplay(0x4F,'!') ;
- }
- if(Hum<=HumWarnLow) //檢測的濕度低于額定下限
- {
- LCDDisplay(0x48,'H') ;
- LCDDisplay(0x49,'u') ;
- LCDDisplay(0x4A,'m') ;
- LCDDisplay(0x4B,'L') ;
- LCDDisplay(0x4C,'o') ;
- LCDDisplay(0x4D,'w') ;
- LCDDisplay(0x4E,'!') ;
- }
- }
- /**********蜂鳴器模塊***********/
- void BEEP() //報警函數
- {
- if(Tem<=TemWarnLow || Tem>=TemWarnHigh) //檢測的溫度超標
- bee=0; //報警
- if(Hum<=HumWarnLow || Hum>=HumWarnHigh) //檢測的濕度超標
- bee=0; //報警
- }
- /**********DHT11模塊***********/
- void DHTStart()//開始信號
- {
- io=1;//拉高data
- Delay10us();
- io=0;
- DelayLong(180);//微處理器IO設置為高電平且時間>18ms
- io=1;//再拉高data
- Delay10us();
- }
- uchar DHTReceive()//接收一個字節
- {
- uint i;
- uchar temp,count;//temp記錄是0還是1,count計數收到第幾位
- data1=0;
- for(i=0;i<8;i++)//一次接受8位
- {
- temp=0;//初始收到0,低電平
- DelayLong(4);//延時40us后判斷收到的電平
- if(io==1)temp=1;//如果收到1,那么傳送的是1,否則傳送的是0
- count=2;
- while((io)&&count++);//io=0則等待,count防止死循環
- if(count==1)break;
- data1<<=1;//左移1位
- data1|=temp;//傳輸當前位給data存儲
- }
- return data1;
- }
- void receive()//接收數據
- {
- uchar TemH,TemL,HumH,HumL,check,sum;
- uint time;
- DHTStart();//開始信號
- //DHT11收到開始信號后進行應答
- time=8;
- while(!io & time>0)time--;//等待DHT拉高80us
- time=8;
- while(io && time>0)time--;//等待DHT拉低80us
- //開始接收數據
- io=1;//主機拉高data
- Delay10us();
- if(!io)//讀取DHT11響應信號,DHT11拉低data
- {
- HumH=DHTReceive();//濕度高8位
- HumL=DHTReceive();//濕度低8位
- TemH=DHTReceive();//溫度高8位
- TemL=DHTReceive();//溫度低8位
- check=DHTReceive();//校驗位
- io=0;//拉低延時50us,代表讀取結束
- DelayLong(5);
- io=1;
- sum=HumH+HumL+TemH+TemL;//校驗
- if(sum==check)//校驗通過數據錄入
- {
- HumHigh=HumH;
- HumLow=HumL;
- TemHigh=TemH;
- TemLow=TemL;
- }
- }
- }
- /**********主程序**********/
- void main()
- {
- BeepFlag=1;
- LCDInit();//LCD初始化
- while(1)
- {
- LCDDisplay(0x00,'T') ; //LCD顯示Tem:
- LCDDisplay(0x01,'e') ;
- LCDDisplay(0x02,'m') ;
- LCDDisplay(0x03,':') ;
- LCDDisplay(0x40,'H') ; //LCD顯示Hum:
- LCDDisplay(0x41,'u') ;
- LCDDisplay(0x42,'m') ;
- LCDDisplay(0x43,':') ;
- receive();
- LCDDisplay(0x04,TemHigh/10+0x30) ;//溫度顯示
- LCDDisplay(0x05,TemLow%10+0x30) ;
- LCDDisplay(0x44,HumHigh/10+0x30) ;//濕度顯示
- LCDDisplay(0x45,HumLow%10+0x30) ;
- LCDWarning();//超標顯示
- if(!K1)BeepFlag=0;//若K1被按下,則禁用蜂鳴器
- if(!K2)BeepFlag=1;//若K2被按下,則啟用蜂鳴器
- if(BeepFlag) BEEP();
- }
- }
復制代碼
|