51单片机Nokia5110的温湿度传感器DHT11温湿度显示的程序

合集下载

51单片机Nokia5110的温湿度传感器DHT11温湿度显示的程序

51单片机Nokia5110的温湿度传感器DHT11温湿度显示的程序
goto DHT_start;
//返回到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详解及例程利用串口显示

数字温湿度传感器DHT11详解及例程利用串口显示

数字温湿度传感器DHT111、概述DHTxx 系列数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。

它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。

传感器包括一个电阻式测湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。

因此,该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。

每个DHTxx传感器都在极为精确的湿度校验室中进行校准。

校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。

单线制串行输出接口,使系统集成变得简易快捷。

超小的体积、极低的功耗,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。

本产品为 4 针单排引脚封装,特殊封装形式可根据用户需求而提供。

2、产品特性湿温度传感器的一体化结构能相对的同时对相对湿度和温度进行测量。

数字信号输出,从而减少用户信号的预处理负担。

单总线结构输出有效的节省用户控制器的I/O口资源。

并且,不需要额外电器元件。

独特的单总数据传输线协议使得读取传感器的数据更加便捷。

全部校准。

编码方式为8位二进制数。

40bit 二进制数据输出。

其中湿度整数部分占1Byte,小数部分1Byte;温度整数部分1Byte,小数部分1Byte。

其中,湿度为高16位。

最后1Byte为校验和。

卓越的长期稳定性,超低功耗。

4引脚安装,超小尺寸。

各型号管脚完全可以互换。

测量湿度范围从20%RH到90%RH;测量温度范围从0℃到50℃。

适用范围包括恒湿控制,消费家电类产品,温湿度计等领域。

3、外型与引脚排列引脚说明:Vcc 正电源Dout 输出NC 空脚GND 地- 1 -图3.0 DHT外型及管脚4、详细引脚说明:传感器管脚方向识别:正面(有通气孔的一面)看过去,从左到右依次为1、2、3、4脚。

电源引脚,DHTxx的供电电压为 3.5~5.5V。

传感器上电后,要等待1s 以越过不稳定状态在此期间不要发送任何指令。

单片机温度湿度控制程序(dht11)

单片机温度湿度控制程序(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;//无低电平。

基于51单片机的温湿度DHT11采集(word文档良心出品)

基于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度•经过上述分析,方案一虽然精度更精确。

DHT11温湿度传感器驱动程序 C51单片机

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温控程序-可设置温度值基于51单片机的温湿度测量控制程序,使用DHT11数字传感器,用1602液晶屏显示,按键定义如下:sbit key_1=P0^1; //确定按键sbit key_2=P0^2; //按键加sbit key_3=P0^3; // 按键减本程序中用到的头文件 12c5a.h下载:/f/12c5a.rar#include &quot;12c5a.H&quot;#include &quot;intrins.h&quot;unsigned char codenum[]={&quot;0123456789&quot;};//显示字符存储unsigned char codestart_char[]={&quot;Loading....&quot;};unsigned char code t_char[]={&quot;NOW TEMPIS&quot;};unsigned char *pnum=num;unsigned int bbb,ccc,temp,temp_high,temp_low;#define ADC_POWER0x80//ADC power control bit#define ADC_FLAG0x10//ADC complete flag#define ADC_START0x08//ADC start control bit#define ADC_SPEEDLL0x00//540 clocks#define ADC_SPEEDL0x20//360 clocks#define ADC_SPEEDH0x40//180 clocks#define ADC_SPEEDHH0x60//90 clockssbit RS=P3^4; //数据命令选择端sbit RW=P3^5; //读写控制端sbit E=P3^6;//使能信号控制端//sbit key_0=P0^0; //设置按键sbit key_1=P0^1; //确定按键sbit key_2=P0^2; //按键加sbit key_3=P0^3; // 按键减sbit P04=P0^4;sbit P05=P0^5;sbit P06=P0^6;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();while (!(ADC_CONTR & ADC_FLAG));//Wait complete flagADC_CONTR =0x80;//Close ADCm=ADC_RES;n=ADC_RESL;aaa=m*4+n;return aaa;}void start_init(void){unsigned char i;WR_data_1602(0x80,0);//显示在第一行for(i=0;i;temp_high-5) {P04=1;P05=0;P06=1;}//上限25else if(temp<temp_low+5) {P04=0;P05=1;P06=1;} // 下限20else {P04=1;P05=1;P06=0;}}void init_1602(void) //初始化{WR_data_1602(0x38,0);WR_data_1602(0x01,0);WR_data_1602(0x06,0);WR_data_1602(0x0c,0);}void WR_data_1602(unsigned char adata,unsigned char i) //写数据i=1,写指令i=0{P2=adata;RS=i;RW=0;E=1;delay_1602(1);E=0;RW=1;RS=0;void process(unsigned int shuju)//显示数据处理{unsigned int a,b,c,d;a=shuju/1000;b=(shuju%1000)/100;c=(shuju%100)/10;d=shuju%10;if(a==0&&b!=0){WR_data_1602(0xc2,0);WR_data_1602(*(pnum+b),1);WR_data_1602(*(pnum+c),1);WR_data_1602('.',1);WR_data_1602(*(pnum+d),1);WR_data_1602('C',1);}if(a==0&&b==0){WR_data_1602(0xc2,0);WR_data_1602(*(pnum+c),1);WR_data_1602('.',1);WR_data_1602(*(pnum+d),1);WR_data_1602('C',1);WR_data_1602(' ',1);}//WR_data_1602(0xc1,0);//显示在第二行//WR_data_1602(' ',1);//WR_data_1602(*(pnum+a),1); //WR_data_1602(*(pnum+b),1); //WR_data_1602(*(pnum+c),1); //WR_data_1602('.',1);//WR_data_1602(*(pnum+d),1); //WR_data_1602('C',1);delay_1602(1);}void main()//主函数{unsigned int mm;init_1602();//初始化start_init();mm=GetResult();temp_high=250;temp_low=90;while(1){key_scan();baojing();ccc=GetResult(); temp=ccc*5.0;process(temp); delay_1602(10); }}。

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();。

温湿度DHT11 51程序

U8FLAG=2;
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)

