分享一下零基础菜鸡一个寒假的作品

制作出来的实物图如下:
image.png
由于手边没有摄像头,就用电脑前置代替了,哈哈哈
image.png
51,面包板,继电器

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
image.png

image.png
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);
  •         }
  •     }
  • }
  • 复制代码