求温湿度传感器SHT11的源程序(51单片机语言)
基于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单片机Nokia5110的温湿度传感器DHT11温湿度显示的程序
//返回到DHT_start处
}
k=0;
Dis_DHT_Data();
}
PUBLIC.C如下
#include<reg52.h>
#include "PUBLIC.h"
#define uchar unsigned char
#define uint unsigned int
void delayus(uchar a,uchar b,uchar c)
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",13*/
};
/*******************************************
Nokia5110液晶写一个字节的函数
入口参数dt,command
功能写数据或写命令1为数据,0为命令
}
}
DHT11.c如下
#include <reg52.h>
#include "PUBLIC.h"
#define uchar unsigned char
#define uint unsigned int
unsigned char DHT_Data[5];
//将温湿度的值写在LCD上
void Dis_DHT_Data(void)
delayus(2,1,9);
DHT_Data[i]<<=1;
DHT_Data[i]|=DHT;
while(DHT==1);
}
//校检温湿度的值
if((k<10)&&(DHT_Data[4]!=(DHT_Data[0]+DHT_Data[1]+DHT_Data[2]+DHT_Data[3])))
单片机温度湿度控制程序(dht11)
1、温度湿度控制主程序(单片机)#include<reg52.h>#include "dht11.h"#define uchar unsigned char#define uint unsigned intsbit beep=P2^3;sbit k1=P3^2;sbit k2=P3^3;sbit k3=P3^6;sbit k4=P3^7;sbit rs=P3^5;sbit lcden=P3^4;uchar table0[]="T:00.00 TM:00.0 ";//初始化液晶温度实测值以及门限值缓存uchar table1[]="H:00.00 HM:00.0 ";//初始化液晶湿度实测值以及门限值缓存uchar table3[]="This is T/H test";//系统开机显示内容初始化缓存uchar table4[]="Result is coming";//系统开机显示内容初始化缓存static uchar flag;extern int temp_value,humi_value;void Delay_1ms(uint ms);uint TM,HM;void delay(uint x)//{uint a,b;for(a=x;a>0;a--)for(b=10;b>0;b--);}void delay1(uint x)//延时程序{uint a,b;for(a=x;a>0;a--)for(b=100;b>0;b--);}void write_com(uchar com)//液晶写指令操作{P0=com;rs=0;lcden=0;delay(10);lcden=1;delay(10);lcden=0;}void write_date(uchar date)//液晶写数据操作{P0=date;rs=1;lcden=0;delay(10);lcden=1;delay(10);lcden=0;}void init()//液晶初始化{write_com(0x38);delay(1);write_com(0x0c);delay(1);write_com(0x06);delay(1);write_com(0x01);delay(1);}void LCD_Display(uchar buff1[],uchar buff2[])//液晶显示程序{uchar aa;init();//液晶初始化write_com(0x80+16);//写入第一行数据指令delay(1);for(aa=0;aa<16;aa++)//写入第一行待显示数据{write_date(buff1[aa]);}write_com(0xc0+16); //写入第二行数据指令for(aa=0;aa<16;aa++)//写入第一行待显示数据{write_date(buff2[aa]);}for(aa=0;aa<16;aa++){write_com(0x18);delay(1);}}void Tem_Ch(uchar AA,uchar nn)//T门限数值替换{switch(AA){case 0:table0[nn]='0';break;case 1:table0[nn]='1';break;case 2:table0[nn]='2';break;case 3:table0[nn]='3';break;case 4:table0[nn]='4';break;case 5:table0[nn]='5';break;case 6:table0[nn]='6';break;case 7:table0[nn]='7';break;case 8:table0[nn]='8';break;case 9:table0[nn]='9';break;}}void Hum_Ch(uchar BB,uchar mm)//H门限数值替换{switch(BB){case 0:table1[mm]='0';break;case 1:table1[mm]='1';break;case 2:table1[mm]='2';break;case 3:table1[mm]='3';break;case 4:table1[mm]='4';break;case 5:table1[mm]='5';break;case 6:table1[mm]='6';break;case 7:table1[mm]='7';break;case 8:table1[mm]='8';break;case 9:table1[mm]='9';break;}}///////////void YZ_Resh()//门限值更新{uchar A1,A2,A3;A1=TM/10;//取十位A2=TM%10;//取个位A3=0;Tem_Ch(A1,11);//写入对应的液晶显示缓存Tem_Ch(A2,12);//写入对应的液晶显示缓存Tem_Ch(A3,14);//写入对应的液晶显示缓存A1=HM/10;A2=HM%10;A3=0;Hum_Ch(A1,11);Hum_Ch(A2,12);Hum_Ch(A3,14);}void key_test()//按键检测/*根据按键的检测结果进行温度湿度门限值的设定*/{bit kk1;bit kk2;bit kk3;bit kk4;uchar temp;k1=0;k2=1;k3=1;k4=1;kk1=k1;kk2=k2;kk3=k3;kk4=k4;if(kk3!=1){delay1(100);if(kk3!=1)//若可开=0且持续一段时间后任然为0,则执行有关操作{temp=P3;//按键一操作TM=TM+1;//提高温度门限值YZ_Resh();////更新液晶显示缓存的门限值LCD_Display(table0,table1);//液晶显示数值}}if(kk4!=1){delay1(100);if(kk4!=1){temp=P3;//按键二操作TM=TM-1;//降低温度门限值YZ_Resh();////更新液晶显示缓存的门限值LCD_Display(table0,table1);//液晶显示数值}}k1=1;k2=0;k3=1;k4=1;kk1=k1;kk2=k2;kk3=k3;kk4=k4;if(kk3!=1){delay1(100);if(kk3!=1){temp=P3;//按键三操作HM=HM+1;//提高湿度门限YZ_Resh();//更新液晶显示缓存的门限值LCD_Display(table0,table1);//液晶显示数值}}if(kk4!=1){delay1(100);if(kk4!=1){temp=P3;//按键四操作HM=HM-1;//降低湿度门限YZ_Resh();//更新液晶显示缓存的门限值LCD_Display(table0,table1);//液晶显示数值}}}void TempAndHumi_Resh()//更新液晶显示缓存中的温度湿度数值/*根据测得的结果将液晶显示缓存中的数据进行替换*/{uchar ge,shi,bai;ge=temp_value%10;shi=temp_value%100/10;bai=temp_value%1000/100;Tem_Ch(bai,2);Tem_Ch(shi,3);Tem_Ch(ge,5);ge=humi_value%10;shi=humi_value%100/10;bai=humi_value%1000/100;Hum_Ch(bai,2);Hum_Ch(shi,3);Hum_Ch(ge,5);}void beep_control()//警报状态控制函数/*如果实测温度超过门限值则报警*/{if(temp_value>(TM*10)){beep=0;}else{if(humi_value>(HM*10)){beep=0;}else{beep=1;}}}void main(){uint m=0;TM=25;//设定温度初始门限值:25°CHM=50;//设定湿度初始门限值:50%YZ_Resh();//更新液晶显示缓存的门限值beep=1;//关闭蜂鸣器LCD_Display(table3,table4);//显示系统本系统信息while(1){key_test();//监测按键状态,并根据对应按键改变温度湿度门限值,并显示if (m<100)//循环计时,3秒钟{m++;Delay_1ms(30);}else//当m=100时即为3秒时间到,则进行温度湿度数据采集{m=0;ReadTempAndHumi();//采集温度湿度数据TempAndHumi_Resh();//更新液晶显示缓存中的温度湿度数值LCD_Display(table0,table1);//显示当前温度湿度实测值以及门限值}beep_control();//根据门限值以及实测值进行警报状态设置}}#include <reg52.h>#include "dht11.h"#define uchar unsigned char#define uint unsigned int#define NUMBER 20#define SIZE 5sbit dht11=P2^2;static uchar status;static uchar value_array[SIZE];//定义存放DHT11采集的5个字节的数组int temp_value,humi_value;static uchar ReadValue(void);extern void Delay_1ms(uint ms)//毫秒延时,延时时间为ms毫秒{uint x,y;for(x=ms;x>0;x--){for(y=124;y>0;y--);}}static void Delay_10us(void)//10微秒延时{uchar i;i--;i--;i--;i--;i--;i--;}static uchar ReadValue(void)//读一个字节数据的程序{uchar count,value=0,i;status=OK;//设定标志位正常状态for(i=8;i>0;i--){value<<=1;//高位在前进行接收数据count=0;while(dht11==0&&count++<NUMBER);if(count>=NUMBER)//若大于最大数值则出错{status=ERROR;//设定错误标志return 0;//函数执行过程发生错误就退出函数}Delay_10us();//进行30us的延时Delay_10us();Delay_10us();if(dht11!=0)//再次检测是否为高电平{value++;//进入本函数说明信号为1,则进行自加while(dht11!=0&&count++<NUMBER){dht11=1;}if(count>=NUMBER){status=ERROR;return 0;}}}return(value);//返回读取的结果}extern uchar ReadTempAndHumi(void)//读取一次温度湿度数据,共5个字节{uchar i=0,check_value=0,count=0;EA=0;dht11=0;//拉低数据线20msDelay_1ms(20);dht11=1;//释放数据线,以用于检测低电平应答信号Delay_10us();//延时40usDelay_10us();Delay_10us();Delay_10us();if(dht11!=0)//检测应答信号,应答信号为低电平{EA=1;//无低电平。
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单片机SHT11温湿度传感器检测程序
基于51单片机SHT11温湿度传感器检测程序(含电路图)下面是原理图:下面是SHT11与MCU连接的典型电路:下面是源代码:#include <>#include <>/********************************************************宏定义********************************************************/#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 ;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=; // 12位湿度精度修正公式const float C2=+; // 12位湿度精度修正公式const float C3=; // 12位湿度精度修正公式const float T1=+; // 14位温度精度 5V条件修正公式const float T2=+; // 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* - 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<rh_true=; //湿度最小修正*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*)&,&checksum,TEMP); //温度测量error+=s_measure((unsigned char*)&,&checksum,HUMI); //湿度测量if(error!=0) s_connectionreset(); ////如果发生错误,系统复位else{=(float); //转换为浮点数=(float); //转换为浮点数calc_sth10(&,&; //修正相对湿度及温度temp=*10;humi=*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温湿度传感器检测程序相关资料。
温湿度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)
SHT11温湿度传感器在单片机中的应用
郑州航空工业管理学院《单片机原理与应用》课程设计说明书09 级电气工程及其自动化专业 72 班级题目I2C总线数字温湿度传感器SHT11及其在单片机系统的应用姓名李兴田学号090607215指导教师王义琴职称讲师二О一二年五月28 日一、SHT11温湿度传感器的基本原理SHT11的湿度检测运用电容式结构,并采用具有不同保护的“微型结构”检测电极系统与聚合物覆盖层来组成传感器芯片的电容,除保持电容式湿敏器件的原有特性外,还可抵御来自外界的影响。
由于它将温度传感器与湿度传感器结合在一起而构成了一个单一的个体,因而测量精度较高且可精确得出露点,同时不会产生由于温度与湿度传感器之间随温度梯度变化引起的误差。
CMOSensTM技术不仅将温湿度传感器结合在一起,而且还将信号放大器、模/数转换器、校准数据存储器、标准I2C总线等电路全部集成在一个芯片内。
SHT11传感器的内部结构框图如图2所示。
SHT11的每一个传感器都是在极为精确的湿度室中校准的。
SHT11传感器的校准系数预先存在OTP内存中。
经校准的相对湿度和温度传感器与一个14位的A/D转换器相连,可将转换后的数字温湿度值送给二线I2C总线器件,从而将数字信号转换为符合I2C总线协议的串行数字信号。
由于将传感器与电路部分结合在一起,因此,该传感器具有比其它类型的湿度传感器优越得多的性能。
首先是传感器信号强度的增加增强了传感器的抗干扰性能,保证了传感器的长期稳定性,而A/D转换的同时完成,则降低了传感器对干扰噪声的敏感程度。
其次在传感器芯片内装载的校准数据保证了每一只湿度传感器都具有相同的功能,即具有100%的互换性。
最后,传感器可直接通过I2C总线与任何类型的微处理器、微控制器系统连接,从而减少了接口电路的硬件成本,简化了接口方式。
二、设计方案3.4 系统设计流程图设计SHT11温湿度传感器在单片机中的应用的流程图如下:三、硬件设计图5 单片机与SHT11接口电路及温湿度显示电路(1)湿度值输出SHT11可通过I2C总线直接输出数字量湿度值,其相对湿度数字输出特性曲线如图3所示。
基于某51单片机SHT11温湿度传感器检测程序
基于51单片机SHT11温湿度传感器检测程序(含电路图)下面是原理图:下面是SHT11与MCU连接的典型电路:下面是源代码:view sourceprint?001.#include <reg52.h>002.#include <intrins.h>003.004./******************************************************** 005. 宏定义006.********************************************************/ 007.#define uint unsigned int008.#define uchar unsigned char009.#define noACK 0010.#define ACK 1011.#define STATUS_REG_W 0x06012.#define STATUS_REG_R 0x07013.#define MEASURE_TEMP 0x03014.#define MEASURE_HUMI 0x05015.#define RESET 0x1e016.017.enum {TEMP,HUMI};018.019.typedef union //定义共用同类型020.{021. unsigned int i;022. float f;023.} value;024.025.026./******************************************************** 027. 位定义028.********************************************************/ 029.sbit lcdrs=P2^0;030.sbit lcdrw=P2^1;031.sbit lcden=P2^2;032.sbit SCK = P1^0;033.sbit DATA = P1^1;034.035./******************************************************** 036. 变量定义037.********************************************************/ 038.uchar table2[]="SHT11 温湿度检测";039.uchar table3[]="温度为:℃";040.uchar table4[]="湿度为:";041.uchar table5[]=".";042.uchar wendu[6];043.uchar shidu[6];044.045./******************************************************** 046. 1ms延时函数047.********************************************************/ 048.void delay(int z)049.{050. int x,y;051. for(x=z;x>0;x--)052. for(y=125;y>0;y--);053.}054.055./******************************************************** 056. 50us延时函数057.********************************************************/ 058.void delay_50us(uint t)059.{060. uint j;061. for(;t>0;t--)062. for(j=19;j>0;j--);063.}064.065./******************************************************** 066. 50ms延时函数067.********************************************************/ 068.void delay_50ms(uint t)069.{070. uint j;071. for(;t>0;t--)072. for(j=6245;j>0;j--);073.}074.075./******************************************************** 076. 12864液晶写指令077.********************************************************/ 078.void write_12864com(uchar com)079.{080. lcdrs=0;081. lcdrw=0;082. delay_50us(1);083. P0=com;084. lcden=1;085. delay_50us(10);086. lcden=0;087. delay_50us(2);088.}089.090./******************************************************** 091. 12864液晶写数据092.********************************************************/ 093.void write_dat(uchar dat)094.{095. lcdrs=1;096. lcdrw=0;097. delay_50us(1);098. P0=dat;099. lcden=1;100. delay_50us(10);101. lcden=0;102. delay_50us(2);103.}104.105./******************************************************** 106. 12864液晶初始化107.********************************************************/ 108.void init12864lcd(void)109.{110. delay_50ms(2);111. write_12864com(0x30);112. delay_50us(4);113. write_12864com(0x30);114. delay_50us(4);115. write_12864com(0x0f);116. delay_50us(4);117. write_12864com(0x01);118. delay_50us(240);119. write_12864com(0x06);120. delay_50us(10);121. write_12864com(0x0c);122. delay_50us(10);123.}124.125./******************************************************** 126. 12864液晶显示函数127.********************************************************/ 128.void display1(void)129.{130. uchar i;131. write_12864com(0x80);132. for(i=0;i<18;i++)133. {134. write_dat(table2[i]);135. delay_50us(1);136. }137.}138.139./******************************************************** 140. 12864液晶显示函数141.********************************************************/ 142.void display2(void)143.{144. uchar i;145. write_12864com(0x90);146. for(i=0;i<18;i++)147. {148. write_dat(table3[i]);149. delay_50us(1);150. }151.}152.153./******************************************************** 154. 12864液晶显示函数155.********************************************************/ 156.void display3(void)157.{158. uchar i;159. write_12864com(0x88);160. for(i=0;i<8;i++)161. {162. write_dat(table4[i]);163. delay_50us(1);164. }165.}166.167./******************************************************** 168. 12864液晶显示函数169.********************************************************/ 170.void displaywendu(void)171.{172. uchar i;173. write_12864com(0x94);174. for(i=0;i<3;i++)175. {176. write_dat(wendu[i]);177. delay_50us(1);178. }179. for(i=0;i<1;i++)180. {181. write_dat(table5[i]);182. delay_50us(1);183. }184. for(i=4;i<5;i++)185. {186. write_dat(wendu[i]);187. delay_50us(1);188. }189.}190.191.192./******************************************************** 193. 12864液晶显示函数194.********************************************************/ 195.void displayshidu(void)196.{197. uchar i;198. write_12864com(0x8C);199. for(i=0;i<3;i++)200. {201. write_dat(shidu[i]);202. delay_50us(1);203. }204. for(i=0;i<1;i++)205. {206. write_dat(table5[i]);207. delay_50us(1);208. }209. for(i=4;i<5;i++)210. {211. write_dat(shidu[i]);212. delay_50us(1);213. }214.}215.216./********************************************************217. SHT11写字节程序218.********************************************************/ 219.char s_write_byte(unsigned char value)220.{221. unsigned char i,error=0;222. for (i=0x80;i>0;i>>=1) //高位为1,循环右移223. {224. if (i&value) DATA=1; //和要发送的数相与,结果为发送的位225. else DATA=0;226. SCK=1;227. _nop_();_nop_();_nop_(); //延时3us228. SCK=0;229. }230. DATA=1; //释放数据线231. SCK=1;232. error=DATA; //检查应答信号,确认通讯正常233. _nop_();_nop_();_nop_();234. SCK=0;235. DATA=1;236. return error; //error=1 通讯错误237.}238.239./******************************************************** 240. SHT11读字节程序241.********************************************************/ 242.char s_read_byte(unsigned char ack)243.{244. unsigned char i,val=0;245. DATA=1; //释放数据线246. for(i=0x80;i>0;i>>=1) //高位为1,循环右移247. {248. SCK=1;249. if(DATA) val=(val|i); //读一位数据线的值250. SCK=0;251. }252. DATA=!ack; //如果是校验,读取完后结束通讯 ;253. SCK=1;254. _nop_();_nop_();_nop_(); //延时3us255. SCK=0;256. _nop_();_nop_();_nop_();257. DATA=1; //释放数据线258. return val;259.}260.261./********************************************************262. SHT11启动传输263.********************************************************/264.void s_transstart(void)265.{266. DATA=1; SCK=0; //准备267. _nop_();268. SCK=1;269. _nop_();270. DATA=0;271. _nop_();272. SCK=0;273. _nop_();_nop_();_nop_();274. SCK=1;275. _nop_();276. DATA=1;277. _nop_();278. SCK=0;279.}280.281.282./********************************************************283. SHT11连接复位284.********************************************************/285.void s_connectionreset(void)286.{287. unsigned char i;288. DATA=1; SCK=0; //准备289. for(i=0;i<9;i++) //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位290. {291. SCK=1;292. SCK=0;293. }294. s_transstart(); //启动传输295.}296.297./********************************************************298. SHT11温湿度检测299.********************************************************/300.char s_measure(unsigned char *p_value,unsigned char *p_checksum, unsigned charmode)301.{302. unsigned error=0;303. unsigned int i;304.305. s_transstart(); //启动传输306. switch(mode) //选择发送命令307. {308. case TEMP : error+=s_write_byte(MEASURE_TEMP); break; //测量温度309. case HUMI : error+=s_write_byte(MEASURE_HUMI); break; //测量湿度310. default : break;311. }312. for (i=0;i<65535;i++) if(DATA==0) break; //等待测量结束313. if(DATA) error+=1; // 如果长时间数据线没有拉低,说明测量错误314. *(p_value) =s_read_byte(ACK); //读第一个字节,高字节 (MSB)315. *(p_value+1)=s_read_byte(ACK); //读第二个字节,低字节 (LSB)316. *p_checksum =s_read_byte(noACK); //read CRC校验码317. return error; // error=1 通讯错误318.}319./********************************************************320. SHT11温湿度值标度变换及温度补偿321.********************************************************/322.void calc_sth10(float *p_humidity ,float *p_temperature)323.{324. const float C1=-4.0; // 12位湿度精度修正公式325. const float C2=+0.0405; // 12位湿度精度修正公式326. const float C3=-0.0000028; // 12位湿度精度修正公式327. const float T1=+0.01; // 14位温度精度 5V条件修正公式328. const float T2=+0.00008; // 14位温度精度 5V条件修正公式329.330. float rh=*p_humidity; // rh: 12位湿度331. float t=*p_temperature; // t: 14位温度332. float rh_lin; // rh_lin: 湿度 linear值333. float rh_true; // rh_true: 湿度 ture值334. float t_C; // t_C : 温度℃335.336. t_C=t*0.01 - 40; //补偿温度337. rh_lin=C3*rh*rh + C2*rh + C1; //相对湿度非线性补偿338. rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //相对湿度对于温度依赖性补偿339. if(rh_true>100)rh_true=100; //湿度最大修正340. if(rh_true<0.1)rh_true=0.1; //湿度最小修正341.342. *p_temperature=t_C; //返回温度结果343. *p_humidity=rh_true; //返回湿度结果344.}345./********************************************************346. 主函数347.********************************************************/348.void main(void)349.{350. unsigned int temp,humi;351. value humi_val,temp_val; //定义两个共同体,一个用于湿度,一个用于温度352. unsigned char error; //用于检验是否出现错误353. unsigned char checksum; //CRC354. init12864lcd();355. display1();356. display2();357. display3();358. s_connectionreset(); //启动连接复位359. while(1)360. {361. error=0; //初始化error=0,即没有错误362. error+=s_measure((unsigned char*)&temp_val.i,&checksum,TEMP); //温度测量363. error+=s_measure((unsigned char*)&humi_val.i,&checksum,HUMI); //湿度测量364. if(error!=0) s_connectionreset(); ////如果发生错误,系统复位365. else366. {367. humi_val.f=(float)humi_val.i; //转换为浮点数368. temp_val.f=(float)temp_val.i; //转换为浮点数369. calc_sth10(&humi_val.f,&temp_val.f); //修正相对湿度及温度370. temp=temp_val.f*10;371. humi=humi_val.f*10;372. wendu[0]=temp/1000+'0'; //温度百位373. wendu[1]=temp%1000/100+'0'; //温度十位374. wendu[2]=temp%100/10+'0'; //温度个位375. wendu[3]=0x2E; //小数点376. wendu[4]=temp%10+'0'; //温度小数点后第一位377. displaywendu();378. shidu[0]=humi/1000+'0'; //湿度百位379. shidu[1]=humi%1000/100+'0'; //湿度十位380. shidu[2]=humi%100/10+'0'; //湿度个位381. shidu[3]=0x2E; //小数点382. shidu[4]=humi%10+'0'; //湿度小数点后第一位383. displayshidu();384. }385. delay(800); //等待足够长的时间,以现行下一次转换386. }387.}实用标准文案相关手册资料及源码下载地址:基于51单片机SHT11温湿度传感器检测程序相关资料文档大全。
基于51单片机的DHT11温湿度传感器
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++));//等待拉低
//if(flag==1)break;
cdata<<=1;
cdata=cdata|temp;
}
return cdata;
}
void getdth()
{
uchar i;
dth=0;
delayms(18);//18ms
dth=1;
//Delay_10us();
//Delay_10us();
//Delay_10us();
//Delay_10us();
i=4;while(i--);//延时40us
dth=1;
if(dth!=1)//dth11响应
数字温湿度传感器DHT11 操作C语言源代码
}
}
}
}
//*************************************
// 函数名称:CountDHT11
// 函数功能:计算湿度
// 入口参数:延时时间
// 出口参数:无
//***************************************/
for(i=0;i<5;i++) //清空数据缓存
{
aDHT11Data[i] = 0 ;
}
BSET_DHT11 ; //主机拉高 等待从机回应
//从DHT11读数据
Tmp = ReadDHT11Data(aDHT11Data) ;//
void CmdDHT11Data(void)
{
static uint16 Tcyc = 0 ;
static uint8 Tcon = 0 ;
static uint8 TNum = 0 ;
uint8 Tmp = 0 ;
uint16 wTmp = 0 ;
uint8 i ;
Tcyc ++ ;
if(Tcyc >= (VT_1S*VT_READDHT11)) //1s读取一次数据
{
Tcyc = 0 ;
F_ReadD11 = 1 ;
Tcon = 0 ;
}
if(F_ReadD11) //准备启动从机 1S动作一次
F_10MS = 0 ;
CmdDHT11Data() ; //读DHT11数据
CountHumidity() ; // 计算湿度
}
基于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单片机的DHT11数字温湿度计
#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intucharbyte,SH,SL,WH,WL,CHECK,FLAG;sbit LCDRS=P3^2;sbit LCDEN=P3^3;//sbit LCDRW=P2^2;sbit BUS=P3^4;void delay(ucharms) //精确1ms{uchari,j;for(i=ms*5;i>0;i--)for(j=100;j>0;j--);}void delay1() //约7us{uchari;for(i=3;i>0;i--);}/***************LCD配置**********************//********************bit check_busy()//检测busy{uchar temp;bit BB;LCDRS=0;LCDRW=1;LCDEN=1;P0=temp;delay(5);LCDEN=0;BB=(bit)(temp&0x80);//检测D7是否为1,为1则忙return BB;}*********************/voidwrite_com(uchar com){// while(check_busy());//检测LCD是否忙delay(5);LCDRS=0;// LCDRW=0;LCDEN=0;P1=com;delay(5);LCDEN=1;delay(5);LCDEN=0;}voidwrite_data(uchardat){// while(check_busy());//检测LCD是否忙delay(5);LCDRS=1;// LCDRW=0;LCDEN=0;P1=dat;delay(5);LCDEN=1;delay(5);LCDEN=0;}void dis(ucharadd,uchardat){delay(10);write_com(add);///送地址delay(5);write_data(dat);///送数据delay(5);}voidinit(){FLAG=0;delay(50);write_com(0x38);_nop_();write_com(0x0c);_nop_();write_com(0x06);_nop_();write_com(0x80);_nop_();write_com(0x01);_nop_();TMOD=0X01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}/*********************DHT11**********************/void start(){BUS=1; //起始总线为高电平_nop_();BUS=0; //主机拉低delay(25); //延时大于18msBUS=1; //主机拉高delay1();delay1();delay1();delay1();}ucharreceive_byte(){uchari,temp;for(i=0;i<8;i++){while(!BUS); //检测50us低电平延时是否结束delay1();delay1();delay1();delay1();temp=0; //26~28us为数据“0”if(BUS==1) //70us为数据“1”temp=1;while(BUS); //检测数据高电平结束byte<<=1; //数据存储在bite里,每次右移一位byte|=temp; //bite右移空位补零,然后与temp进行或运算,赋值给bite }return byte;}voidreceive_data(){uchar S_H,S_L,W_H,W_L,CHECK_;while(FLAG); //采集周期标志位start();BUS=1; //设定总线为输入状态while(BUS); //检测DHT响应低电平while(!BUS); //检测DHT拉高总线电平while(BUS); //检测80us后拉低电平S_H=receive_byte();S_L=receive_byte();W_H=receive_byte();W_L=receive_byte();CHECK_=receive_byte(); //40bit数据while(BUS);delay1();delay1();delay1();delay1();delay1();delay1();delay1();delay1();delay1(); //延时50usBUS=1; //总线经上拉电阻拉高CHECK=S_H+S_L+W_H+W_L; //校验运算if(CHECK==CHECK_) //校验{SH=S_H-7;SL=S_L;WH=W_H-1;WL=W_L;CHECK_=CHECK;}}/******************MAIN********************/ void main(){init();while(1){receive_data();/*********湿度*************/dis(0x80+0x01,'D');dis(0x80+0x02,'A');dis(0x80+0x03,'M');dis(0x80+0x04,':');dis(0x80+0x06,SH/10+0x30);dis(0x80+0x07,SH%10+0x30);dis(0x80+0x08,'.');dis(0x80+0x09,SL/10+0x30);dis(0x80+0x0a,SL%10+0x30);dis(0x80+0x0b,'%');dis(0x80+0x0c,'R');dis(0x80+0x0d,'H');/**********温度************/dis(0x80+0X41,'T');dis(0x80+0X42,'E');dis(0x80+0X43,'M');dis(0x80+0X44,':');dis(0x80+0x46,WH/10+0x30);//前为要显示的地址,dis(0x80+0x47,WH%10+0x30);//后为要显示的字符以及该字符对应的字符表的地址dis(0x80+0x48,'.');dis(0x80+0x49,WL/10+0x30);dis(0x80+0x4a,WL%10+0x30);dis(0x80+0x4c,0xdf);dis(0x80+0x4d,0x43);}}void timer0() interrupt 1{uchar t,t1;TH0=(65536-50000)/256;TL0=(65536-50000)%256;t++;if(t==20){t=0;t1++;if(t1==1) //采集周期{t1=0;FLAG=!FLAG;}}}。
SHT11程序代码
#ifndef __SHT11_H__#define __SHT11_H__/*************************SHT11相关命令**************************/#define TEM_TEST 0x03//温度检测命令#define HUM_TEST 0x05//湿度检测命令#define REG_READ 0x07//读寄存器#define REG_WRITE 0x06//写寄存器#define FUNCTION_SET 0x01//设置SHT11的工作精度为8位/湿度12位温度/**************************SHT11端口定义***************************/sbit SHT11_DATA=P2^0;sbit SHT11_SCK=P2^2;uchar flag_tempeture=0; //显示温度位置的标志uchar flag_humidity=0; //显示湿度位置的标志uchar code str1[]={ 0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//温度图标uchar code str6_sht11[]="%RH ";uchar code str4_sht11[]="humi=";uchar code str2_sht11[]="temp=";uchar code str7_sht11[]=" ";//清除没不要的显示/***************************函数名称:Delay()函数功能:SHT11内部延时****************************/void Delay(){ ;;}/***************************函数名称:Delay_Ms()函数功能:SHT11检测等待延时函数说明:11ms/55ms/210ms 分别对应8位/12位/14位测量结果对应的形参为N 则延时Nms****************************/void Delay_Ms(uint ms){uint i,j;for(i=ms;i>0;i--)for(j=112;j>0;j--);/**************************函数功能:SHT11启动时序***************************/void SHT11_Start(){SHT11_SCK=1;SHT11_DATA=1;Delay();SHT11_DATA=0;Delay();SHT11_SCK=0;Delay();SHT11_SCK=1;Delay();SHT11_DATA=1;}/******************************函数名称:SHT11_Sendbyte(uchar dat) 函数功能: 向SHT11发送8bite数据******************************/ void SHT11_Sendbyte(uchar dat){uchar i;SHT11_SCK=0;Delay();for(i=0;i<8;i++){if(dat&0x80){SHT11_DA TA=1;Delay();}else{SHT11_DA TA=0;Delay();}dat=dat<<1;SHT11_SCK=1;Delay();SHT11_SCK=0;}/*********************************函数名称SHT11_Answer():函数功能:检测SHT11的响应信号(在第九个时钟周期) ***********************************/void SHT11_Answer(){SHT11_SCK=1;Delay();while(SHT11_DATA==1);SHT11_SCK=0;SHT11_DATA=1;}/************************************函数名称:SHT11_Test_Finish()函数功能:检测SHT11温湿度检测是否完毕*************************************/void SHT11_Test_Finish(){while(SHT11_DATA==1);}/************************************函数名称:SHT11_Receivebyte()函数功能:从SHT11接收8bite数据*************************************/uchar SHT11_Receivebyte(){ uchar i;uchar dat;SHT11_SCK=0;Delay();for(i=0;i<8;i++){SHT11_SCK=1;Delay();dat=dat<<1;if(SHT11_DA TA){dat=dat|0x01;Delay();}else{dat=dat&0xfe;Delay();}SHT11_SCK=0;Delay();}SHT11_DATA=1; //释放数据总线return(dat);}/***********************************函数名称:MCU_Answer()函数功能:单片机向SHT11发送应答信号*************************************/void MCU_Answer(){SHT11_SCK=0;Delay();SHT11_DATA=0;Delay();SHT11_SCK=1;Delay();SHT11_SCK=0;Delay();SHT11_DATA=1; //释放数据总线这条指令非常重要不加的话导致单片机不能读取低8位}/***********************************函数名称:SHT11_End()当接收两个8byte数据后部接收CRC校验码************************************/void SHT11_End(){SHT11_DATA=1;SHT11_SCK=1;Delay();SHT11_SCK=0;Delay();}/*************************************函数名称:void SHT11_Write_Register(uchar command ,uchar dat)函数说明:向SHT11的状态寄存器设置功能command为REG_WRITE 0x06写寄存器dat为设置SHT11的功能可以设置检测的数据位数***************************************/void SHT11_Write_Register(uchar command ,uchar dat){SHT11_Start();SHT11_Sendbyte(command);SHT11_Answer();SHT11_Sendbyte(dat);SHT11_Answer();}/***************************************函数名称:uchar SHT11_Read_Register(uchar command)函数说明:command为REG_READ 0x07//读寄存器返回值为状态寄存器的值位6显示当前检测完一次数据后电源供电情况当位6为0时表明VDD>2.47V 当位6为1时表明VDD<2.47V即电量不足位0表明当前的测量分辨率当位0为1时表明测量精度:8位/湿度12位温度当位0为0时表明测量精度:12位湿度14位温度默认为0*******************************************/uchar SHT11_Read_Register(uchar command){uchar dat;SHT11_Start();SHT11_Sendbyte(command);SHT11_Answer();dat=SHT11_Receivebyte();SHT11_End();return(dat);}/***************************************函数名称:SHT11_Measure(uchar command,uint time);函数功能:设置SHT11检测功能,并返回相应的检测结果函数说明:command形参用于设定温度检测还是湿度检测,time形参用于设定检测过程中的等待时间,以确定检测结果的位数11ms/55ms/210ms 分别对应8位/12位/14位****************************************/uint SHT11_Measure(uchar command,uchar time){uint dat=0;uchar data_high,data_low;SHT11_Start();SHT11_Sendbyte(command);SHT11_Answer();Delay_Ms(time);SHT11_Test_Finish();data_high=SHT11_Receivebyte();MCU_Answer();data_low=SHT11_Receivebyte();SHT11_End();dat=(dat|data_high);dat=(dat<<8)|data_low;return(dat);}/****************************************函数名称:Convert_Tempeture(uint dat);函数功能:将检测到的数据转化为相应的温度数据函数说明:温度转换公式--T=d1+d2*SOt公式中的参数d1=-40,d2=0.01适用于14位测量精度*****************************************/float SHT11_Convert_Tempeture14bit(uint dat){float tempeture1;tempeture1=-40+0.01*dat;if(tempeture1>100.0){flag_tempeture=1;}else if(tempeture1<0.0){flag_tempeture=1;}else{flag_tempeture=0;}return(tempeture1);}/*****************************************函数名称:SHT11_Convert_Humidity(uint dat,float temp)函数功能:将检测到的数据转化为相应的湿度数据函数说明:相对湿度转换公式-----RHline=C1+C2*SOrh+C3*SOrh*SOrh(检测数据的线性化SOrh为单片机接收到的数据)-----RHtrue=(tempeture-25)*(t1+t2*SOrh)+RHline公式中的参数:C1=-4,C2=0,0405,C3=-0.0000028t1=0.01,t2=0.00008适用于12位测量精度******************************************/float SHT11_Convert_Humidity12bit(uint dat,float temp) {float RHline,RHtrue;RHline=-4+0.0405*dat-0.0000028*dat*dat;RHtrue=(temp-25)*(0.01+0.00008*dat)+RHline;if(RHtrue<10.0){flag_humidity=1;}else{flag_humidity=0;}return(RHtrue);}/****************************************函数名称:Convert_Tempeture12bit(uint dat);函数功能:将检测到的数据转化为相应的温度数据函数说明:温度转换公式--T=d1+d2*SOt公式中的参数d1=-40,d2=0.04适用于12位测量精度float SHT11_Convert_Tempeture12bit(uint dat){float tempeture1;tempeture1=-40+0.04*dat;if(tempeture1>100.0){flag_tempeture=1;}else{flag_tempeture=0;}return(tempeture1);}*****************************************//*****************************************函数名称:SHT11_Convert_Humidity8bit(uint dat,float temp)函数功能:将检测到的数据转化为相应的湿度数据函数说明:相对湿度转换公式-----RHline=C1+C2*SOrh+C3*SOrh*SOrh(检测数据的线性化SOrh为单片机接收到的数据)-----RHtrue=(tempeture-25)*(t1+t2*SOrh)+RHline公式中的参数:C1=-4,C2=0,648,C3=-0.00072t1=0.01,t2=0.00128适用于12位测量精度float SHT11_Convert_Humidity8bit(uint dat,float temp){float RHline,RHtrue;RHline=-4+0.648*dat-0.00072*dat*dat;RHtrue=(temp-25)*(0.01+0.00128*dat)+RHline;if(RHtrue<10.0){flag_humidity=1;}else{flag_humidity=0;}return(RHtrue);}******************************************/#endif。
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。