温湿度一体化传感器DHT11可用程序

/****************************************************************** DHT11.h 的驱动程序。

用于温湿度一体传感器DHT11的驱动程序。

单片机为STC89C52,晶振频率为11.0592MHz。

单线串口,记得不要接到P3口上,会出现未知问题。

口上,会出现未知问题。

的说明书来编程。

时序要求很严格,建议详细参照DHT11的说明书来编程。

*******************************************************************/ #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit dht_dat=P1^0; //用哪个I/O口自选,注意不要用P3口uchar dht_t1=0,dht_t2=0; //依次为温度整数部分和温度小数部分依次为温度整数部分和温度小数部分uchar dht_d1=0,dht_d2=0; //依次为湿度整数部分和湿度小数部分依次为湿度整数部分和湿度小数部分uchar dht_chk=0; //和校验,可选择是否使用,具体参照数据手册和校验,可选择是否使用,具体参照数据手册 uchar dht_num=0; //用于while循环中计数,超时则跳出循环循环中计数,超时则跳出循环#ifndef __INF_NEC__ #define __INF_NEC__ extern void dht_delay_10us(); extern void dht_delay_10ms(uchar t); extern uchar dht_readat(); extern void dht_getdat(); extern void dht_init(); #endif void dht_delay_10us() //自己调,一定要尽量精确到10us,很重要,很重要{ uchar i=0; for(i=0;i<1;i++); } void dht_delay_10ms(uchar t) //大概10ms就行,粗略延时就行,粗略延时{ uchar i=0,j=0,k=0; for(i=0;i<t;i++) { for(j=0;j<40;j++)for(k=0;k<75;k++); } } uchar dht_readat() //接收一个8位数据,先高位后低位位数据,先高位后低位{ uchar i=0,dat=0; for(i=0;i<8;i++) { dht_num=2; while((dht_dat==0)&&(dht_num++)); dht_delay_10us();dht_delay_10us();dht_delay_10us();dht_delay_10us(); dat=dat<<1; if(dht_dat==1) { dht_num=2; dat=dat|0x01; while((dht_dat==1)&&(dht_num++)); } } return dat; } void dht_getdat() //给DHT11一个开始信号,然后读取一次数据,共五个8位字节位字节 { uchar i=0; dht_dat=0; dht_delay_10ms(4); dht_dat=1; //单片机给起始脉冲信号单片机给起始脉冲信号dht_delay_10us();dht_delay_10us();dht_delay_10us();dht_delay_10us(); dht_dat=1; //稍作延时,等待DHT11返回响应(响应为低电平)返回响应(响应为低电平) if(dht_dat==0) //有响应才接收数据,否则不作处理有响应才接收数据,否则不作处理{ dht_num=2;while((dht_dat==0)&&(dht_num++)); dht_num=2;while((dht_dat==1)&&(dht_num++)); dht_d1=dht_readat(); dht_d2=dht_readat(); dht_t1=dht_readat(); dht_t2=dht_readat(); dht_chk=dht_readat();//一次读出五个数据一次读出五个数据} dht_dat=1; //释放总线释放总线dht_delay_10ms(10); //稍作延时稍作延时} void dht_init() //DHT11的初始化函数,别忘了写程序时先加上之的初始化函数,别忘了写程序时先加上之{ dht_delay_10ms(100); //DHT11上电前准备时间,大概1s dht_dat=1; //总线准备总线准备} 说明:各位朋友请注意一点,如果用STC89C52系列单片机的话,用单线串口原件与之连接时注意不要接到P3的八个口上。

