当前位置:文档之家› 基于单片机温湿度控制

基于单片机温湿度控制


• • • • • • • • • • • • • • • • • • • • • •
//读取温湿度子程序 void read_TRH() { TRH=0; delay_ms(18); TRH=1; delay_us(); delay_us(); delay_us(); delay_us(); if(!TRH) { respond=2; while((!TRH)&& respond++); respond=2; while(TRH && respond++); //数据接收状态 RH_temp = receive(); RL_temp = receive(); TH_temp = receive(); TL_temp = receive(); CK_temp = receive(); TRH=1; //数据 校验
引脚
1602读写时序图
总电路图
程序如下:
#include <reg52.h> #include <intrins.h> typedef unsigned char uchar; typedef unsigned int unint; unsigned char str1[]={""}; unsigned char str2[]={""}; unsigned char code dis1[] = {"TRH RH: "}; unsigned char code dis2[] = {"TRH T: "}; sbit TRH = P2^7;//温湿度传感器DHT11数据接入 sbit LCD_RS = P2^3; sbit LCD_RW = P2^4; sbit LCD_EN = P2^5; sbit jiare = P1^4; sbit jiangwen= P1^5; sbit zengshi= P1^6 sbit jiangshi= P1^7; uchar TH_data,TL_data,RH_data,RL_data,CK_data; uchar TH_temp,TL_temp,RH_temp,RL_temp,CK_temp; uchar com_data,untemp,temp; uchar respond;
//16*2显示,5*7点阵,8位数据
//显示开,关光标
//移动光标
//清除LCD的显示内容
• //设定LCD显示位置
• void lcd_dis_pos(unsigned char pos)
• {


lcd_wcmd(pos | 0x80); //数据指针=80+地址变
• }
• • • • • • • • • • • • • • • • • • • • • • id lcd_wcmd(unsigned char cmd) { while(lcd_busy()); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; }

• • • • • • • • • • • • • • • • • • • • • • • • • • • • • •
主程序
void main() { unsigned char i,n=0x40,m; lcd_init(); delay_us(); while(1) { read_TRH(); for(i=0;i<=7;i++) { lcd_dis_pos(i); //显示字符 lcd_wdata(dis1[i]); lcd_dis_pos(n+i); //显示字符 lcd_wdata(dis2[i]); } //写湿度数据 m=0x08; for(i=0;i<=7;i++) { lcd_dis_pos(m); lcd_wdata(str1[i]); m++; } //写温度数据 m=0x48; for(i=0;i<=7;i++) { lcd_dis_pos(m); lcd_wdata(str2[i]); m++; }

//LCD初始化设定
• void lcd_init() • { • delay_ms(15); • lcd_wcmd(0x38); • delay_ms(5); • lcd_wcmd(0x0c); • delay_ms(5); • lcd_wcmd(0x06); • delay_ms(5); • lcd_wcmd(0x01); • delay_ms(5); • }
//收发信号检测,数据读取 char receive() { uchar i; com_data=0; for(i=0;i<=7;i++) { respond=2; while((!TRH)&&respond++); delay_us(); delay_us(); delay_us(); if(TRH) { temp=1; respond=2; while((TRH)&&respond++); } else temp=0; com_data<<=1; com_data|=temp; } return(com_data); }
void delayNOP() { _nop_(); _nop_(); _nop_(); _nop_(); }
void delay_us() //5us级延时程序 { uchar i; i--; i--; i--; i--; i--; i--; }
void delay_ms(unsigned char ms) // 毫秒级延时子程序 { unsigned char i; while(ms--) { for(i = 0; i< 150; i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } }
untemp=(RH_temp+RL_temp+TH_temp+TL_ temp); if(untemp==CK_temp) { RH_data = RH_temp; RL_data = RL_temp; TH_data = TH_temp; TL_data = TL_temp; CK_data = CK_temp; } } str1[0] = (char)(0X30+RH_data/10); str1[1] = (char)(0X30+RH_data%10); str1[2] = 0x2e; //小数点 str1[3] = (char)(0X30+RL_data/10); str1[5] = 0X25; //"%" str1[6] = 0X52; //"R" str1[7] = 0X48; //"H" str2[0] = (char)(0X30+TH_data/10); str2[1] = (char)(0X30+TH_data%10); str2[2] = 0x2e; //小数点 str2[3] = (char)(0X30+TL_data/10); str2[5] = 0X27; //"'" str2[6] = 0X43; //"C" }
设计思路
温湿度采集传感器:DHT11
实物图
与单片机连接图
DHT11时序
主机发送请求信号
从机发送应答信号
位数据“0”的格 式
位数据“1”的格 式
温湿度显示:LCD1602
LCD_1602 初始化一些重要指令: 0x38 设置16*2显示,5*7点阵,8 位数据接口 0x01 清屏 0x0F 开显示,显示光标,光标闪 烁 0x08 只开显示 0x0e 开显示,显示光标,光标不 闪烁 0x0c 开显示,不显示光标 0x06 地址加1,当写入数据的时 候光标右移 0x02 地址计数器AC=0;(此时地 址为0x80) 光标归原点,但是 DDRAM中断内容不变 0x18 光标和显示一起向左移动
• // 测试LCD忙碌状态lcd_busy()为1时,忙,等待。 lcd_busy()为0时,闲,可写指令与数据。 • bit lcd_busy() • { • bit result; • LCD_RS = 0; • LCD_RW = 1; • LCD_EN = 1; • delayNOP(); • result = (bit)(P0&0x80); • LCD_EN = 0; • return(result); • }
• //写显示数据到LCD:RS=高电平,RW=低电平, E=高脉冲,D0-D7=数据。 • void lcd_wdata(unsigned char dat) • { • while(lcd_busy()); • LCD_RS = 1; • LCD_RW = 0; • LCD_EN = 0; • P0 = dat; • delayNOP(); • LCD_EN = 1; • delayNOP(); • LCD_EN = 0; • }
相关主题