基于单片机的环境温度湿度检测仪课程设计 - 图文 联系客服

发布时间 : 星期六 文章基于单片机的环境温度湿度检测仪课程设计 - 图文更新完毕开始阅读

{

unint8 i; i--; i--; i--; i--; i--; i--; }

bit lcd_busy() {

bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delayNOP();

result = (bit)(P0&0x80); LCD_EN = 0; return(result); }

void 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 lcd_wdata(unsigned char dat) { while(lcd_busy()); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; delayNOP();

13

LCD_EN = 1; delayNOP(); LCD_EN = 0; }

void lcd_init() {

delay_ms(15);

lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据 delay_ms(5);

lcd_wcmd(0x38); delay_ms(5);

lcd_wcmd(0x38); delay_ms(5);

lcd_wcmd(0x0c); //显示开,关光标 delay_ms(5);

lcd_wcmd(0x06); //移动光标 delay_ms(5);

//lcd_wcmd(0x01); //清除LCD的显示内容,如果屏幕过暗,可将这俩句删除

//delay_ms(5); }

void lcd_dis_pos(unsigned char pos) {

lcd_wcmd(pos | 0x80); //数据指针=80+地址变量 }

char receive() {

unint8 i; ST=0;

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++);

14

} else

temp=0; com_data<<=1;

com_data|=temp; }

return(com_data); }

void read_TRH() {

//主机拉低18ms TRH=0;

delay_ms(18); TRH=1;

//DATA总线由上拉电阻拉高 主机延时20us delay_us(); delay_us(); delay_us(); delay_us(); //delay_us();

//delay_us();delay_us();delay_us();delay_us(); //主机设为输入 判断从机响应信号 TRH=1;

//判断DHT11是否有低电平响应信号 如不响应则跳出,响应则向下运行

if(!TRH) {

respond=2;

//判断DHT11发出 80us 的低电平响应信号是否结束 while((!TRH)&& respond++); respond=2;

//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态

while(TRH && respond++); //数据接收状态

RH_temp = receive(); RL_temp = receive(); TH_temp = receive(); TL_temp = receive(); CK_temp = receive(); TRH=1;ST=1; //数据校验

untemp=(RH_temp+RL_temp+TH_temp+TL_temp); if(untemp==CK_temp)

15

{

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); str1[2] = 0x2e; //小数点 //湿度小数部分

str1[3] = (char)(0X30+RL_data/10); str1[5] = 0X25; //\ str1[6] = 0X52; //\ str1[7] = 0X48; //\ //温度整数部分

str2[0] = (char)(0X30+TH_data/10); str2[1] = (char)(0X30+TH_data); str2[2] = 0x2e; //小数点 //温度小数部分

str2[3] = (char)(0X30+TL_data/10); str2[5] = 0XDF; //\ str2[6] = 0X43; //\}

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(n+i); //显示字符 lcd_wdata(dis2[i]);

lcd_dis_pos(i); //显示字符 lcd_wdata(dis1[i]);

}

//写湿度数据

16