基于单片机的温湿度传感器课程设计 联系客服

发布时间 : 星期日 文章基于单片机的温湿度传感器课程设计更新完毕开始阅读44c9aecd70fe910ef12d2af90242a8956becaaa0

页 共 21 页 桂林电子科技大学课程设计(论文)报告用纸 第 21 第18页共23

}

void Display_hanzi(unsigned char row, unsigned char page,unsigned char c) //row:列 page:页 dd:字符 { unsigned char i; LCD_set_XY(row*6, page);// 列,页 for(i=0; i<12;i++) { LCD_write_byte(hanzi[c*24+i],1); }

LCD_set_XY(row*6, page+1);// 列,页 for(i=12; i<24;i++) { LCD_write_byte(hanzi[c*24+i],1); } }

//温湿度传感器部分程序如下:

/*-----------------------------------------------------------*/ //延时函数

void Delay_1ms(unsigned int ms) { unsigned int x, y; for(x = ms; x > 0; x--) { for(y = 124; y > 0; y--); } }

void DHT11_Delay_10us(void) { unsigned char i; i--; i--; i--; i--; i--; i--; }

/* 读一个字节的数据*/

桂林电子科技大学课程设计(论文)报告用纸

第第 22 19 页页 共共 22 23 页

unsigned char DHT11_ReadValue(void)

{ unsigned char count, value = 0, i; status = OK; //设定标志为正常状态 for(i = 8; i > 0; i--) //高位在先 { value <<= 1; count = 0; while(dht11 == 0 && count++ < NUMBER); //每一位数据前会有一个 50us 的低电平时间. 等待50us 低电平结束 if(count >= NUMBER) { status = ERROR; //设定错误标志 return 0; //函数执行过程发生错误就退出函数 } DHT11_Delay_10us(); //26-28us的高电平表示该位是 0, 为70us 高电平表该位 1 DHT11_Delay_10us(); DHT11_Delay_10us(); if(dht11 != 0) //延时30us 后检测数据线是否还是高电平 { value++; //进入这里表示该位是 1 while(dht11 != 0 && count++ < NUMBER) //等待剩余(约40us)的高电平结束 { dht11 = 1; } if(count >= NUMBER) { status = ERROR; //设定错误标志 return 0; } } }

return (value); }

// 读温度和湿度函数,读一次的数据, 共五字节,读出成功函数返回OK, 错误返回ERROR

unsigned char DHT11_ReadTempAndHumi(void) { unsigned char i = 0, check_value = 0,count = 0; dht11 = 0; //拉低数据线大于 18ms发送开始信号

页 共 23 页 桂林电子科技大学课程设计(论文)报告用纸 第 23 第20页共23

Delay_1ms(20); // 需大于 18 毫秒

dht11 = 1; //释放数据线, 用于检测低电平的应答信号 DHT11_Delay_10us(); //延时20-40us,等待一段时间后检测应答信号, 应答信号是从机拉低数据线80us DHT11_Delay_10us(); DHT11_Delay_10us(); DHT11_Delay_10us();

if(dht11 != 0) // 检测应答信号, 应答信号是低电平 { return ERROR; //没应答信号 }

else //有应答信号 { while(dht11 == 0 && count++ < NUMBER); // 等待应答信号结束 if(count >= NUMBER) //检测计数器是否超过了设定的范围 { dht11 = 1; return ERROR; //读数据出错, 退出函数 } count = 0; dht11 = 1; //释放数据线 while(dht11 != 0 && count++ < NUMBER); //应答信号后会有一个 80us 的高电平,等待高电平结束 if(count >= NUMBER) { dht11 = 1; return ERROR; //退出函数 } for(i = 0; i < SIZE; i++) //读出湿. 温度值 { value_array[i] = DHT11_ReadValue(); if(i != SIZE - 1) //读出的最后一个值是校验值不需加上去 { check_value += value_array[i]; //读出的五字节数据中的前四字节数据和等于第五字节数据表示成功 } } //end for if(check_value == value_array[SIZE - 1]) //在没用发生函数调用失败时进行校验 { dht11 = 1; return OK; //正确的读出 dht11输出的数据

桂林电子科技大学课程设计(论文)报告用纸

第 24 21 页 共 24 23 页

}

} }

void Display_5110(unsigned char value,unsigned char h,unsigned char l) { unsigned char s,g; s=value/10; g=value; Display_zimu(h,l,s) ; Display_zimu(h+1,l,g) ;

}

void main() { unsigned char i; res=0; delay_us(100); res=1; LCD_init(); //初始化LCD模块 LCD_clear(); //清屏幕 Display_hanzi(0,2,6) ; //显示 温度: . ℃ Display_hanzi(2,2,8) ; Display_zimu(4,2,10) ; Display_zimu(8,2,11) ; Display_hanzi(10,2,15) ; Display_hanzi(0,4,7) ; //显示 湿度: . % Display_hanzi(2,4,8) ; Display_zimu(4,4,10) ; Display_zimu(8,4,11) ; Display_hanzi(10,4,16) ; Display_zimu(12,4,13) ; Display_zimu(13,4,14) ; while(1) { DHT11_ReadTempAndHumi(); Display_5110( value_array[0], 6, 4); // Display_5110( value_array[1], 9, 4); Display_5110( value_array[2], 6, 2); // Display_5110( value_array[3], 9, 2); Delay_1ms(500);