dht11温湿度传感器驱动程序

/* 本程序适用于DHT11温湿度传感器由于DHT11使用拉高总线的不同时常来代替0和1 0 28US 1 70us 同时数据送入1602a显示*/#include<reg52.h>#include<intrins.h>#include<math.h>#define Data P0//数据端口sbit RS = P2^4; //Pin4sbit RW = P2^5; //Pin5sbit E = P2^6; //Pin6sbit dat=P1^2;unsigned int shidu_h=0,shidu_l=0,wendu_h=0,wendu_l=0,i,xiaoyan=0;//定义湿度温度变量unsigned char code tab[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//定义1602a显示0-9unsigned int a[16]={0} ;void delayus(unsigned char i) //延时2us{while(--i);}void delayms(unsigned char j) //延时1ms{while(--j){delayus(125);delayus(125);delayus(125);delayus(125);}}/*************************************************** ***************//* 写入命令函数1602 *//*************************************************** ***************/void WriteCommand(unsigned int c){delayms(10);//操作前短暂延时,保证信号稳定代替状态监测E=0;RS=0;_nop_();E=1;Data=c;E=0;}/*************************************************** ***************//* 写入数据函数*//*************************************************** ***************/void WriteData(unsigned char c){delayms(10);;//操作前短暂延时,保证信号稳定E=0;RS=1;RW=0;_nop_();E=1;Data=c;E=0;}/*************************************************** ***************//* 写入字节函数*//*************************************************** ***************/void ShowChar(unsigned char pos,unsigned int c){unsigned char p;if (pos>=0x10)p=pos+0xb0; //是第二行则命令代码高4位为0xc p低两位表示位置显示代码只用DDRAM前16位elsep=pos+0x80; //是第一行则命令代码高4位为0x8 p低两位表示位置显示代码只用DDRAM前16位WriteCommand (p);//写命令写入数据指针确定行中哪一位显示WriteData (c); //写数据}/******************************************************************//* 写入字符串函数*//*************************************************** ***************/void ShowString (unsigned char line,unsigned int *ptr){unsigned char l,i;//l表示行中某一位显示l=line<<4; //L为0x01时左移四位为了与b0H相加变为0xc for (i=0;i<16;i++)ShowChar (l++,*(ptr+i));//循环显示16个字符}/*************************************************** ***************//* 初始化函数*//*************************************************** ***************/void InitLcd(){WriteCommand(0x38); //display modeWriteCommand(0x38); //display modeWriteCommand(0x38); //display modeWriteCommand(0x06); //显示光标移动位置WriteCommand(0x0c); //显示开及光标设置WriteCommand(0x01); //显示清屏}void main(void){InitLcd(); //初始化LCDdelayms(30);while(1){dat=0;delayms(18);//延时18ms拉低主线dat=1;//主机拉高总线/*delayus(20);*/_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_no p_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_no p_();_nop_();_nop_();_nop_();while(!dat);//判断从机是否相应完毕相应完毕会拉高总线while(dat);//等待从机拉高总线准备开始传送数据while(!dat);//判断是否开始1bit 开始会拉高总线for(i=0;i<8;i++){shidu_h<<=1; //右移1位delayus(14); //延时30us判断是否为1if(dat){shidu_h++;}while(dat);//为一则等待从机拉低总线为零直接跳出while(!dat);//判断是否开始1bit 开始会拉高总线}for(i=0;i<8;i++){delayus(14);shidu_l<<=1;if(dat){shidu_l++;}while(dat);}for(i=0;i<8;i++) {delayus(14); wendu_h<<=1; if(dat){wendu_h++; }while(dat); while(!dat);}for(i=0;i<8;i++) {delayus(14); wendu_l<<=1; if(dat){wendu_l++;}while(dat);}for(i=0;i<8;i++){delayus(14);xiaoyan<<=1;if(dat){xiaoyan++;}while(dat);while(!dat);}{a[0]=tab[(wendu_h)/10]; a[1]=tab[(wendu_h)%10]; a[2]=tab[(shidu_h)/10];a[3]=tab[(shidu_h)%10];a[4]=tab[xiaoyan/10];a[5]=tab[xiaoyan%10];ShowString(0,a);}delayms(100);shidu_h=0;wendu_h=0;shidu_l=0;wendu_l=0;xiaoyan=0;}}教你如何用WORD文档(2012-06-27 192246)转载▼标签:杂谈1. 问:WORD 里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同?答:分节,每节可以设置不同的页眉。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机晶振为11.0592MHz,LCD液晶显示用Nokia5110,当然用LCD1602也可以,只是要把显示部分的函数换了,温湿度传感器用DHT11。

