试了很多方法都无法让显示屏正常显示,不知道是什么原因。用的是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();
- }
- }
复制代码
|