基于51单片机SHT11温湿度传感器检测程序
基于51单片机的DHT11温湿度系统(已调试成功,无需置疑)
/*系统名:基于51单片机的DHT11温湿度系统系统使用说明:通过无线蓝牙进行数据传输,上位机需通过蓝牙调试软件向系统发送命令获取信息,若要获取当前温度、湿度,则发送“?Z”即可。
系统将会自动回复当前温度和湿度。
注意事项:蓝牙需设置成主从模式(即通过AT命令设置蓝牙名和密码相同,再设置成主从模式)蓝牙灯同步闪烁代表蓝牙连接成功。
*/#include "reg51.h"# include <intrins.h>typedef unsigned char BYTE;typedef unsigned int WORD;#define uint unsigned int#define uchar unsigned char/************辅助全局变量块*****************/char t,buf[6],buf_cnt;bit sec,flag,send_flag;/*sec:秒信号;flag:串行口接收到命令标志;send_flag:回复数据标志*//************辅助全局变量块*****************//*************DHT11变量块*******************/sbit io=P3^2; //DHT11数据端接单片机的P3^2口typedef bit BOOL;//此声明一个布尔型变量即真或假uchar data_byte;uchar RH,RL,TH,TL; //TH保存温度,RH保存湿度/*************DHT11变量块*******************///*******************************延时函数*******************************************void delay(uchar ms){uchar i;while(ms--)for(i=0;i<100;i++);}void delay1()//一个for循环大概需要8个多机器周期 一个机器周期为1us 晶振为12MHz 也就是说本函数延时8us多 此延时函数必须德稍微精确一点{uchar i;for(i=0;i<1;i++);}void delay1ms(char t){int i,j;for(i=0;i<t;i++)for(j=0;j<1000;j++);}//***************************延时函数*****************************************//**************************DHT11模块***************************************** void start()//开始信号{io=1;delay1();io=0;delay(25);// 主机把总线拉低必须大于18ms 保证DHT11能检测到起始信号io=1; //发送开始信号结束后 拉高电平延时20-40usdelay1();//以下三个延时函数差不多为24us 符合要求delay1();delay1();}uchar receive_byte()//接收一个字节//{uchar i,temp;for(i=0;i<8;i++)//接收8bit的数据{while(!io);//等待50us的低电平开始信号结束delay1();//开始信号结束之后 延时26us-28us 以下三个延时函数delay1();delay1();temp=0;//时间为26us-28us 表示接收的为数据'0'if(io==1)temp=1; //如果26us-28us之后 还为高电平 则表示接收的数据为'1'while(io);//等待数据信号高电平 '0'为26us-28us '1'为70usdata_byte<<=1;//接收的数据为高位在前 右移data_byte|=temp;}return data_byte;}void receive()//接收数据{uchar T_H,T_L,R_H,R_L,check,num_check,i;start();//开始信号//io=1; //主机设为输入 判断从机 DHT11 响应信号if(!io)//判断从机是否有低电平响应信号//{while(!io);//判断从机发出 80us 的低电平响应信号是否结束//while(io);//判断从机发出 80us 的高电平是否结束 如结束则主机进入数据接收状态R_H=receive_byte();//湿度高位R_L=receive_byte();//湿度低位T_H=receive_byte();//温度高位T_L=receive_byte();//温度低位check=receive_byte();//校验位io=0; //当最后一bit数据接完毕后 从机拉低电平50us//for(i=0;i<7;i++)//差不多50us的延时delay1();io=1;//总线由上拉电阻拉高 进入空闲状态num_check=R_H+R_L+T_H+T_L;if(num_check==check)//判断读到的四个数据之和是否与校验位相同{RH=R_H;RL=R_L;TH=T_H;TL=T_L;check=num_check;}}}//***************************DHT11模块**********************************//**************************中断服务函数块*******************************void ComSer() interrupt 4 //串行口中断服务函数(串口数据接收){if(RI){t=SBUF;buf[buf_cnt++]=t;RI=0;if(t=='Z'){flag=1;buf_cnt=0;}}}//********************************中断服务函数********************************* //************************串行口字符(字符串)发送块************************** void putchar(unsigned char n){SBUF=n;while(!TI);TI=0;}void puts(unsigned char *q){while(*q)putchar(*q++);}void Enter() //换行函数{putchar(0x0d);putchar(0x0a);}void DispNum(unsigned char n){unsigned char t[8]={0};t[0]=n/10+'0';t[1]=n%10+'0';t[2]=0;puts(t);Enter();}//************************串行口字符(字符串)发送块*****************//********************************串行口请求判断块********************void Dill(){if(buf[0]=='?'){delay1ms(50);send_flag=1;}}//********************************串行口请求判断块**************************** //********************************初始化函数块***************************void init_com() //寄存器初始化函数{SCON=0x50; //串行口工作方式0,多机通信,允许接收IE|=0X90; //定时器T1和总中断允许PCON=0X80; //SMOD为1TMOD|=0X21; //T1工作在方式2,T0工作在方式1TH1=250; //T1高八位赋值TR1=1; //T1打开TR0=1; //T0关闭}//********************************初始化函数块*********************void main(){init_com();while(1){receive(); //读取温湿度if(send_flag)//接收到询问{send_flag=0;puts("Wendu:");DispNum(TH);puts("Shidu:");DispNum(RH);Enter();}if(flag){flag=0;ES=0;Dill();ES=1;}}}。
基于51单片机SHT11温湿度传感器检测程序
基于51单片机SHT11温湿度传感器检测程序(含电路图)下面是原理图:下面是SHT11与MCU连接的典型电路:下面是源代码:#include <reg52.h>#include <intrins.h>/******************************************************** 宏定义********************************************************/ #define uint unsigned int#define uchar unsigned char#define noACK 0#define ACK 1#define STATUS_REG_W 0x06#define STATUS_REG_R 0x07#define MEASURE_TEMP 0x03#define MEASURE_HUMI 0x05#define RESET 0x1eenum {TEMP,HUMI};typedef union //定义共用同类型{unsigned int i;float f;} value;/******************************************************** 位定义********************************************************/ sbit lcdrs=P2^0;sbit lcdrw=P2^1;sbit lcden=P2^2;sbit SCK = P1^0;sbit DATA = P1^1;/******************************************************** 变量定义********************************************************/ uchar table2[]="SHT11 温湿度检测";uchar table3[]="温度为:℃";uchar table4[]="湿度为:";uchar table5[]=".";uchar wendu[6];uchar shidu[6];/******************************************************** 1ms延时函数********************************************************/ void delay(int z){int x,y;for(x=z;x>0;x--)for(y=125;y>0;y--);}/******************************************************** 50us延时函数********************************************************/ void delay_50us(uint t){uint j;for(;t>0;t--)for(j=19;j>0;j--);}/******************************************************** 50ms延时函数********************************************************/ void delay_50ms(uint t){uint j;for(;t>0;t--)for(j=6245;j>0;j--);}/******************************************************** 12864液晶写指令********************************************************/ void write_12864com(uchar ){lcdrs=0;delay_50us(1);P0=;lcden=1;delay_50us(10);lcden=0;delay_50us(2);}/******************************************************** 12864液晶写数据********************************************************/ void write_dat(uchar dat){lcdrs=1;lcdrw=0;delay_50us(1);P0=dat;lcden=1;delay_50us(10);lcden=0;delay_50us(2);}/******************************************************** 12864液晶初始化********************************************************/ void init12864lcd(void){delay_50ms(2);write_12864com(0x30);delay_50us(4);write_12864com(0x30);delay_50us(4);write_12864com(0x0f);delay_50us(4);write_12864com(0x01);delay_50us(240);write_12864com(0x06);delay_50us(10);write_12864com(0x0c);delay_50us(10);}/********************************************************12864液晶显示函数********************************************************/ void display1(void){uchar i;write_12864com(0x80);for(i=0;i<18;i++){write_dat(table2[i]);delay_50us(1);}}/******************************************************** 12864液晶显示函数********************************************************/ void display2(void){uchar i;write_12864com(0x90);for(i=0;i<18;i++){write_dat(table3[i]);delay_50us(1);}}/******************************************************** 12864液晶显示函数********************************************************/ void display3(void){uchar i;write_12864com(0x88);for(i=0;i<8;i++){write_dat(table4[i]);delay_50us(1);}}/******************************************************** 12864液晶显示函数********************************************************/void displaywendu(void) {uchar i;write_12864com(0x94); for(i=0;i<3;i++){write_dat(wendu[i]); delay_50us(1);}for(i=0;i<1;i++){write_dat(table5[i]); delay_50us(1);}for(i=4;i<5;i++){write_dat(wendu[i]); delay_50us(1);}}/******************************************************** 12864液晶显示函数********************************************************/ void displayshidu(void){uchar i;write_12864com(0x8C);for(i=0;i<3;i++){write_dat(shidu[i]);delay_50us(1);}for(i=0;i<1;i++){write_dat(table5[i]);delay_50us(1);}for(i=4;i<5;i++){write_dat(shidu[i]);delay_50us(1);}}/******************************************************** SHT11写字节程序********************************************************/ char s_write_byte(unsigned char value){unsigned char i,error=0;for (i=0x80;i>0;i>>=1) //高位为1,循环右移{if (i&value) DATA=1; //和要发送的数相与,结果为发送的位else DATA=0;SCK=1;_nop_();_nop_();_nop_(); //延时3usSCK=0;}DATA=1; //释放数据线SCK=1;error=DATA; //检查应答信号,确认通讯正常_nop_();_nop_();_nop_();SCK=0;DATA=1;return error; //error=1 通讯错误}/******************************************************** SHT11读字节程序********************************************************/ char s_read_byte(unsigned char ack){unsigned char i,val=0;DATA=1; //释放数据线for(i=0x80;i>0;i>>=1) //高位为1,循环右移{SCK=1;if(DATA) val=(val|i); //读一位数据线的值SCK=0;}DATA=!ack; //如果是校验,读取完后结束通讯 ;SCK=1;_nop_();_nop_();_nop_(); //延时3usSCK=0;_nop_();_nop_();_nop_();DATA=1; //释放数据线return val;}/******************************************************** SHT11启动传输********************************************************/ void s_transstart(void){DATA=1; SCK=0; //准备_nop_();SCK=1;_nop_();DATA=0;_nop_();SCK=0;_nop_();_nop_();_nop_();SCK=1;_nop_();DATA=1;_nop_();SCK=0;}/********************************************************SHT11连接复位********************************************************/void s_connectionreset(void){unsigned char i;DATA=1; SCK=0; //准备for(i=0;i<9;i++) //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位{SCK=1;SCK=0;}s_transstart(); //启动传输}/********************************************************SHT11温湿度检测********************************************************/char s_measure(unsigned char *p_value, unsigned char *p_checksum,unsigned charmode){unsigned error=0;unsigned int i;s_transstart(); //启动传输switch(mode) //选择发送命令{case TEMP : error+=s_write_byte(MEASURE_TEMP); break; //测量温度case HUMI : error+=s_write_byte(MEASURE_HUMI); break; //测量湿度default : break;}for (i=0;i<65535;i++) if(DATA==0) break; //等待测量结束if(DATA) error+=1; // 如果长时间数据线没有拉低,说明测量错误*(p_value) =s_read_byte(ACK); //读第一个字节,高字节(MSB)*(p_value+1)=s_read_byte(ACK); //读第二个字节,低字节(LSB)*p_checksum =s_read_byte(noACK); //read CRC校验码return error; // error=1 通讯错误}/********************************************************SHT11温湿度值标度变换及温度补偿********************************************************/void calc_sth10(float *p_humidity ,float *p_temperature){const float C1=-4.0; // 12位湿度精度修正公式const float C2=+0.0405; // 12位湿度精度修正公式const float C3=-0.0000028; // 12位湿度精度修正公式const float T1=+0.01; // 14位温度精度5V条件修正公式const float T2=+0.00008; // 14位温度精度5V条件修正公式float rh=*p_humidity; // rh: 12位湿度float t=*p_temperature; // t: 14位温度float rh_lin; // rh_lin: 湿度linear值float rh_true; // rh_true: 湿度ture值float t_C; // t_C : 温度℃t_C=t*0.01 - 40; //补偿温度rh_lin=C3*rh*rh + C2*rh + C1; //相对湿度非线性补偿rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //相对湿度对于温度依赖性补偿if(rh_true>100)rh_true=100; //湿度最大修正if(rh_true<0.1)rh_true=0.1; //湿度最小修正*p_temperature=t_C; //返回温度结果*p_humidity=rh_true; //返回湿度结果}/********************************************************主函数********************************************************/void main(void){unsigned int temp,humi;value humi_val,temp_val; //定义两个共同体,一个用于湿度,一个用于温度unsigned char error; //用于检验是否出现错误unsigned char checksum; //CRCinit12864lcd();display1();display2();display3();s_connectionreset(); //启动连接复位while(1){error=0; //初始化error=0,即没有错误error+=s_measure((unsigned char*)&temp_val.i,&checksum,TEMP); //温度测量error+=s_measure((unsigned char*)&humi_val.i,&checksum,HUMI); //湿度测量if(error!=0) s_connectionreset(); ////如果发生错误,系统复位else{humi_val.f=(float)humi_val.i; //转换为浮点数temp_val.f=(float)temp_val.i; //转换为浮点数calc_sth10(&humi_val.f,&temp_val.f); //修正相对湿度及温度temp=temp_val.f*10;humi=humi_val.f*10;wendu[0]=temp/1000+'0'; //温度百位wendu[1]=temp%1000/100+'0'; //温度十位wendu[2]=temp%100/10+'0'; //温度个位wendu[3]=0x2E; //小数点wendu[4]=temp%10+'0'; //温度小数点后第一位displaywendu();shidu[0]=humi/1000+'0'; //湿度百位shidu[1]=humi%1000/100+'0'; //湿度十位shidu[2]=humi%100/10+'0'; //湿度个位shidu[3]=0x2E; //小数点shidu[4]=humi%10+'0'; //湿度小数点后第一位displayshidu();}delay(800); //等待足够长的时间,以现行下一次转换}}相关手册资料及源码下载地址:基于51单片机SHT11温湿度传感器检测程序相关资料。
SHT11温湿度传感器AVR单片机程序
BITCLR(SHTXX_DAT_DDR, SHTXX_DAT_BIT);
if (BITCHK(SHTXX_DAT_PIN, SHTXX_DAT_BIT)) error += 1;
shtxx_humi = shtxx_read_byte(1);
}
else
{
SHTXX_DAT_1();
SHTXX_SCK_HIGH(); SHTXX_SCK_LOW();
}
SHTXX_DAT_1();
return dat8;
}
shtxx_temp = shtxx_read_byte(1);
shtxx_temp = (shtxx_temp << 8) + shtxx_read_byte(1);
shtxx_crc = shtxx_read_byte(0);
{
bcd32[5]++;
hex32 = hex32 - 100000;
}
while (hex32 >= 10000) //
{
bcd32[4]++;
hex32 = hex32 - 10000;
SHT11温湿度传感器AVR单片机程序
[日期:2010-09-12 ] [来源:本站原创 作者:佚名] [字体:大 中 小] (投递新闻)
#include "shtxx.h"
void shtxx_init(void)
{
shtxx_temp = shtxx_humi = 0;
SHTXX_SCK_HIGH();
ack = BITCHK(SHTXX_DAT_PIN, SHTXX_DAT_BIT);
基于51单片机的温湿度DHT11采集(word文档良心出品)
一.设计目的温湿度控制系统早己经成为当今社会研究的热门领域之一,同时温湿度也是现今工农业生产生活中必须要首先考虑的崑要因素之一。
因此现今社会生产生活中就迫切需要一种价格便宜、容易操作而且精确度高的温湿度控制系统。
本系统设计就是利用AT89C52单片机对温湿度参最进行•检测进而实现对温湿度参量的控制。
本系统设计通过使用AT89C52单片机、DHT11传感器模块、LCD 1602 液晶显示屏模块以及LED闪烁和蜂鸣器报警模块。
简单的系统设计就可以基本上满足本系统设计的系统设计耍求。
DHTU数字温湿度传感器负责把采集到的温湿度信号传送给AT89C52单片机。
温湿度经过AT89C52单•片机处理,然后AT89C52准确地把温湿度信号发送到LCD1602液晶显示屏模块, 温湿度数据就可以准确地显示到LCD1602液晶屏上面,同时我们可以分别对温度和湿度设置上下限,越限LED闪烁和蜂鸣器报警模块。
二.设计要求和方案选择・LCD1602能够实时、准确的显示AT89C52采样温度值和湿度值,显示设定报警的温度和风扇的状态。
・DHT11采集温度及湿度值,AT89C52能够将DHT11输送过來的采集信息,准确的判断标准值与设定值之间的差异,及吋的启动报警装置(LED闪烁和蜂鸣器)进行报警。
•根据采集温湿度的数据进行判断,控制继电器进行风扇的开闭传感器选择方案•方案一:利用两个传感器分别检测温度和湿度值,温度检测模块选用DS18B20温度传恋器(+-0.5°C)o湿度检测模块选用HS1101电容式湿度传感器(+-5%RH) o这两款传感器都是我们大学实践电子设计中非常常见和常用的传感器。
•方案二:检测温湿度数值选用DHT11传感器作为系统设计的温湿度检测模块。
DHT11传感器能够同时对温度和湿度数值进行检测,而且其精确度能过完全满足本课程设计的精度要求。
湿度、温度测量误差:+-5%> +-2度•经过上述分析,方案一虽然精度更精确。
基于51单片机的DHT11湿度1602显示c程序
#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit lcden=P2^7;sbit lcdrw=P2^5;sbit lcdrs=P2^6;sbit DHT11_IO=P3^7;uint x,y,t;uchar code table[]="0123456789"; void Delay1()//延时10us{uchar i;i--;i--;i--;i--;i--;i--;}void Delay2(uchar ms){ // 延时子程序uchar i ;while(ms--){for(i = 0 ; i<250;i++) ;}}void mDelay(uchar delay){uchar i;for(;delay>0;delay--){for(i=123;i>0;i--);}}void delay(uint z){for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com){lcdrs=0;lcdrw=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void init(){write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);}void write_data(uchar dat){lcdrs=1;lcdrw=0;P0=dat;delay(5);lcden=1;delay(5);lcden=0;}void start(void)//开始信号{DHT11_IO=1;Delay1();DHT11_IO=0;Delay2(20);//>18msDHT11_IO=1;Delay1();//20-40usDelay1();Delay1();Delay1();Delay1();}uchar receive_byte(void)//接收一个字节{uchar i,temp,count,data_byte;for(i=0;i<8;i++){while(!DHT11_IO);//等待50us低电平结束temp=0;Delay1();Delay1();Delay1();Delay1();if(DHT11_IO==1)temp=1;while(DHT11_IO);data_byte<<=1;data_byte|=temp;}return data_byte;}void receive()//接收数据{uchar check,num_check,HZ,HX,WZ,WX;start();//开始信号DHT11_IO=1;if(!DHT11_IO)//读取DHT11响应信号{while(!DHT11_IO);//DHT11高电平80us是否结束while(DHT11_IO);HZ = receive_byte();HX = receive_byte();WZ = receive_byte();WX = receive_byte();check = receive_byte();DHT11_IO=0;//拉低延时50usDHT11_IO=1;num_check = HZ + HX + WZ + WX;if(num_check = check){check = num_check;}}write_com(0x80);write_data(table[HZ/10]);write_data(table[HZ%10]);write_data('.');write_data(table[HX/10]);write_data(table[HX%10]);write_data('R');write_data('H');write_data('%');// write_com(0x80+0x40);// write_data(table[WZ/10]); // write_data(table[WZ%10]); // write_data('.');// write_data(table[WX/10]); // write_data(table[WX%10]); // write_data('T');}void main(){init();while(1){receive();}}。
DHT11温湿度传感器驱动程序 C51单片机
/**************DHT11 简单应用显示在数码管上(我的数码管是两个74HC595 不懂的可以问我)*********************************建议显示在液晶上******************/#include<reg52.h>#include<intrins.h>char T_H1,T_L1,RH_H1,RH_L1,checkdata1;char T_H2,T_L2,RH_H2,RH_L2,checkdata2;char F16T,F16RH,tshi,tge,rhshi,rhge;sbit DHT11 = P2^1;uchar bdata output;uchar location,j,i,ge,shi;uint num=0,num1,num2;uchar code segment[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77, /*共阴7段LED段码表*/0x7c,0x39,0x5e,0x79,0x71,0x76,0x73,0x3e,0x00};sbit srclk=P4^2;sbit rclk = P4^1;sbit ser = P4^4;sbit out_put= output^7;/*传感器接受数据的响应命令*/void delay(uint x);void Delay32us();void Delay22ms();void Delay500ms();void shumaguan(uchar wei,uchar duan){output = wei;for(j=0;j<8;j++) //位码{ser = out_put;srclk=0;srclk=1;srclk=0;output = _crol_(output,1);}output = duan; //段码for(j=0;j<8;j++){ser=out_put;srclk=0;srclk=1;srclk=0;output = output<<1;}rclk=0;rclk=1;rclk=0;}void shuru(){num=0;while(num<1000){shumaguan(0x01,~segment[tshi]);shumaguan(0x02,~segment[tge]);shumaguan(0x10,~segment[rhshi]);shumaguan(0x20,~segment[rhge]);shumaguan(0,~segment[19]);}}char COM(void){char i,temp,comdata;/**判断信号时0还是1**/for(i=0;i<8;i++){while(!DHT11);Delay32us();temp=0;if(DHT11){temp=1;}//当DHT11变为低电平时,开始下bit 的传送comdata = comdata<<1;comdata = comdata|temp;while(DHT11);}return comdata;}/***主机的开始信号和从机的响应信号***//***********DHT11的主函数*********************/void getDHT11(){DHT11=0;Delay22ms(); //主机拉低22msDHT11=1;Delay32us(); //总线由上拉电阻拉高主机延时20-40us //判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行if(!DHT11) //T !{//判断从机是否发出80us 的低电平响应信号是否结束while(!DHT11);//判断从机是否发出80us 的高电平,如发出则进入数据接收状态while(DHT11);/*****接收数据的命令每次传送八位******/RH_H1 = COM();RH_L1 = COM();T_H1 = COM();T_L1 = COM();checkdata1 = COM();if(T_H1+T_L1+RH_H1+RH_L1==checkdata1){RH_H2 = RH_H1;RH_L2 = RH_L1;T_H2 = T_H1;T_L2 = T_L1;F16RH = RH_H2+RH_L2/1000;F16T = T_H2+T_L2/1000;tshi = F16T/10;tge = F16T%10;rhshi = F16RH/10;rhge = F16RH%10;}}}/************主函数*************/void main(){EA = 1 ;ET0= 1;TR0 = 1;TMOD = 0X01;TH0 = (65536-1000)/256;TL0 = (65536-1000)%256;while(1){DHT11=0;getDHT11();shuru();}}/**********延时子程序************************/void time1() interrupt 1 //延时20微秒{TH0 = (65536-1000)/256;TL0 = (65536-1000)%256;num=num+1;num1=num1+1;num2=num2+1;}void Delay32us() //@12.000MHz{unsigned char i;_nop_();_nop_();i = 93;while (--i);}void Delay22ms() //@12.000MHz{unsigned char i, j, k;_nop_();_nop_();i = 2;j = 1;k = 201;do{do{while (--k);} while (--j);} while (--i);}/*******************************/。
51单片机+DHT11温控程序-可设置温度值
51单片机+DHT11温控程序-可设置温度值基于51 单片机的温湿度测量控制程序,使用DHT11 数字传感器,用1602液晶屏显示,按键定义如下:sbit key_1=P0;//确定按键sbit key_2=P0 ; //按键加sbit key_3=P0;//按键减本程序中用到的头文件12c5a.h 下载:51hei/f/12c5a.rar#include “12c5a.H”#include“intrins.h”unsigned char code num[]={“0123456789”};//显示字符存储unsigned char code start_char[]={“Loading....”};unsigned char code t_char[]={“NOW TEMP IS”};unsigned char *pnum=num;unsigned int bbb,ccc,temp,temp_high,temp_low;#define ADC_POWER 0x80 //ADC power control bit#define ADC_FLAG 0x10 //ADC completeflag#define ADC_START 0x08 //ADC start control bit#define ADC_SPEEDLL 0x00 //540 clocks#define ADC_SPEEDL 0x20 //360 clocks#define ADC_SPEEDH 0x40 //180 clocks#define ADC_SPEEDHH 0x60 //90 clockssbit RS=P3;//数据命令选择端sbit RW=P3 ; //读写控制端sbit E=P3;//使能信号控制端//sbit key_0=P0; //设置按键sbit key_1=P0;//确定按键sbitkey_2=P0 ; //按键加sbit key_3=P0;//按键减sbit P04=P0;sb it P05=P0 ;sbitP06=P0;void key_temphigh();void key_templow();void key_scan();void delay_1602(unsigned int a);void init_1602(void);void WR_data_1602(unsigned char adata,unsigned char i);void process(unsigned int shuju);void Delay(unsigned char n){ int x; while (n--) { x = 500; while (x--); }}void init_ADC(void){P1ASF=0xFF;ADC_RES = 0;ADC_RESL = 0;ADC_CONTR = 0x88;Delay(2);}unsigned int GetResult(void){unsigned char m,n;unsigned int aaa; init_ADC();。
基于51系列单片机仓库温湿度的实时监测系统设计
毕业设计有关说明一、温度传感器的选择、湿度传感器的选择、系统总体设计1. 温度传感器的选择采用AD590,它的测温范围在-55℃~+150℃之间,而且精度高。
M档在测温范围内非线形误差为±0.3℃。
AD590可以承受44V正向电压和20V反向电压,因而器件反接也不会损坏,使用可靠。
它只需直流电源就能工作,而且,无需进行线性校正,所以使用也非常方便,借口也很简单。
作为电流输出型传感器的一个特点是,和电压输出型相比,它有很强的抗外界干扰能力。
2.湿度传感器的选择采用HS1100/HS1101湿度传感器。
HS1100/HS1101电容传感器,在电路构成中等效于一个电容器件,其电容量随着所测空气湿度的增大而增大。
不需校准的完全互换性,高可靠性和长期稳定性,快速响应时间,专利设计的固态聚合物结构,由顶端接触(HS1100)和侧面接触(HS1101)两种封装产品,适用于线性电压输出和频率输出两种电路,适宜于制造流水线上的自动插件和自动装配过程等。
相对湿度在1%---100%RH范围内;电容量由16pF变到200pF,其误差不大于±2%RH;响应时间小于5S;温度系数为0.04 pF/℃。
可见精度是较高的。
3.总体设计系统整体框图二、系统联调的有关说明1. AD590应用电路AD590应用电路2. 主程序流程图时间过的很快,一晃大学几年的生活已接近了尾声在目,当初还是刚进大学的懵懂少年现在也长大了学到了很多,也懂得了很多。
随着毕业日子的到,毕业设计也接近了尾声。
经过两个月的奋战我的毕业设计终于完成了。
在没有做毕业设计以前觉得毕业设计只是对这几年来所学知识的单纯总结,但是通过这次做毕业设计发现自己的看法有点太片面。
毕业设计不仅是对前面所学知识的一种检验,而且也是对自己能力的一种提高。
通过这次毕业设计使我明白了自己原来知识还比较欠缺。
自己要学习的东西还太多,以前老是觉得自己什么东西都会,什么东西都懂,有点眼高手低。
基于51单片机的DHT11温湿度传感器
w8h_temp=com();
w8l_temp=com();
check8_temp=com();
dth=1;
if((s8h_temp+s8l_temp+w8h_temp+w8l_temp)==check8_temp) //校验
{
s8h=s8h_temp;
s8l=s8l_temp;
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void Delay_10us()//进入函数3us
{
uchar i;//每条语句1us
i--;
i--;
i--;
i--;
i--;
i--;
}
void display(uchar th,uchar tl)
{
uchar ih=0,il=0,jh=0,jl=0,kh=0,kl=0;
{
flag=2;
while((!dth)&&(flag++)); //等待拉高
//Delay_10us();
//Delay_10us();
//Delay_10us();
j=3;while(j--);//延时30us
temp=0;
if(dth==1)temp=1;
flag=2;
while(dth&&(flag++));//等待拉低
基于
#include<reg52.h>
#include<stdio.h>
#define uchar unsigned char
温湿度DHT11 51程序
while((!P2_0)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(P2_0)U8temp=1;
U8FLAG=2;
//----------------------------------------------//
sbit P2_0 = P2^0 ;
//----------------------------------------------//
//----------------定义区--------------------//
//----校验 8位 == U8checkdata-----
//----调用相关子程序如下----------
//---- Delay();, Delay_10us();,COM();
//--------------------------------
void RH(void)
i--;
i--;
i--;
}
void COM(void)
{
U8 i;
for(i=0;i<8;i++)
{
U8 U8comdata;
U8 outdata[5]; //定义发送的字节数
U8 indata[5];
U8 count, count_r=0;
U8 str[5]={"RS232"};
U16 U16temp1,U16temp2;
SendData(U8 *a)
C51_温湿度传感器DHT11驱动_LCD1602显示程序
DHT11.c 文件#include<reg52.h>#include<Time_Delay.h>//the main only needs to call getDHT11(),then the temperature and huminity was geted in//F16T,F16RH as floatsbit bit11=P2^0;unsigned char U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;//用于最终读取的温湿度数据// read 8 bits onicechar COM(void){char i,U8temp,U8comdata;for(i=0;i<8;i++) {while(!bit11); //表示读取的高电位延时大于20多us则读取的是1否则读取的是//通过U8FLAG可判断Delay_us(35);U8temp=0;if(bit11)U8temp=1;while(bit11);U8comdata<<=1;U8comdata|=U8temp; //0 }//rofreturn U8comdata;}//--------------------------------//-----温湿度读取子程序------------ //-------------------------------- //----以下变量均为全局变量-------- //----温度高8位== U8T_data_H------ //----温度低8位== U8T_data_L------ //----湿度高8位== U8RH_data_H----- //----湿度低8位== U8RH_data_L----- //----校验8位== U8checkdata----- //----调用相关子程序如下---------- //---- Delay();, Delay_10us();,COM();//--------------------------------void getDHT11(void) {//主机拉低18msGO1:bit11=0;Delay_ms(20);bit11=1;//总线由上拉电阻拉高主机延时20usDelay_us(60);//主机设为输入判断从机响应信号 //bit11=1;//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行if(!bit11) {while(!bit11);while(bit11); //数据接收状态//T !//wait DHT goto highU8RH_data_H=COM();U8RH_data_L=COM();U8T_data_H=COM();U8T_data_L=COM();U8checkdata=COM();bit11=1; //数据校验if((U8T_data_H+U8T_data_L+U8RH_data_H+U8RH_data_L)!=U8checkdata) //If check wrong,read againgoto GO1; }//fiF16T=U8T_data_H+(float)U8T_data_L/256; //change integer to floatF16RH=U8RH_data_H+(float)U8RH_data_L/256;}LCD1602 文件#include<reg52.h>#include <stdio.h>#include <INTRINS.H>#include <Lcd_1602.h>#include <Time_Delay.h>#define LCD_DATA P0#define uint unsigned int#define uchar unsigned char/*只由主函数调用的有 Init_Lcd()LCD_write_str(uchar X,uchar Y,uchar *s) //LCD1602 data transfer defineLCD_value(unsigned char x,unsigned char y,float f)*/sbit LCD_RS = P2^5;sbit RW = P2^6;sbit LCD_E = P2^7;//1602 control define/***************************************************************************//显示开//显示关#define LCD_CURSOR_ON 0x0A //显示光标//无光标 //有光标,光标闪动 //有光标,光标不闪动//进入模式设置指令//新数据后光标右移//新数据后光标左移 //画面可平移 //画面不可平移//设定显示屏或光标移动方向指令//光标左移1格,且AC值减1 //光标右移1格,且AC值加1//显示器上字符全部左移一格,但光标不动 //显示器上字符全部右移一格,但光标不动***************************************************************************/ //注有主函数调用的函数都已作说明其他函数一般不由主函数调用/*****************************************************************************名*功称:Init_Lcd()主函数调用能:Lcd初始化 *入口参数:无 *出口参数:无 *范例:在主函数中直接调用****************************************************************************///LCD初始化{LCD_write_char(0x38,0); Delay_ms(1);LCD_write_char(0x38,0); Delay_ms(1);LCD_write_char(0x38,0); Delay_ms(1);LCD_write_char(0x0c,0); Delay_ms(1);LCD_write_char(0x06,0); Delay_ms(1);LCD_write_char(0x0c,0); Delay_ms(1); //}/************************名*功称:LCD_write_str(uchar X,uchar Y,uchar *s)主函数调用能:在指定地址写一个字符串eg:Y=0,1,2,3,4,5,6,7,8,9,10...15。
基于51单片机的HS1101湿度采集
作者:***硬件电路程序#includ e<reg52.h> #includ e<intrin s.h>#define uint unsign ed int#define uchar unsign ed char#define ulongi nt unsign ed long intsbit D0=P1^0; //将D0位定义为P1.0引脚uint code tab[2][11]={0,10,20,30,40,50,60,70,80,90,100,7351,7224,7100,6976,6853,6728,6600,6468,6330, 6186,6033};ulongi nt F=0;ulongi nt T0_cou nt=0,T1_cou nt=0;bit flag=0;ulongi nt RH;/*****************************************************函数功能:延时1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒***************************************************/void delay1ms(){unsign ed char i,j;for(i=0;i<4;i++)for(j=0;j<33;j++);}/*****************************************************函数功能:延时若干毫秒入口参数:n***************************************************/void delayn ms(unsign ed char n){unsign ed char i;for(i=0;i<n;i++)delay1ms();}/****************************************************************************** *以下是对蜂鸣器模块的操作程序******************************************************************************* /sbit fmq1=P3^6;/*****************************************************函数功能:蜂鸣器延时若干250u s入口参数:n***************************************************/void delay500us(){unsign ed char j;for(j=0;j<57;j++) //500us基准延时程序{;}}void beep() //产生1KHZ频率声音的函数{unsign ed int t;for(t=0;t<1000;t++){fmq1=~fmq1;delay500us();}fmq1=1;delayn ms(1000);}/****************************************************************************** *以下是对液晶模块的操作程序******************************************************************************* /sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。
基于某某51单片机地温湿度DHT11采集
一、设计目的温湿度控制系统早已经成为当今社会研究的热门领域之一,同时温湿度也是现今工农业生产生活中必须要首先考虑的重要因素之一。
因此现今社会生产生活中就迫切需要一种价格便宜、容易操作而且精确度高的温湿度控制系统。
本系统设计就是利用AT89C52单片机对温湿度参量进行检测进而实现对温湿度参量的控制。
本系统设计通过使用AT89C52单片机、DHT11传感器模块、LCD1602液晶显示屏模块以及LED闪烁和蜂鸣器报警模块。
简单的系统设计就可以基本上满足本系统设计的系统设计要求。
DHT11数字温湿度传感器负责把采集到的温湿度信号传送给AT89C52单片机。
温湿度经过AT89C52单片机处理,然后AT89C52准确地把温湿度信号发送到LCD1602液晶显示屏模块,温湿度数据就可以准确地显示到LCD1602液晶屏上面,同时我们可以分别对温度和湿度设置上下限,越限LED闪烁和蜂鸣器报警模块。
二、设计要求和方案选择•LCD1602能够实时、准确的显示AT89C52采样温度值和湿度值,显示设定报警的温度和风扇的状态。
•DHT11采集温度及湿度值,AT89C52能够将DHT11输送过来的采集信息,准确的判断标准值与设定值之间的差异,及时的启动报警装置(LED闪烁和蜂鸣器)进行报警。
•根据采集温湿度的数据进行判断,控制继电器进行风扇的开闭传感器选择方案•方案一:利用两个传感器分别检测温度和湿度值,温度检测模块选用DS18B20温度传感器(+-0.5℃)。
湿度检测模块选用HS1101电容式湿度传感器(+-5%RH)。
这两款传感器都是我们大学实践电子设计中非常常见和常用的传感器。
•方案二:检测温湿度数值选用DHT11传感器作为系统设计的温湿度检测模块。
DHT11传感器能够同时对温度和湿度数值进行检测,而且其精确度能过完全满足本课程设计的精度要求。
湿度、温度测量误差:+-5%、+-2度•经过上述分析,方案一虽然精度更精确。
基于51单片机的温湿度检测系统设计与实现
3、无线通信模块
本系统的无线通信模块采用nRF24L01无线通信芯片。nRF24L01是一款具有 2.4GHz全球开放频率的无线通信芯片,具有低功耗、高速率、高稳定性等特点。 它将主控制器处理后的数据通过无线方式发送给接收器。
4、电源模块
本系统的电源模块采用9V电池供电。我们将9V电池通过稳压器转换为5V电源, 为整个系统提供稳定的电力支持。
三、测试与结果分析
为了验证本系统的可靠性和准确性,我们进行了一系列的测试。测试结果表 明,本系统能够准确快速地采集环境中的温湿度数据,并且能够稳定地将数据上 传至计算机或其他数据采集设备。同时,本系统的按键电路和液晶显示电路也表 现良好,用户可以通过按键调整系统的参数设置,并直观地查看温湿度数据。
2、液晶显示屏
为了方便用户直观地查看温湿度数据,本系统选用了一块16×2字符型液晶 显示屏。液晶屏的驱动电路简单易懂,且具有较低的功耗。
3、按键电路
为了便于用户对温湿度检测系统的参数进行设置,本系统加入了一个按键电 路。用户可以通过按键对系统的采样间隔、数据上传频率等参数进行设置。
4、串口通信电路
图1主程序流程图
2.温湿度采集模块
温湿度采集模块主要负责通过DHT11传感器采集环境中的温湿度数据。该模 块首先对DHT11传感器进行初始化,然后通过单总线接口接收传感器输出的温湿 度数据,最后对数据进行处理并存储。
3、液晶显示模块
液晶显示模块主要负责将温湿度数据显示在液晶屏上。该模块首先对液晶屏 进行初始化,然后根据主程序传递过来的温湿度数据,控制液晶屏的字符输出。
三、软件设计
本系统的软件设计主要分为以下几个步骤:
1、系统初始化:在系统上电后,首先进行各模块的初始化操作,包括DHT11 传感器、AT89C51单片机、nRF24L01无线通信芯片等。
基于51单片机的DHT11温湿度监测+液晶LCD1602显示程序源代码
基于51单片机的DHT11温湿度监测+液晶LCD1602显示程序源代码/***************DHT11温湿度监测+液晶LCD1602显示程序源代码******************单片机型号:STC15W4K56S4,内部晶振:22.1184M。
功能:DHT11温湿度监测+液晶LCD1602显示。
操作说明:通过温湿度传感器DHT11监测温湿度数值,并将温湿度数值显示在液晶LCD1602上。
**************************************************************************/#include "stc15.h" //包含头文件stc15.h#include <intrins.h> //包含头文件intrins.h#define Busy 0x80 //LCD忙sbit LCD_D0 = P0^0; //LCD_D0对应P0.0sbit LCD_D1 = P0^1; //LCD_D1对应P0.1sbit LCD_D2 = P0^2; //LCD_D2对应P0.2sbit LCD_D3 = P0^3; //LCD_D3对应P0.3sbit LCD_D4 = P0^4; //LCD_D4对应P0.4sbit LCD_D5 = P0^5; //LCD_D5对应P0.5sbit LCD_D6 = P0^6; //LCD_D6对应P0.6sbit LCD_D7 = P0^7; //LCD_D7对应P0.7sbit LCD_RS = P1^0; //LCD_RS对应P1.0sbit LCD_RW = P1^1; //LCD_RW对应P1.1sbit LCD_EN = P3^4; //LCD_EN对应P3.4sbit DHT11_PIN = P4^0; //DHT11管脚对应P4.0void delay(unsigned int t); //delay延时函数void delay_us(unsigned int t); //delay_us延时函数void delay_ms(unsigned int t); //delay_ms延时函数void Delay5Ms(void); //5Ms延时函数void GPIO_1602_Configuration(void); //LCD1602液晶IO口初始化void WriteDataLCD(unsigned char WDLCD); //LCD写数据函数void WriteCommandLCD(unsigned char WCLCD,BuysC); //LCD写命令函数unsigned char ReadDataLCD(void); //LCD读数据函数unsigned char ReadStatusLCD(void); //LCD读状态函数void LCDInit(void); //LCD初始化void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData);//LCD显示一个字符void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData); //LCD显示一个字符串void DHT11_Init(void); //初始化DHT11void DHT11_Delay(unsigned int j); //延时函数,用于DHT11 void DHT11_Delay_10us(void); //延时函数,用于DHT11 void COM(void);void RH(unsigned char *temp,unsigned char *humi);void DHT11_Display(void);unsigned char code welcome[] = {"DHT 11"}; //LCD显示内容DHT 11 unsigned char code Dht11[] = {"T: H: "}; //LCD显示内容T: H: unsigned char code Space[] = {" "};//LCD显示内容空白unsigned char U8FLAG,k;unsigned char U8count,U8temp;unsigned char U8T_data_H_temp,U8T_data_L_temp;unsigned char U8RH_data_H_temp,U8RH_data_L_temp;unsigned char U8checkdata_temp;unsigned char U8comdata;unsigned char temperature;unsigned char humidity;unsigned char disbuff_T[4]={0,0,0,0};unsigned char disbuff_H[4]={0,0,0,0};void delay(unsigned int t) //delay延时函数{while(t--);}void delay_us(unsigned int t) //delay_us延时函数{unsigned char i;while(t--){i = 3;while(i--) delay(1);}}void delay_ms(unsigned int t) //delay_ms延时函数{while(t--){delay_us(t);}}void Delay5Ms(void) //5ms延时函数{unsigned int TempCyc = 3552;while(TempCyc--);}void GPIO_1602_Configuration(void) //LCD1602液晶IO口初始化{P0M1 = P3M1&0x00;P0M0 = P3M0&0x00;P1M1 = P3M1&0xfc;P1M0 = P3M0&0xfc;P3M1 = P4M1&0xef;P3M0 = P4M0&0xef;}unsigned char ReadStatusLCD(void) //测试LCD忙碌状态{LCD_D7 = 1; //LCD的D7置1LCD_RS = 0; //LCD管脚RS设置成低电平LCD_RW = 1; //LCD管脚RW设置成高电平LCD_EN = 0; //LCD管脚E设置成低电平LCD_EN = 0; //LCD管脚E设置成低电平LCD_EN = 1; //LCD管脚E设置成高电平while(LCD_D7); //检测忙信号return(Busy); //表示当前忙}void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测{if(BuysC) ReadStatusLCD(); //根据需要检测忙LCD_EN = 0; //LCD管脚E设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_RS = 0; //LCD管脚RS设置成低电平LCD_RW = 0; //LCD管脚RW设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时P0 = WCLCD; //将数据送入P0口,即写入指令或地址 _nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 1; //E置高电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}void WriteDataLCD(unsigned char WDLCD) //LCD写数据函数{ReadStatusLCD(); //读取LCD状态LCD_EN = 0; //LCD管脚E设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_RS = 1; //LCD管脚RS设置成高电平LCD_RW = 0; //LCD管脚RW设置成低电平P0 = WDLCD; //将数据送入P0口_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 1; //E置高电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}void LCDInit(void) //LCD初始化{WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);WriteCommandLCD(0x08,1); //关闭显示WriteCommandLCD(0x01,1); //显示清屏WriteCommandLCD(0x06,1); //显示光标移动设置WriteCommandLCD(0x0C,1); //显示开及光标设置}void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码WriteCommandLCD(X,0); //这里不检测忙信号,发送地址码WriteDataLCD(DData); //发送数据}void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) {unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1while (DData[ListLength]>=0x20) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]);//显示单个字符ListLength++;X++;}}}void DHT11_Init(void) //初始化DHT11 {P4M1 = P4M1&0xfe;P4M0 = P4M0&0xfe;}void DHT11_Delay(unsigned int j){unsigned char i;for(;j>0;j--){for(i=0;i<250;i++);}}void DHT11_Delay_10us(void){unsigned char i;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;}void COM(void){unsigned char i;for(i=0;i<8;i++){U8FLAG=2;while((!DHT11_PIN)&&U8FLAG++);DHT11_Delay_10us();DHT11_Delay_10us();DHT11_Delay_10us();U8temp=0;if(DHT11_PIN)U8temp=1;U8FLAG=2;while((DHT11_PIN)&&U8FLAG++); //超时则跳出for循环if(U8FLAG==1)break;//判断数据位是0还是1,如果高电平高过预定0高电平值则数据位为 1U8comdata<<=1;U8comdata|=U8temp;}}void RH(unsigned char *temp,unsigned char *humi){DHT11_PIN = 0;DHT11_Delay(180);DHT11_PIN = 1; //总线由上拉电阻拉高主机延时20us DHT11_Delay_10us();DHT11_Delay_10us();DHT11_Delay_10us();DHT11_Delay_10us(); //主机设为输入判断从机响应信号DHT11_PIN = 1;//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行if(!DHT11_PIN){U8FLAG=2;//判断从机是否发出 80us 的低电平响应信号是否结束while((!DHT11_PIN)&&U8FLAG++);U8FLAG=2;//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态while((DHT11_PIN)&&U8FLAG++); //数据接收状态COM();U8RH_data_H_temp=U8comdata;COM();U8RH_data_L_temp=U8comdata;COM();U8T_data_H_temp=U8comdata;COM();U8T_data_L_temp=U8comdata;COM();U8checkdata_temp=U8comdata;DHT11_PIN=1; //数据校验U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp); if(U8temp==U8checkdata_temp){*temp = U8T_data_H_temp;*humi = U8RH_data_H_temp;}}}void DHT11_Display(void){RH(&temperature,&humidity);disbuff_T[2]=temperature/100+0x30;disbuff_T[1]=temperature/10%10+0x30;disbuff_T[0]=temperature%10+0x30;disbuff_H[2]=humidity/100+0x30;disbuff_H[1]=humidity/10%10+0x30;disbuff_H[0]=humidity%10+0x30;DisplayOneChar(2,1,disbuff_T[2]);delay_ms(10); //延时DisplayOneChar(3,1,disbuff_T[1]);delay_ms(10); //延时DisplayOneChar(4,1,disbuff_T[0]);delay_ms(10); //延时DisplayOneChar(8,1,disbuff_H[2]);delay_ms(10); //延时DisplayOneChar(9,1,disbuff_H[1]);delay_ms(10); //延时DisplayOneChar(10,1,disbuff_H[0]);delay_ms(10); //延时}void main(void){GPIO_1602_Configuration(); //LCD1602液晶IO口初始化delay_ms(10); //延时LCDInit(); //LCD1602初始化delay_ms(10); //延时DHT11_Init(); //初始化DHT11DisplayListChar(5,0,welcome); //LCD1602显示Hello My Friends delay_ms(10); //延时while(1){DisplayListChar(0,1,Space); //LCD1602显示P: K1delay_ms(10); //延时DisplayListChar(0,1,Dht11); //LCD1602显示delay_ms(10); //延时DHT11_Display();delay_ms(200); //延时}}程序源代码是编译通过的DHT11温湿度监测模块接口电路图该程序的实际运行效果。
基于51单片机温湿度监控系统毕业设计
基于51单片机温湿度监控系统毕业设计1. 引言温湿度监控系统是一种用于实时监测环境温度和湿度的设备,广泛应用于工业生产、农业种植、仓储物流等领域。
本文将介绍基于51单片机的温湿度监控系统的设计和实现过程。
2. 设计目标本设计旨在开发一款简单易用、功能稳定的温湿度监控系统。
具体设计目标如下:- 实时监测环境温度和湿度; - 提供用户界面,显示当前温湿度数据; - 当温湿度超出设定范围时,发出警报信号。
3. 硬件设计3.1 单片机选择本设计选用51系列单片机作为主控芯片,因其成本低廉、易于编程和广泛应用等优点。
3.2 温湿度传感器采用常见的DHT11数字式温湿度传感器,具有价格低廉、精确可靠等特点。
3.3 显示模块使用LCD1602液晶显示模块,能够直观地显示当前环境温湿度数据。
3.4 警报器选用蜂鸣器作为警报器,当温湿度超出设定范围时,发出警报信号。
3.5 其他外围电路为了实现与单片机的通信和控制,还需设计适当的电源、电压转换、数据传输等外围电路。
4. 软件设计4.1 系统框架本系统采用基于C语言的嵌入式软件开发,主要包括初始化、数据采集、数据处理和用户界面显示等模块。
4.2 初始化模块在系统启动时,需要对硬件进行初始化设置,包括配置串口通信、LCD1602显示模块和DHT11传感器等。
4.3 数据采集模块通过DHT11传感器采集环境温湿度数据,并将其转换为数字信号供单片机处理。
4.4 数据处理模块根据用户设定的温湿度范围,对采集到的温湿度数据进行判断和处理。
当温湿度超出设定范围时,触发警报信号。
4.5 用户界面显示模块通过LCD1602显示当前环境温湿度数据,并提供简单的操作界面,包括设定温湿度范围和查看历史数据等功能。
5. 系统实现5.1 硬件连接根据设计需求,将单片机、DHT11传感器、LCD1602显示模块和蜂鸣器等进行正确的连接。
5.2 软件编程使用C语言编写嵌入式软件程序,实现系统框架中各个模块的功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于51单片机SHT11温湿度传感器检测程序(含电路图)•下面就是原理图:下面就是SHT11与MCU连接的典型电路:下面就是源代码:#include <reg52、h>#include <intrins、h>/******************************************************** 宏定义********************************************************/ #define uint unsigned int#define uchar unsigned char#define noACK 0#define ACK 1#define STATUS_REG_W 0x06#define STATUS_REG_R 0x07#define MEASURE_TEMP 0x03#define MEASURE_HUMI 0x05#define RESET 0x1eenum {TEMP,HUMI};typedef union //定义共用同类型{unsigned int i;float f;} value;/******************************************************** 位定义********************************************************/ sbit lcdrs=P2^0;sbit lcdrw=P2^1;sbit lcden=P2^2;sbit SCK = P1^0;sbit DATA = P1^1;/******************************************************** 变量定义********************************************************/ uchar table2[]="SHT11 温湿度检测";uchar table3[]="温度为: ℃";uchar table4[]="湿度为:";uchar table5[]="、";uchar wendu[6];uchar shidu[6];/******************************************************** 1ms延时函数void delay(int z){int x,y;for(x=z;x>0;x--)for(y=125;y>0;y--);}/******************************************************** 50us延时函数********************************************************/ void delay_50us(uint t){uint j;for(;t>0;t--)for(j=19;j>0;j--);}/******************************************************** 50ms延时函数********************************************************/ void delay_50ms(uint t){uint j;for(;t>0;t--)for(j=6245;j>0;j--);}/******************************************************** 12864液晶写指令********************************************************/ void write_12864com(uchar com){lcdrs=0;delay_50us(1);P0=com;lcden=1;delay_50us(10);lcden=0;delay_50us(2);}/******************************************************** 12864液晶写数据void write_dat(uchar dat){lcdrs=1;lcdrw=0;delay_50us(1);P0=dat;lcden=1;delay_50us(10);lcden=0;delay_50us(2);}/******************************************************** 12864液晶初始化********************************************************/ void init12864lcd(void){delay_50ms(2);write_12864com(0x30);delay_50us(4);write_12864com(0x30);delay_50us(4);write_12864com(0x0f);delay_50us(4);write_12864com(0x01);delay_50us(240);write_12864com(0x06);delay_50us(10);write_12864com(0x0c);delay_50us(10);}/******************************************************** 12864液晶显示函数********************************************************/ void display1(void){uchar i;write_12864com(0x80);for(i=0;i<18;i++){write_dat(table2[i]);delay_50us(1);}/******************************************************** 12864液晶显示函数********************************************************/ void display2(void){uchar i;write_12864com(0x90);for(i=0;i<18;i++){write_dat(table3[i]);delay_50us(1);}}/******************************************************** 12864液晶显示函数********************************************************/ void display3(void){uchar i;write_12864com(0x88);for(i=0;i<8;i++){write_dat(table4[i]);delay_50us(1);}}/******************************************************** 12864液晶显示函数********************************************************/ void displaywendu(void){uchar i;write_12864com(0x94);for(i=0;i<3;i++){write_dat(wendu[i]);delay_50us(1);}for(i=0;i<1;i++)write_dat(table5[i]);delay_50us(1);}for(i=4;i<5;i++){write_dat(wendu[i]);delay_50us(1);}}/******************************************************** 12864液晶显示函数********************************************************/ void displayshidu(void){uchar i;write_12864com(0x8C);for(i=0;i<3;i++){write_dat(shidu[i]);delay_50us(1);}for(i=0;i<1;i++){write_dat(table5[i]);delay_50us(1);}for(i=4;i<5;i++){write_dat(shidu[i]);delay_50us(1);}}/******************************************************** SHT11写字节程序********************************************************/ char s_write_byte(unsigned char value){unsigned char i,error=0;for (i=0x80;i>0;i>>=1) //高位为1,循环右移{if (i&value) DATA=1; //与要发送的数相与,结果为发送的位 else DATA=0;SCK=1;_nop_();_nop_();_nop_(); //延时3usSCK=0;}DATA=1; //释放数据线SCK=1;error=DATA; //检查应答信号,确认通讯正常_nop_();_nop_();_nop_();SCK=0;DATA=1;return error; //error=1 通讯错误}/******************************************************** SHT11读字节程序********************************************************/ char s_read_byte(unsigned char ack){unsigned char i,val=0;DATA=1; //释放数据线for(i=0x80;i>0;i>>=1) //高位为1,循环右移{SCK=1;if(DATA) val=(val|i); //读一位数据线的值SCK=0;}DATA=!ack; //如果就是校验,读取完后结束通讯 ;SCK=1;_nop_();_nop_();_nop_(); //延时3usSCK=0;_nop_();_nop_();_nop_();DATA=1; //释放数据线return val;}/******************************************************** SHT11启动传输********************************************************/ void s_transstart(void){DATA=1; SCK=0; //准备_nop_();SCK=1;_nop_();DATA=0;_nop_();SCK=0;_nop_();_nop_();_nop_();SCK=1;_nop_();DATA=1;_nop_();SCK=0;}/********************************************************SHT11连接复位********************************************************/void s_connectionreset(void){unsigned char i;DATA=1; SCK=0; //准备for(i=0;i<9;i++) //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位 {SCK=1;SCK=0;}s_transstart(); //启动传输}/********************************************************SHT11温湿度检测********************************************************/char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned charmode){unsigned error=0;unsigned int i;s_transstart(); //启动传输switch(mode) //选择发送命令{case TEMP : error+=s_write_byte(MEASURE_TEMP); break; //测量温度case HUMI : error+=s_write_byte(MEASURE_HUMI); break; //测量湿度default : break;}for (i=0;i<65535;i++) if(DATA==0) break; //等待测量结束if(DATA) error+=1; // 如果长时间数据线没有拉低,说明测量错误*(p_value) =s_read_byte(ACK); //读第一个字节,高字节 (MSB)*(p_value+1)=s_read_byte(ACK); //读第二个字节,低字节 (LSB)*p_checksum =s_read_byte(noACK); //read CRC校验码return error; // error=1 通讯错误}/********************************************************SHT11温湿度值标度变换及温度补偿********************************************************/void calc_sth10(float *p_humidity ,float *p_temperature){const float C1=-4、0; // 12位湿度精度修正公式const float C2=+0、0405; // 12位湿度精度修正公式const float C3=-0、0000028; // 12位湿度精度修正公式const float T1=+0、01; // 14位温度精度 5V条件修正公式const float T2=+0、00008; // 14位温度精度 5V条件修正公式float rh=*p_humidity; // rh: 12位湿度float t=*p_temperature; // t: 14位温度float rh_lin; // rh_lin: 湿度 linear值float rh_true; // rh_true: 湿度 ture值float t_C; // t_C : 温度℃t_C=t*0、01 - 40; //补偿温度rh_lin=C3*rh*rh + C2*rh + C1; //相对湿度非线性补偿rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //相对湿度对于温度依赖性补偿if(rh_true>100)rh_true=100; //湿度最大修正if(rh_true<0、1)rh_true=0、1; //湿度最小修正*p_temperature=t_C; //返回温度结果*p_humidity=rh_true; //返回湿度结果}/********************************************************主函数********************************************************/void main(void){unsigned int temp,humi;value humi_val,temp_val; //定义两个共同体,一个用于湿度,一个用于温度 unsigned char error; //用于检验就是否出现错误unsigned char checksum; //CRCinit12864lcd();display1();display2();display3();s_connectionreset(); //启动连接复位while(1){error=0; //初始化error=0,即没有错误error+=s_measure((unsigned char*)&temp_val、i,&checksum,TEMP); //温度测量error+=s_measure((unsigned char*)&humi_val、i,&checksum,HUMI); //湿度测量if(error!=0) s_connectionreset(); ////如果发生错误,系统复位else{humi_val、f=(float)humi_val、i; //转换为浮点数temp_val、f=(float)temp_val、i; //转换为浮点数calc_sth10(&humi_val、f,&temp_val、f); //修正相对湿度及温度temp=temp_val、f*10;humi=humi_val、f*10;wendu[0]=temp/1000+'0'; //温度百位wendu[1]=temp%1000/100+'0'; //温度十位wendu[2]=temp%100/10+'0'; //温度个位wendu[3]=0x2E; //小数点wendu[4]=temp%10+'0'; //温度小数点后第一位displaywendu();shidu[0]=humi/1000+'0'; //湿度百位shidu[1]=humi%1000/100+'0'; //湿度十位shidu[2]=humi%100/10+'0'; //湿度个位shidu[3]=0x2E; //小数点shidu[4]=humi%10+'0'; //湿度小数点后第一位displayshidu();}delay(800); //等待足够长的时间,以现行下一次转换}}相关手册资料及源码下载地址:基于51单片机SHT11温湿度传感器检测程序相关资料。