完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
|
相关推荐
6个回答
|
|
#include #include #include #include #include #include #define uint unsigned int #define uchar unsigned char uchar DHT11[5],RTflag=0; uchar FLAG; //超时标志位 uchar a; static uchar DateString1[12]={"A12B34C56D89"}; //串口发送数据存储数组 unsigned char getdata; long int i,T=50,H=150; float num=0; void LcdDisplay(int temp); //lcd显示 bit flg=1; #define uchar unsigned char #define uint unsigned int uchar str[7]; #define noACK 0 //用于判断是否结束通讯 #define ACK 1 //结束数据传输 //adr command r/w #define STATUS_REG_W 0x06 //000 0011 0 #define STATUS_REG_R 0x07 //000 0011 1 #define MEASURE_TEMP 0x03 //000 0001 1 #define MEASURE_HUMI 0x05 //000 0010 1 #define RESET 0x1e //000 1111 0 ***it dat=P2^1; ***it RS=P2^5; ***it RW=P2^0; ***it EN=P2^7; uchar table[5]; uint wd,sd; ***it EOC=P3^2; ***it CLK=P3^3; ***it ST=P3^4; ***it OE=P3^5; ***it S= P2^6; ***it K1= P2^2; ***it K2= P2^3; ***it K3= P2^4; ***it K4= P3^7; ***it P12=P3^6; void KEY(void); void usart_init(void) { TL1=0xfd;TH1=0xfd; SCON=0x50; PCON &= 0xef; TR1=1; // IE=0x00; } void zhuanhuan(float a)//浮点数转换成字符串函数 { memset(str,0,sizeof(str)); sprintf (str,"%f", a); } void Delay_t(uint j) { uchar i; for(;j>0;j--) { for(i=0;i<27;i++); } } void Delay_10us(void) //10us延时函数 { uchar i; i--; i--; i--; i--; i--; i--; } void delay(uint z)//1毫秒延时函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void lcd_write_com(uchar com) //1602写指令 { RS=0; RW=0; EN=1; P0=com; delay(1); EN=0; } void lcd_init() //1602初始化 { lcd_write_com(0x38); delay(1); lcd_write_com(0x08); delay(1); lcd_write_com(0x01);//1602清屏指令 delay(1); lcd_write_com(0x06); delay(1); lcd_write_com(0x0C); delay(1); } void lcd_write_data(uchar date)//1602写数据 { RS=1; RW=0; EN=1; P0=date; delay(1); EN=0; } void write_str(uchar x,uchar y,uchar *s)//在任意地址写符号字母或数字 { if(y==0) lcd_write_com(0x80+x); else lcd_write_com(0xc0+x); while(*s) { lcd_write_data(*s); s++; } } void write_shu(uchar x,uchar y,uchar num)//数据显示函数 { uchar s,g; if(y==0) lcd_write_com(0x80+x); else lcd_write_com(0xc0+x); s=num/10;// 数据分离显示 lcd_write_data(0x30+s); g=num%10;//数据分离显示 lcd_write_data(0x30+g); } uchar write_byte1() //读一个字节 { uchar i,comdata,temp1; for(i=0;i<8;i++) { FLAG=2; while((!dat)&&FLAG++);//判断数据位是0还是1 Delay_10us(); Delay_10us(); Delay_10us(); temp1=0; if(dat)temp1=1; // 如果高电平高过预定0高电平值则数据位为 1 FLAG=2; while((dat)&&FLAG++);//flag先与后加1 如果dat一直为1 uchar型变量 flag 溢出变为0 再自加1 if(FLAG==1)break; //超时则跳出for循环 comdata<<=1;//左移一位 高位在前 低位在后 comdata|=temp1; } return (comdata); } void DHT11_5() //读5个字节数据 两个字节为温度数据 两个字节为湿度数据 最后一个字节为校验 { uchar i,temp; //主机拉低18ms dat=0; Delay_t(180); dat=1; //总线由上拉电阻拉高 主机延时20us Delay_10us(); Delay_10us(); Delay_10us(); Delay_10us(); //主机设为输入 判断从机响应信号 dat=1; //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(!dat) //T ! { FLAG=2; //超时标志位 while((!dat)&&FLAG++);//判断从机是否发出 80us 的低电平响应信号是否结束 FLAG=2; while((dat)&&FLAG++); //判断从机拉高80us是否结束 for(i=0;i<5;i++)//数据接收状态 { DHT11[i]=write_byte1(); } dat=1; //释放数据总线 为下一次读取做好准备 temp=(DHT11[0]+DHT11[1]+DHT11[2]+DHT11[3]); if(temp==DHT11[4]) //数据校验 { RTflag=1; } if(RTflag==1) //如果RTflag=1 说明读取到得数据正确 { RTflag=0; // tm[0]=DATARHT[0]/10; // tm[1]=DATARHT[0]%10; // tm[2]=DATARHT[1]/10; //湿度 // tm[3]=DATARHT[2]/10; // tm[4]=DATARHT[2]%10; // tm[5]=DATARHT[3]/10; //温度 write_str(0,0,"H: ");//第一行显示湿度 write_shu(3,0,DHT11[0]); write_str(5,0,"RH"); write_str(8,0,"T: ");//第二行为显示温度 write_shu(11,0,DHT11[2]); write_str(13,0,"^C"); } } } void main() { // value humi_val,temp_val; // unsigned char error,checksum; char L=0; // s_connectionreset(); ST=0; OE=0; //定时器初始化 ET0=1; EA=1; TMOD=0x22; TH0=216; TL0=216; TR0=1; K1=1; K2=1; // K3=1; // K4=1; usart_init(); P12=1; lcd_init(); //1602初始化 delay(1000); //等待DHT11温湿度传感器数据稳定 开始激活DHT11 while(1)//循环读取 并更新数据显示 { i=0; while(DateString1[i]!=' |