制作出来的实物图如下:
由于手边没有摄像头,就用电脑前置代替了,哈哈哈
51,面包板,继电器
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
labview软件
单片机源程序如下:
#include <reg52.h>#include "1602.h" #include "uart.h" #include "AM2301.h" #include "adc0832.h" #define RUN_CNT_MAX 2 #define MENU_NUM_LIMIT 3 uchar menu = 0; uchar Dat1,Dat2; uint Dat3; void Get_Dat(); void SendData(void);//串口发送函数声明 void LCD_display(void);//LCD1602显示函数声明 void delay_ms(int xms)//延时演示,1ms { unsigned char i; for( ; xms > 0; xms--) for(i = 110; i > 0; i--); } unsigned int Humidity = 0;//定义湿度变量 unsigned int Temperature = 0;//定义温度变量 void main() { RY1 = 0; RY2 = 0; RY3 = 0; RY4 = 0; RY5 = 0; RY6 = 0; RY7 = 0; //继电器初始状态为关闭 LCD1602_Init();//LCD1602初始化 uart_init(); //串口初始化 //LCD1602左侧显示温湿度对应字母 LCD1602_Write_String(0, 0, "SD:"); LCD1602_Write_String(0, 1, "WD:"); LCD1602_Write_String(8, 0, "CO2:"); LCD1602_Write_String(8, 1, "GZ:"); while(1) { Read_Sensor();//读取温湿度 if(Sensor_Data[2]&0x80)//如果温度为负值 { DHT_Negative_Flag = 1;//负值标志位为1 Sensor_Data[2]&=0x7F;//将不正宗的负数变为一个正常的正数,后续通过标志位来判断 } else { DHT_Negative_Flag = 0; } //将传感器数据数组中的数据重新组合得到温湿度的值,参见数据手册 Humidity = Sensor_Data[0]*256 + Sensor_Data[1]; Temperature = Sensor_Data[2]*256 + Sensor_Data[3]; Get_Dat(); SendData();//从串口发送数据 LCD_display();//LCD显示 delay_ms(2000);//延时2s,数据手册规定2秒查询一次 } } void Get_Dat() { static uint Run_Get_Cnt = RUN_CNT_MAX; if(Run_Get_Cnt++ > RUN_CNT_MAX) { Run_Get_Cnt = 0; Dat1 = adc0832(0); Dat2 = adc0832(1); Dat1 = Parse_Dat(Dat1,Adc_Pares_Percentage); Dat2 = Parse_Dat(Dat2,Adc_Pares_Percentage); LCD_display(); } } //串口发送数据函数 void SendData(void) { unsigned char i; SendByte(0xFF);//发送帧头 SendByte(DHT_Negative_Flag);//发送负数标志 for(i = 0; i < 4; i++)//发送传感器数据 { SendByte(Sensor_Data[i]); } SendByte(Dat1); SendByte(Dat2); SendByte(0xEE);//发送帧尾 } //LCD1602显示函数 void LCD_display(void) { //显示湿度 lcd_pos(3,0);//定位到第1行左数第7个位置 LCD1602_Write_Dat(Humidity/100 + 0x30);//显示xx百位 LCD1602_Write_Dat(Humidity%100/10 + 0x30);//显示xx十位 LCD1602_Write_Dat('.');//显示小数点 LCD1602_Write_Dat(Humidity%10+ 0x30);//显示xx个位 lcd_pos(12,0); LCD1602_Write_Dat(Dat1/10 + 0x30);//显示xx百位 LCD1602_Write_Dat(Dat1%10 + 0x30);//显示xx十位 LCD1602_Write_Dat('%');//显示小数点 lcd_pos(12,1); LCD1602_Write_Dat(Dat2/10 + 0x30);//显示xx百位 LCD1602_Write_Dat(Dat2%10 + 0x30);//显示xx十位 LCD1602_Write_Dat('%');//显示小数点 if(DHT_Negative_Flag == 1) { if(Temperature/100 == 0) //判断是否为三位数,不是则不显示百位 { lcd_pos(3,1);//定位到第2行左数第7个位置 LCD1602_Write_Dat(Temperature%100/10 + 0x30); LCD1602_Write_Dat('.'); LCD1602_Write_Dat(Temperature%10+ 0x30); } else { lcd_pos(2,1);//定位到第2行左数第6个位置 LCD1602_Write_Dat(Temperature/100 + 0x30); LCD1602_Write_Dat(Temperature%100/10 + 0x30); LCD1602_Write_Dat('.'); LCD1602_Write_Dat(Temperature%10+ 0x30); } } else { if(Temperature/100 == 0) { lcd_pos(4,1);//定位到第2行左数第8个位置 LCD1602_Write_Dat(Temperature%100/10 + 0x30); LCD1602_Write_Dat('.'); LCD1602_Write_Dat(Temperature%10+ 0x30); } else { lcd_pos(3,1);//定位到第2行左数第7个位置 LCD1602_Write_Dat(Temperature/100 + 0x30); LCD1602_Write_Dat(Temperature%100/10 + 0x30); LCD1602_Write_Dat('.'); LCD1602_Write_Dat(Temperature%10+ 0x30); } } }
复制代码