感谢您的指导,但这个程序还是有些问题,我将我全部代码发出来,您看一下。- #include<reg51.h>
- #include<intrins.h>
- #include"LCD1602.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit Data=P3^6; //定义数据线
- uchar rec_dat[9]; //用于显示的接收数据数组
- bit fg=1;
- uint sum=0,sec=0;//sum是软件计数,sec是液滴间隔时间
- uchar disu[2];
- sbit b=P3^2;
- bit flag=0;
- //初始化函数
- void DHT11_delay_us(uchar n)
- {
- while(--n);
- }
- void DHT11_delay_ms(uint z)
- {
- uint i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- void DHT11_start()
- {
- Data=1;
- DHT11_delay_us(2);
- Data=0;
- DHT11_delay_ms(30); //延时18ms以上
- Data=1;
- DHT11_delay_us(30);
- }
- uchar DHT11_rec_byte() //接收一个字节
- {
- uchar i,dat=0;
- for(i=0;i<8;i++) //从高到低依次接收8位数据
- {
- while(!Data); ////等待50us低电平过去
- DHT11_delay_us(8); //延时60us,如果还为高则数据为1,否则为0
- dat<<=1; //移位使正确接收8位数据,数据为0时直接移位
- if(Data==1) //数据为1时,使dat加1来接收数据1
- dat+=1;
- while(Data); //等待数据线拉低
- }
- return dat;
- }
- void DHT11_receive() //接收40位的数据
- {
- uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
- DHT11_start();
- if(Data==0)
- {
- while(Data==0); //等待拉高
- DHT11_delay_us(40); //拉高后延时80us
- R_H=DHT11_rec_byte(); //接收湿度高八位
- R_L=DHT11_rec_byte(); //接收湿度低八位
- T_H=DHT11_rec_byte(); //接收温度高八位
- T_L=DHT11_rec_byte(); //接收温度低八位
- revise=DHT11_rec_byte(); //接收校正位
- DHT11_delay_us(25); //结束
- if((R_H+R_L+T_H+T_L)==revise) //校正
- {
- RH=R_H;
- RL=R_L;
- TH=T_H;
- TL=T_L;
- }
- /*数据处理,方便显示*/
- rec_dat[0]='0'+(TH/10);
- rec_dat[1]='0'+(TH%10);
- rec_dat[2]=0xdf;
- rec_dat[3]=0x43;
- rec_dat[4]=' ';
- rec_dat[5]='0'+(RH/10);
- rec_dat[6]='0'+(RH%10);
- rec_dat[7]='R';
- rec_dat[8]='H';
- }
- }
-
- void main()
- {
-
- TMOD=0x09; //TMOD=0000 1001 定时器T0工作模式1,GTEA置1
- TH0=(65536-50000)/256; //定时50ms
- TL0=(65536-50000)%256;
- TR0=1;
- ET0=0;
- EA=1; //总中断
- EX0=1; //外部中断0
- IT0=1;
- while(1)
- {
- if(flag==1)
- {
- flag=0; //刷新显示器
-
-
- }
- }
-
- disu[0]='0'+(sec/10);
- disu[1]='0'+(sec%10);
-
- LCD_init();
- LCD_send(1,0,"IV speed:",9);
- LCD_send(1,9,disu,2);
- LCD_send(1,11,"/min",4);
- LCD_send(2,1,"T&H:",4);
- DHT11_delay_ms(100); //DHT11上电后要等待1S以越过不稳定状态在此期间不能发送任何指令
-
- while(1)
- {
- DHT11_receive();
- LCD_send(2,6,rec_dat,9);
- LCD_send(1,9,disu,2);
-
- }
-
- }
- void Timer0Interrupt(void) interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- sum++;
- }
- void exint0() interrupt 0
- {
- sec=sum*0.05*60; //显示脉冲间隔并换算成每秒多少次
- sum=0;
- flag=1;
- }
- LCD1602的程序:
- #include <LCD1602.h>
- #include "reg51.h"
- sbit RS = P2^0;
- //sbit RW = P2^1;
- sbit EN = P2^1;
-
- void LCD_send(unsigned char i,unsigned char j,unsigned char str[],unsigned char n)
- {
- //输入:显示行数i,列数j,输出字符,输出字符长度n
- unsigned char x=0;
- if(i==1)
- {write_com(0x80+j);}
- else
- {write_com(0x80+0x40+j);}
- for(x=0;x<n;x++)
- {
- write_date(str[x]);
- delay(150);
- }
- }
- int LCD_init()//初始化函数体
- {
- EN = 0;
- write_com(0X38);//设置16*2显示,5*7点阵,8位数据接口
- write_com(0X0C);//设置开显示,不显示光标
- write_com(0X06);//写一个字符时,整屏右移
- write_com(0X01);//显示清零
- return 0;
- }
- int write_com(unsigned char com)//写命令的函数体
- {
- RS = 0;
- //RW = 0;
- P0 = com;
- delay(5);
- EN = 1;
- delay(5);
- EN = 0;
- return 0;
- }
- int write_date(unsigned char data1)//写数据的函数体
- {
- RS = 1;
- //RW = 0;
- P0 = data1;
- delay(5);
- EN = 1;
- delay(5);
- EN = 0;
- return 0;
- }
- int delay(unsigned char xms)
- {
- unsigned char x,y;
- for(x=xms;x>0;x--)
- for(y=110;y>0;y--);
- return 0;
- }
复制代码 |