LCD、DHT11、以及蜂鸣器用到的引脚在PUBLIC.H中有定义。

只要把相关文件添加进工程即可WKC.C如下#define uchar unsigned char#define uint unsigned intuchar timer0_count;//主函数入口void main(){TMOD=0x01;TH0=0x4B;TL0=0xFF;ET0=1;EA=1;TR0=1;LCD_init(); //初始化LCD模块while(1);}//定时器0中断服务函数void timer0() interrupt 1{TH0=0x4B;TL0=0xFF;timer0_count++;if(timer0_count==20){Scan_DHT11();timer0_count=0;}}LCD5110.c如下#include<reg52.h>#include "PUBLIC.h"#define uchar unsigned char#define uint unsigned int//字符6X12,阳码,列行式,逆向,十六进制unsigned char code mychar[]={0x00,0xE0,0x10,0x88,0x78,0x00,0x00,0x03,0x03,0x00,0x00,0x00,/*"0",0*/0x00,0x00,0xC0,0x30,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,/*"1",1*/0x00,0x80,0x80,0xF0,0x80,0x00,0x00,0x03,0x03,0x00,0x00,0x00,/*"2",2*/0x00,0x40,0x48,0xF8,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,/*"3",3*/0x78,0x80,0xF0,0x40,0x40,0x20,0x00,0x00,0x03,0x00,0x00,0x00,/*"4",4*/ 0x00,0xF0,0x20,0x20,0x20,0x00,0x02,0x03,0x00,0x00,0x00,0x00,/*"5",5*/ 0x00,0x80,0xC0,0xB0,0x88,0x00,0x00,0x03,0x02,0x02,0x01,0x00,/*"6",6*/ 0x00,0x00,0x88,0x48,0x30,0x00,0x00,0x03,0x00,0x00,0x00,0x00,/*"7",7*/ 0x00,0x88,0x58,0xE8,0x10,0x00,0x01,0x02,0x02,0x01,0x00,0x00,/*"8",8*/ 0x00,0x30,0xA8,0x78,0x10,0x00,0x00,0x02,0x01,0x00,0x00,0x00,/*"9",9*/ 0x20,0x20,0xE0,0x30,0x18,0x08,0x00,0x00,0x03,0x02,0x01,0x00,/*"t",10*/ 0x00,0xC0,0x38,0xE6,0x00,0x80,0x03,0x00,0x00,0x00,0x01,0x00,/*"h",11*/ 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,/*":",12*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",13*/ };/*******************************************Nokia5110液晶写一个字节的函数入口参数dt,command功能写数据或写命令1为数据,0为命令*******************************************/void LCD_write_byte(uchar dt, uchar command){uchar i;sce=0;dc=command;for(i=0;i<8;i++){if(dt&0x80)sdin=1;elsesdin=0;dt=dt<<1;sclk=0;sclk=1;}dc=1;sce=1;sdin=1;}/*******************************************Nokia5110初始化函数入口参数无功能初始化LCD*******************************************/void LCD_init(void){res=0;delayus(10,3,220);res=1;LCD_write_byte(0x21,0);//初始化Lcd,功能设定使用扩充指令LCD_write_byte(0xC6,0);//设定液晶偏置电压LCD_write_byte(0x06,0);//温度校正LCD_write_byte(0x13,0);;//1:48LCD_write_byte(0x20,0);//使用基本指令LCD_write_byte(0x0C,0);//设定显示模式,正常显示LCD_clear(); //清屏幕}/*******************************************Nokia5110坐标设置入口参数X,Y功能设置坐标0<X<83;0<Y<5*******************************************/void LCD_set_XY(uchar X, uchar Y){LCD_write_byte(0x40 | Y, 0);// columnLCD_write_byte(0x80 | X, 0);// row}/*******************************************Nokia5110液晶清屏函数入口参数无功能清屏*******************************************/void LCD_clear(void){uchar t;uchar k;LCD_set_XY(0,0);for(t=0;t<6;t++){for(k=0;k<84;k++){LCD_write_byte(0x00,1);}}}/*******************************************在LCD指定位置写一个字符入口参数row,page,c功能在LCD5110指定位置写打印一个字符*******************************************/void LCD_write_char(unsigned char row, unsigned char page,unsigned char c) //row:列page:页dd:字符unsigned char i;LCD_set_XY(row*6, page);// 列,页for(i=0; i<6;i++){LCD_write_byte(mychar[c*12+i],1);}LCD_set_XY(row*6, page+1);// 列,页for(i=6; i<12;i++){LCD_write_byte(mychar[c*12+i],1);}}DHT11.c如下#include <reg52.h>#include "PUBLIC.h"#define uchar unsigned char#define uint unsigned intunsigned char DHT_Data[5];//将温湿度的值写在LCD上void Dis_DHT_Data(void){uchar i;for(i=0;i<12;i++)LCD_write_char(i,0,13);i=0;//显示T:温度LCD_write_char(i++,0,10);//tLCD_write_char(i++,0,12);//:if((DHT_Data[2]/100)!=0)LCD_write_char(i++,0,DHT_Data[2]/100);if((DHT_Data[2]/100)!=0||((DHT_Data[2]%100)/10)!=0) LCD_write_char(i++,0,(DHT_Data[2]%100)/10);LCD_write_char(i++,0,(DHT_Data[2]%100)%10);i=6;//显示H:湿度LCD_write_char(i++,0,11);LCD_write_char(i++,0,12);if((DHT_Data[0]/100)!=0)LCD_write_char(i++,0,DHT_Data[0]/100);if((DHT_Data[0]/100)!=0||((DHT_Data[0]%100)/10)!=0) LCD_write_char(i++,0,(DHT_Data[0]%100)/10);LCD_write_char(i++,0,(DHT_Data[0]%100)%10);BEEP=(DHT_Data[2]<0x28); //报警温度为40°C//获取温湿度的值void Scan_DHT11(void){uchar i,j;uchar k=0;DHT_start:DHT=0;delayus(20,3,220);//延时20msDHT=1;delayus(1,1,15);while(DHT==1);delayus(1,1,28);while(DHT==0);delayus(1,1,28);while(DHT==1);for(i=0;i<5;i++)for(j=0;j<8;j++){while(DHT==0);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]))) {k++;goto DHT_start;//返回到DHT_start处}k=0;Dis_DHT_Data();}PUBLIC.C如下#include<reg52.h>#include "PUBLIC.h"#define uchar unsigned char#define uint unsigned intvoid delayus(uchar a,uchar b,uchar c){//延时时间a的值b的值c的值延时误差(us)//10us 1 1 1 -0.5//20us 1 1 8 0//30us 1 1 15 +0.5//40us 2 1 9 0//50us 1 1 28 0//60us 1 1 35 +0.5//70us 1 1 42 +1//80us 1 1 48 0//90us 1 1 55 +0.5//100us 1 1 61 -0.5//200us 1 1 128 0//300us 3 1 63 +1.5//400us 2 1 129 0//500us 5 1 63 +0.5//600us 6 1 63 0//700us 7 1 63 -0.5//800us 1 3 175 +0.5//900us 9 1 63 -1.5//1ms 1 3 219 -1.5//2ms 2 3 220 +3//3ms 3 3 220 +3//Xms X 3 220 +3for(a=0;a<1;a++)for(b=0;b<1;b++)for(c=0;c<1;c++);}PUBLIC.H如下#ifndef _PUBLIC_H_#define _PUBLIC_H_//声明延时函数作用域为整个工程extern void delayus(unsigned char a,unsigned char b,unsigned char c);extern void Scan_DHT11(void);extern void LCD_init(void);extern void LCD_clear(void);extern void LCD_write_char(unsigned char row,unsigned char page,unsigned char c); extern void LCD_write_byte(unsigned char dt, unsigned char command);extern unsigned char DHT_Data[5];sbit res = P0^7; //复位,0复位sbit sce = P0^6; //片选sbit dc = P0^5; //1写数据,0写指令sbit sdin = P0^4; //数据sbit sclk = P2^7; //时钟sbit D HT = P0^3; //DHT11的datasbit BEEP = P0^2; //蜂鸣器#endif实际效果:。

相关文档
最新文档