SHT11温湿度传感器与1602应用的程序代码

合集下载

Arduino从DHT11读取温湿度数据并显示在1602LCD

Arduino从DHT11读取温湿度数据并显示在1602LCD

Arduino从DHT11读取温湿度数据并显⽰在1602LCD硬件清单Arduino NANO1602LCD + PCF8574T模块YL-47 DHT11模块连线1. 连接LCD: PCF8574T模块4pin(Gnd, Vcc, SDA i2c数据, SCL i2c时钟) 连接⾄Arduino接⼝ Gnd -> Gnd, Vcc -> Vcc, SDA -> A4, SDL -> A52. 连接YL-47 DHT11: Gnd -> Gnd, Vcc -> Vcc, Data-> D4Library除了1602需要的库以外, 需要安装两个⾃带的库: DHT Sensor Library by Adafruit, Adafruit Unified Sensor测试代码#include <Wire.h>#include <LiquidCrystal_I2C.h>#include <DHT.h>#define DHTPIN 4#define DHTTYPE DHT11// I2C地址, ⼀般为0x3F, 0x20或0x27LiquidCrystal_I2C lcd(0x27,16,2);// 初始化DHTDHT dht(DHTPIN, DHTTYPE);void setup() {lcd.init();lcd.backlight(); // 打开背光Serial.begin(9600);dht.begin();lcd.setCursor(0,0); // line 0, pos 0lcd.print("Good Day!");lcd.setCursor(0,1); // line 1, pos 0lcd.print("H: % T:");delay(1000);}void loop() {// Reading temperature or humidity takes about 250 milliseconds!// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)float h = dht.readHumidity();// Read temperature as Celsius (the default)float t = dht.readTemperature();// Read temperature as Fahrenheit (isFahrenheit = true)float f = dht.readTemperature(true);// Check if any reads failed and exit early (to try again).if (isnan(h) || isnan(t) || isnan(f)) {Serial.println("Failed to read from DHT sensor!");return;}// Compute heat index in Fahrenheit (the default)float hif = puteHeatIndex(f, h);// Compute heat index in Celsius (isFahreheit = false)float hic = puteHeatIndex(t, h, false);Serial.print("Humidity: ");Serial.print(h);Serial.print(" %\t");Serial.print("Temperature: ");Serial.print(t);Serial.print(" *C ");Serial.print(f);Serial.print(" *F\t");Serial.print("Heat index: ");Serial.print(hic);Serial.print(" *C ");Serial.print(hif);Serial.println(" *F");lcd.setCursor(2,1); // line 1, pos 0lcd.print(h);lcd.setCursor(11,1); // line 1, pos 0lcd.print(t);delay(1000);}代码说明1. DHT11启动到读取数据需要等待1~2秒2. 温湿度的精度都为1, 没有⼩数部分3. DHT库⾥⾯带了计算热指数的⽅法 computeHeatIndex(), ⽤于⽣成综合温湿度计算得到的热指数值改进拼接字符串改进后的代码, 注意: arduino⾥的sprintf只能格式化整数, 不能格式化浮点#include <Wire.h>#include <LiquidCrystal_I2C.h>#include <DHT.h>#include <DS3231.h>#define DHTPIN 4#define DHTTYPE DHT11// I2C地址, ⼀般为0x3F, 0x20或0x27LiquidCrystal_I2C lcd(0x27,16,2);DHT dht(DHTPIN, DHTTYPE);DS3231 Clock;bool century=false;bool h12;bool PM;void setup() {lcd.init();//lcd.backlight(); // 打开背光Serial.begin(9600);dht.begin();lcd.setCursor(0,0); // line 0, pos 0lcd.print("Good Day Jessie~~");lcd.setCursor(0,1); // line 1, pos 0lcd.print("H: % T: T:");delay(1000);}void loop() {char str[17];sprintf(str,"%02d-%02d %02d:%02d:%02d ",Clock.getMonth(century),Clock.getDate(),Clock.getHour(h12, PM),Clock.getMinute(),Clock.getSecond());lcd.setCursor(0,0); // line 0, pos 0lcd.print(str);// Reading temperature or humidity takes about 250 milliseconds!// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)float h = dht.readHumidity();// Read temperature as Celsius (the default)float t = dht.readTemperature();// Read temperature as Fahrenheit (isFahrenheit = true)float f = dht.readTemperature(true);// Check if any reads failed and exit early (to try again).if (isnan(h) || isnan(t) || isnan(f)) {Serial.println("Failed to read from DHT sensor!");return;}// Compute heat index in Fahrenheit (the default)float hif = puteHeatIndex(f, h);// Compute heat index in Celsius (isFahreheit = false)float hic = puteHeatIndex(t, h, false);Serial.print("Humidity: ");Serial.print(h);Serial.print(" %\t");Serial.print("Temperature: ");Serial.print(t);Serial.print(" *C ");Serial.print(f);Serial.print(" *F\t");Serial.print("Heat index: ");Serial.print(hic);Serial.print(" *C ");Serial.print(hif);Serial.println(" *F");lcd.setCursor(2,1); // line 1, pos 0lcd.print((int)h);lcd.setCursor(8,1); // line 1, pos 0lcd.print((int)t);lcd.setCursor(13,1);lcd.print((int)(Clock.getTemperature()*10)); delay(1000);}。

C51温湿度传感器DHT11驱动LCD1602显示程序

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否则读取的是0//通过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();bit11显示数据的脉长//--------------------------------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) 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;}//ifLCD1602 文件#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。

DHT11温湿度传感器程序

DHT11温湿度传感器程序
DDRD = 0XFF; //配置端口PD全部为输出口,LCD 数据端口
//LCD 控制端口设置
PORTA &= ~((1 << RS) | (1 << RW) | (1 << E)); //
DDRA |= (1 << RS) | (1 << RW) | (1 << E);
}
if(Reset())
{ P_DHT;
while((!(I_DHT)) && ((u16Flag++)<50000));
ReceiveValue = 0;
ReceiveValue1 = 0;
u16Flag = 0;
while((I_DHT) && ((u16Flag++)<50000));
#include <avr/io.h>
#include <util/delay.h>
//口定义
#define PORT_DHT PORTC
//口方向定义
#define DDR_DHT DDRC
//读取口定义
#define PIN_DHT PINC
//数据位定义
#define BIT_DHT PC4
void Write_Data_Byte(unsigned char LCD_Data); //LCD 写字节数据
void Write_Place_xy(unsigned char x,unsigned char y); //指定当前写字符的位置
void Write_Data_String(unsigned char x,unsigned char y,unsigned char *data);//在指定的(x,y)位置上写入字符串数据

Arduino零基础C语言编程+ I2C LCD1602 液晶模块

Arduino零基础C语言编程+ I2C LCD1602 液晶模块
5. 11 实时温湿度检测器— 温湿度传感器+ I2C LCD1602 液 晶模块
本节来实现一个实时温湿度检测器,只需要一个 DHT11 温 湿度传感器就能做到,再外加个 1602 的显示屏,实时查看数 据。如果外加网络模板,数据不仅能实时显示,还能放到网上, 或者通过微博发布出去,是不是很心动了呢?那就先做个最简 单的,本地实时显示数据。
• 所需材料 1× DHT11 温湿度传感器
1× I2C LCD1602 液晶模块
2020/12/2
Arduino零基础 C语 言编程
1
5. 11 实时温湿度检测器— 温湿度传感器+ I2C LCD1602 液 晶模块
硬件连接
• DHT11 温湿度传感器->数字口 4 • LCD GND ->GND • LCD VCC -> 5V • LCD SDA -> SDA • LCD SCL -> SCL • A0,A1,A2 全部插上跳冒
2020/12/2
Arduino零基础 C语 言编程
4
2020/12/2
Arduino零基础 C语 言编程
2
5. 11 实时温湿度检测器— 温湿度传感器+ I2C LCD1602 液 晶模块
• 输入代码
下载代码之前,把库“dht11”和“LiquidCrystal_I2C”放 入 Arduino IDE 的 libraries中。 • 代码回顾
LiquidCrystal_I2C lcd(0x20,16,2); 0x20:I2C 地址:短路帽插上为0,拔掉为1
2020/12/2
Arduino零基础 C语 言编程
3
5. 11 实时温湿度检测器— 温湿度传感器+ I2C LCD1602 液 晶模块

基于单片机SHT 温湿度传感器检测程序

基于单片机SHT 温湿度传感器检测程序

基于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);?//等待足够长的时间,以现行下一次转换}}相关手册资料及源码下载地址:。

dht11温湿度传感器驱动程序

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 里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同?答:分节,每节可以设置不同的页眉。

基于Hs1101和1602显示的单片机湿度程序

基于Hs1101和1602显示的单片机湿度程序

#include "reg51.h"#define uchar unsigned char#define uint unsigned intlong int f;long int k,q;sbit rs=P2^6;sbit rw=P2^5;sbit ep=P2^7;uchar code table1[10]={" humidity="};uchar code table2[13]={"0123456789%. "}; uchar code table3[6]={"wait.."};void delay(int ms){ // 延时子程序int i;while(ms--){for(i = 0; i<2; i++);}}void writec(unsigned char cmd){rs=0;rw=0;ep=0;P0=cmd;delay(1);ep=1;delay(1);ep=0;}void writed(unsigned char date){rs=1;rw=0;ep=1;delay(1);ep=0;}void Init_timer(){TMOD=0x51; //0101 0001 定时器0在模式1下工作16位定时器,定时方式定时器1在模式1下工作16位计数器,T1负跳变加1TL0=0x00; //定时器0初值定时50000usTH0=0x4C;TL1=0x00; //定时器1清零TH1=0x00;ET0=1; //使能定时器0中断ET1=1; //使能定时器1中断EA=1; //使能总中断TR0=1; //开始计时TR1=1;}void init(){writec(0x38);//delay(1);writec(0x0c);//delay(1);writec(0x06);//delay(1);writec(0x01); //清除LCD的显示内容}void display(int l){int a,b,c,d,e;a=l/10000;b=l/1000;l%=1000;c=l/100;l%=100;d=l/10;l%=10;e=l;writec(0xc8);if((a==0)&&(b==0))writed(table2[0]);else if((a==0)&&(b!=0))writed(table2[b]);else{writed(table2[a]);writed(table2[b]);}writed(table2[c]);writed(table2[11]);writed(table2[d]);writed(table2[e]);writed(table2[10]);/* writed(table2[a]);writed(table2[b]);writed(table2[11]);writed(table2[c]);writed(table2[d]);writed(table2[e]);writed(table2[10]); */}//初值/**************************************************************************** * 名称:timer0()* 功能:定时器1,每50000us中断一次。

DHT11测温湿度程序lcd1602显示

DHT11测温湿度程序lcd1602显示

DHT11测温湿度程序lcd1602显示#include<reg52.h>#include<intrins.h>#define uchar unsigned char #define uint unsigned int #define Data P0 // 数据端口sbit RS=P2A4;sbit RW=P2A5;sbit E=P2A6;sbit DHT=P1A0;uchar FirstLine[] ="wen:00.00"; // 第一行数据uchar SecondLine[]="shi:00.00"; // 第二行数据unsigned char shiZ,shiX,wenZ,wenX,check;unsigned char tr_shiZ,tr_shiX,tr_wenZ,tr_wenX;unsigned char flag;unsigned int n=20,m;void delay_1ms(unsigned int i) {unsigned int j=88;for(;i>0;i--){while(j>0)j--;}}void delay_10us()unsigned char i; i--;i--;i--;i--;i--;i--;char read_data(){unsigned char i,num,temp;num=0;for(i=0;i<8;i++){flag=2;while((!DHT)&&flag++);delay_10us();delay_10us();delay_10us();if(DHT==1)}温湿度读取函数************** */temp=1;flag=2;while(DHT&&flag++);}elsetemp=0;num<<=1; num|=temp;}return(num);}void delay(uchar ms) // 延时函数uchar i,j;for(i=ms;i>0;i--) for(j=100;j>0;j--); } voidDelayUs(unsigned char us) //--unsigned char uscnt; uscnt=us>>1; /*12MHz 频率 */ while(--uscnt); }void DelayMs(unsigned char ms) { while(--ms){DelayUs(250);ms 毫秒{ 延时函数 {DelayUs(250);DelayUs(250);DelayUs(250);}}void lcd_write_com(uchar c) // 写命令{DelayMs(5);// 操作前短暂延时,保证信号稳定E=0;RS=0;RW=0;_nop_();E=1;Data=c;E=0;}void lcd_write_dat(uchar c) // 写数据{ DelayMs(5); // 操作前短暂延时,保证信号稳定E=0;RS=1;RW=0;_nop_();E=1;Data=c;E=0;RS=0;}void lcd_init() //LCD 初始化{DelayMs(15);lcd_write_com(0x38); //display modelcd_write_com(0x38); //display modelcd_write_com(0x38); //display modevoid ShowChar(uchar pos,uchar c) //unsigned char p;if (pos>=0x10) p=pos+0xb0; // 是第二行则命令代码高 else p=pos+0x80; // 是第二行则命令代码高 4 位为 0x8 lcd_write_com(p);// 写命令 lcd_write_dat(c); // 写数据}void ShowString (uchar line,char *ptr) //显示字符串 {unsigned char l,*p;lcd_write_com(0x06); //显示光标移动位置 lcd_write_com(0x0c); //显示开及光标设置 lcd_write_com(0x01); //显示清屏 显示单个字符 {4 位为 0xcp=ptr;l=line<<4;while((*p)!='\0'){ShowChar(l++,*(p));p++;}}void disp(void) // 主函数调用的显示函数{ ShowString(0,FirstLine);ShowString(1,SecondLine); } void read_init()初始化及采集程序**************/{DHT=O; //主机使DHT11低电平并延时至少18msdelay_1ms(21);DHT=1; //主机置DHT11高电平20~40us,并等待从机相应delay_1Ous();delay_10us();delay_10us();delay_10us();DHT=1;if(!DHT) // 从机发出相应信号{flag=2; while((!DHT)&&flag++);flag=2; while(DHT&&flag++); // tr_shiZ=read_data();// tr_shiX=read_data();//tr_wenZ=read_data();//tr_wenX=read_data();//check=read_data(); //DHT=1;}}void main(){unsigned char temp; lcd_init();delay(50); while(1){ disp();read_init();temp=tr_shiZ+tr_shiX+tr_wenZ+tr_wenX; if(check==temp) {shiZ=tr_shiZ; shiX=tr_shiX; wenZ=tr_wenZ; wenX=tr_wenX; }FirstLine[4]='0'+wenZ/10;FirstLine[5]='0'+wenZ%10;FirstLine[8]='0'+wenX/10;FirstLine[9]='0'+wenX%10;SecondLine[4]='0'+shiZ/10;开始采集数据 采集湿度整数部分 采集湿度小数部分 采集温度整数部分 采集温度小数部分 采集校验位SecondLine[5]='0'+shiZ%10; SecondLine[8]='0'+shiX/10; SecondLine[9]='0'+shiX%10; } }。

基于某51单片机SHT11温湿度传感器检测程序

基于某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温湿度传感器检测程序相关资料文档大全。

数字温湿度传感器DHT11 操作C语言源代码

数字温湿度传感器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显示程序源代码

基于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温湿度监测模块接口电路图该程序的实际运行效果。

SHT11程序代码

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。

SHT11程序代码

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_DA TA==1>;SHT11_SCK=0;SHT11_DATA=1;}/************************************ 函数名称:SHT11_Test_Finish<>函数功能:检测SHT11温湿度检测是否完毕*************************************/ void SHT11_Test_Finish<>{while<SHT11_DA TA==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_DATA>{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。

SHT11温湿度传感器与1602应用代码及仿真

SHT11温湿度传感器与1602应用代码及仿真

仿真图形运行后结果#ifndef__TOU_H__#define __TOU_H__#include<reg52.h>#include<intrins.h>//#include<math.h> //Keil library#define uchar unsigned charenum {TEMP,HUMI};sbit DATA=P1^1;sbit SCK = P1^0;sbit RS = P2^0;sbit RW =P2^1;sbit E = P2^2;sfr DBPort =0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口/******** DS1602函数声明********/void LCD_Initial();void GotoXY(unsigned char x, unsigned char y);void Print(unsigned char *str);void LCD_Write(bit style, unsigned char input);/******** SHT10函数声明********/void s_connectionreset(void);char s_measure(unsigned char*p_value,unsigned char *p_checksum,unsigned char mode);void calc_sth10(float*p_humidity,float *p_temperature);//float calc_dewpoint(float h,float t);#endif/****************************************************************************************************** *****************************************************///SHT10程序(SHT10.c)://#include<tou.h>#define noACK 0//继续传输数据,用于判断是否结束通讯#define ACK 1 //结束数据传输;//地址命令读/写#define STATUS_REG_W 0x06 //000 0011 0#define STATUS_REG_R0x07 //000 0011 1#define MEASURE_TEMP0x03 //000 0001 1#define MEASURE_HUMI0x05 //000 0010 1#define RESET0x1e //000 1111 0//写字节程序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 通讯错误}//读字节程序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;}//启动传输void s_transstart(void)//generates a transmission start// _____ ________//DATA:|_______|// ___ ___//SCK:___| |___| |______{DATA=1; SCK=0;//准备_nop_();SCK=1;_nop_();DATA=0;_nop_();SCK=0;_nop_();_nop_();_nop_();SCK=1;_nop_();DATA=1;_nop_();SCK=0;}//连接复位void s_connectionreset(void)//communication reset: DATA-line=1and at least 9 SCK cycles followed by transstart// _____________________________________________________________//DATA:|_______|// _ _ _ _ _ _ _ _ _ ___ ___//SCK:__||__||__||__||__| |__| |__| |__| |__| |______| |___| |______{unsigned char i;DATA=1; SCK=0;//准备for(i=0;i<9;i++) //DATA 保持高,SCK时钟触发9次,发送启动传输,通迅即复位{SCK=1;SCK=0;}s_transstart();//启动传输}//软复位程序char s_softreset(void)//resets the sensor by a softreset{unsigned char error=0;s_connectionreset(); //启动连接复位error+=s_write_byte(RESET); //发送复位命令return error;//error=1 通讯错误}/*读状态寄存器char s_read_statusreg(unsigned char *p_value, unsigned char*p_checksum)//----------------------------------------------------------------------------------//reads the status register with checksum(8-bit){unsigned char error=0;s_transstart();//transmission starterror=s_write_byte(STATUS_REG_R);//send command to sensor*p_value=s_read_byte(ACK); //read status register(8-bit)*p_checksum=s_read_byte(noACK);//read checksum(8-bit)return error;//error=1 in case of no response form the sensor}//写状态寄存器char s_write_statusreg(unsigned char *p_value)//writes the status register with checksum(8-bit){unsigned char error=0;s_transstart();//transmission starterror+=s_write_byte(STATUS_REG_W);//send command to sensorerror+=s_write_byte(*p_value); //send value of status registerreturn error;//error>=1 in case of no response form the sensor}*/ //温湿度测量char s_measure(unsigned char*p_value,unsigned char *p_checksum,unsigned char mode)// 进行温度或者湿度转换,由参数mode决定转换内容;{// enum {TEMP,HUMI};//已经在头文件中定义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 通讯错误}//温湿度值标度变换及温度补偿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; //返回湿度结果}//从相对温度和湿度计算露点/*float calc_dewpoint(float h,float t){float logEx,dew_point;logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2);dew_point = (logEx- 0.66077)*237.3/(0.66077+7.5-logEx);return dew_point;} *//****************************************************************************************************** *****************************************************///DS1602程序(1602.c)://#include<tou.h>//内部等待函数**************************************************************unsigned char LCD_Wait(void){RS=0;RW=1; _nop_();E=1; _nop_();E=0;return DBPort;}//向LCD写入命令或数据********************************************************#define LCD_COMMAND 0 // Command#define LCD_DATA 1 // Data#define LCD_CLEAR_SCREEN0x01 // 清屏#define LCD_HOMING0x02 // 光标返回原点void LCD_Write(bit style, unsigned char input){E=0;RS=style;RW=0; _nop_();DBPort=input; _nop_();//注意顺序E=1; _nop_();//注意顺序E=0; _nop_();LCD_Wait();}//设置显示模式************************************************************ #define LCD_SHOW0x04 //显示开#define LCD_HIDE0x00 //显示关#define LCD_CURSOR0x02 //显示光标#define LCD_NO_CURSOR0x00 //无光标#define LCD_FLASH0x01 //光标闪动#define LCD_NO_FLASH0x00 //光标不闪动void LCD_SetDisplay(unsigned char DisplayMode){LCD_Write(LCD_COMMAND, 0x08|DisplayMode);}//设置输入模式************************************************************ #define LCD_AC_UP0x02#define LCD_AC_DOWN0x00 //default#define LCD_MOVE0x01 // 画面可平移#define LCD_NO_MOVE0x00 //defaultvoid LCD_SetInput(unsigned char InputMode){LCD_Write(LCD_COMMAND, 0x04|InputMode);}//初始化LCD************************************************************ void LCD_Initial(){E=0;LCD_Write(LCD_COMMAND,0x38);//8 位数据端口,2行显示,5*7点阵LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);//开启显示, 无光标LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);//清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);//AC 递增, 画面不动}//液晶字符输入的位置************************void GotoXY(unsigned char x, unsigned char y){if(y==0)LCD_Write(LCD_COMMAND,0x80|x);if(y==1)LCD_Write(LCD_COMMAND,0x80|(x-0x40));}//将字符输出到液晶显示void Print(unsigned char *str){while(*str!='\0'){LCD_Write(LCD_DATA,*str);str++;}}/****************************************************************************************************** *****************************************************///主函数(main.c)://#include<tou.h>typedef union //定义共用同类型{unsigned int i;float f;}value;//延时函数void delay(int z) //z为毫秒数{int x,y;for(x=z;x>0;x--)for(y=125;y>0;y--);}void main(){unsigned int temp,humi;value humi_val,temp_val; //定义两个共同体,一个用于湿度,一个用于温度// float dew_point; //用于记录露点值unsigned char error; //用于检验是否出现错误unsigned char checksum; //CRCuchar wendu[6]; //用于记录温度uchar shidu[6]; //用于记录湿度LCD_Initial(); //初始化液晶GotoXY(0,0); //选择温度显示位置Print("TEMP: %C"); //5格空格GotoXY(0,1); //选择湿度显示位置Print("HUMI: %RH"); //5 格空格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); //修正相对湿度及温度// dew_point=calc_dewpoint(humi_val.f,temp_val.f);//计算e dew_pointtemp=temp_val.f*10;humi=humi_val.f*10;GotoXY(5,0); //设置温度显示位置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'; //温度小数点后第一位Print(wendu); //输出温度GotoXY(5,1); //设置湿度显示位置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'; //湿度小数点后第一位Print(shidu); //输出湿度}delay(800); //等待足够长的时间,以现行下一次转换}}。

温湿度传感器程序

温湿度传感器程序

/*基于盛群单片机开发的获得温湿传感器dht11和光敏电阻的数据并且发送到1602显示屏的程序*/#include <ht46r232.h>#pragma vector isr_4 @ 0x4#pragma vector isr_8 @ 0x8#pragma vector isr_c @ 0xc#pragma vector isr_ad @ 0x10 //ad中断服务程序(r232地址是10)//ISR for safequardvoid isr_4(){} // external ISRvoid isr_8(){} // timer/event 0void isr_c(){} // timer/event 1//initialize registers for safeguardvoid safeguard_init(){_intc0=0;_intc1=0;_tmr0h=0;_tmr0l=0;_tmr0c=0;_tmr1h=0;_tmr1l=0;_tmr1c=0;_pac=0xff;_pbc =0xff; //input mode_pcc =0xff;}typedef unsigned char u8;#define rs _pc2 //屏幕的控制rs#define ep _pc0 //屏幕的控制rs#define rw _pc1 //屏幕的控制rs#define dht _pb1#define ko _pb2 //外部按键定义#define ky _pb3#define LED_DATA_CRL _pac //屏幕数据管脚的I/O控制#define DHT_DATA_CRL _pbc //dht数据管脚的I/O控制#define LED_DATA_DATA _pa //屏幕数据管脚的数据传递#define LED_CRL_CRL _pcc //屏幕控制管脚的I/O控制#define ad_start _26_7 //定义ad转换的start位(r232的adcr寄存器地址是0x26h)void busycheck(void);void init(void);void cmd(unsigned char);void data(int);signed char U8FLAG,U8temp,U8comdata;U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_te mp;/*中间数值,校对校验码后付给最终的结果*/int U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;/*实际数值*/int k; //外部按键常量unsigned int light; //光强的数字值int light_b; //百位int light_s;//十位int light_g;//个位int count;void ADtrans(){ //ad转换开始ad_start=0;ad_start=1;ad_start=0;}//--------------------------------------屏幕部分------------------------------//********************************屏幕初始************************************ void init(){LED_DATA_CRL=0;LED_CRL_CRL=0;LED_DATA_DATA=0;_pc=0;_delay(5000);_delay(5000);_delay(5000);cmd(0x38);_delay(5000);cmd(0x38);_delay(5000);cmd(0x38);_delay(5000);cmd(0x38);busycheck();cmd(0x08);busycheck();cmd(0x01);busycheck();cmd(0x06);busycheck();cmd(0x0c);busycheck();}//****************************//***********送指令函数******** void cmd(u8 mingling){//busycheck();rs= 0;rw = 0;ep = 0;LED_DATA_DATA=mingling;_delay(100);ep=1;_delay(100);ep=0;}//*************************** //*********送数据************ void data(int zimu){//busycheck();rw=0;rs = 1;rw = 0;ep = 0;LED_DATA_DATA= zimu;_delay(100);ep = 1;_delay(100);ep = 0;}//*************************** //**********busycheck*********** void busycheck(void){u8 val;do{ep=0;LED_DATA_CRL=0xff;rs=0;rw=1;ep=1;_delay(100);val=LED_DATA_DATA;_delay(100);ep=0;}while(val&(u8)0x80);rw=0;LED_DATA_CRL=0;}//*****************************************************//******************写入地址***************************void pos(u8 x){cmd(x|0x80);}//*****************************************************//-------------------dht21 部分------------------------//**************获取8位二进制数************************/*COM获取一个8位二进制数*/void COM(void){u8 i;for(i=0;i<8;i++){U8FLAG=2;while((!dht)&&U8FLAG++);_delay(35);U8temp=0;if(dht)U8temp=1;U8FLAG=2;while((dht)&&U8FLAG++);//超时则跳出for循环if(U8FLAG==1)break;//判断数据位是0还是1// 如果高电平高过预定0高电平值则数据位为1U8comdata<<=1;U8comdata|=U8temp;}//rof}//*********************************************************** /*--------------------------------*//*-----温湿度读取子程序----------*//*--------------------------------*//*-----以下变量均为全局变量-------*//*----温度高8位== U8T_data_H------*//*----温度低8位== U8T_data_L------*//*----湿度高8位== U8RH_data_H-----*//*----湿度低8位== U8RH_data_L-----*//*----校验8位== U8checkdata-----*/void RH(void){ int c=0;DHT_DATA_CRL=0;dht=0;_delay(20000);//主机拉低500usDHT_DATA_CRL=0xff; //主机设为输入(电平由上拉电阻拉高)在20~40us后判断从机响应信号while((dht==1)&&(c++<100));//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行if(!dht){U8FLAG=2;while((!dht)&&U8FLAG++);//判断从机是否发出80us 的低电平响应信号是否结束U8FLAG=2;while((dht)&&U8FLAG++); //判断从机是否发出80us 的高电平,如发出则进入数据接收状态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;//数据校验U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);if(U8temp==U8checkdata_temp)if(1){U8RH_data_H=U8RH_data_H_temp;U8RH_data_L=U8RH_data_L_temp;U8T_data_H=U8T_data_H_temp;U8T_data_L=U8T_data_L_temp;U8checkdata=U8checkdata_temp;}}}//****************************************************************** //---------------------华丽的main函数分割线-------------------------void main(){//*********变量定义***********u8 r='r';u8 h='h';u8 t='t';u8 c='c';u8 l='l';u8 z=':';u8 si='4';u8 wu='5';u8 liu='6';u8 ling='0';int rhdatas; //湿度数据十位int rhdatag; // 湿度数据个位int tdatas;int tdatag;int i=0;//*****************************//*********初始化**************safeguard_init();init();DHT_DATA_CRL=0xff;_acsr=0x01; //ad转换8分频_adcr=0x08; //设置通道pb0 an0作为ad输入ad_start=1; //设置分频和通道ad_start=0;_emi=0; //关总中断_adf=0; //清除ad中断标志位_eadi=1;// 开ad中断使能_emi=1; //开总中断//*******************************while(1){RH();ADtrans(); //ad转换开始if(ko==0)k=1; //查询键盘else if(ky==0)k=0;//**把获得的数据转换成屏幕可以显示的数字(根据屏幕的编码表)********** rhdatas=U8RH_data_H/10;rhdatag=U8RH_data_H%10;rhdatas=(rhdatas|0x30)&0x3f;rhdatag=(rhdatag|0x30)&0x3f;if(ko==0)k=1;//查询键盘else if(ky==0)k=0;tdatas=U8T_data_H/10;tdatag=U8T_data_H%10;tdatas=(tdatas|0x30)&0x3f;tdatag=(tdatag|0x30)&0x3f;if(ko==0)k=1; //查询键盘else if(ky==0)k=0;light_b=light/100;light_s=(light-light_b*100)/10;light_g=light%10;light_b=(light_b|0x30)&0x3f;light_s=(light_s|0x30)&0x3f;light_g=(light_g|0x30)&0x3f;//***********************************cmd(0x08); //先关显示屏!!!!!!_delay(60000);cmd(0x01); // 清屏!!!!!!!!!!_delay(60000);_delay(60000);if(ko==0)k=1; //查询键盘else if(ky==0)k=0;pos(0); //显示温度data(h);data(z);data(rhdatas);data(rhdatag);if(ko==0)k=1; //查询键盘else if(ky==0)k=0;pos(43); //显示湿度data(t);data(z);data(tdatas);data(tdatag);if(ko==0)k=1; //查询键盘else if(ky==0)k=0;pos(8);data(r); //显示推荐数据data(c);data(z);if(tdatas=='3') {if (k==1) {data(si);data(ling);}else {data(si);data(wu);}}if(U8T_data_H<30&&U8T_data_H>=25) {if (k==1) {data(si);data(wu);}else {data(wu);data(ling);}}if (U8T_data_H<25) {if (k==1) {data(wu);data(wu);}else {data(liu);data(ling);}}pos(0x4a); //显示当前光强data(l);data(z);data(light_b);data(light_s);data(light_g);pos(0x48);data(count);if(ko==0)k=1; //查询键盘else if(ky==0)k=0;cmd(0xc); //开显示屏@!!!!!!!!!!!!!!_delay(250000);if(ko==0)k=1; //查询+延时else if(ky==0)k=0;_delay(250000);if(ko==0)k=1;else if(ky==0)k=0;_delay(250000);if(ko==0)k=1;else if(ky==0)k=0;_delay(250000);if(ko==0)k=1;else if(ky==0)k=0;_delay(250000);if(ko==0)k=1;else if(ky==0)k=0;_delay(250000);if(ko==0)k=1;else if(ky==0)k=0;_delay(250000);if(ko==0)k=1;else if(ky==0)k=0;_delay(250000);if(ko==0)k=1;else if(ky==0)k=0;}}//________________________________________________ //***********中断服务程序********************void isr_ad(){_adf=0; //清除ad中断标志位light=_adrh; //读取ad数据寄存器高八位;count++;}。

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

#ifndef __TOU_H__#define __TOU_H__#include<reg52.h>#include <intrins.h>//#include <math.h> //Keil library#define uchar unsigned charenum {TEMP,HUMI};sbit DA TA = P1^1;sbit SCK = P1^0;sbit RS = P2^0;sbit RW = P2^1;sbit E = P2^2;sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口/******** DS1602函数声明********/void LCD_Initial();void GotoXY(unsigned char x, unsigned char y);void Print(unsigned char *str);void LCD_Write(bit style, unsigned char input);/******** SHT10函数声明********/void s_connectionreset(void);char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode);void calc_sth10(float *p_humidity ,float *p_temperature);//float calc_dewpoint(float h,float t);#endif/****************************************************************************************************** *****************************************************///SHT10程序(SHT10.c)://#include<tou.h>#define noACK 0 //继续传输数据,用于判断是否结束通讯#define ACK 1 //结束数据传输;//地址命令读/写#define STA TUS_REG_W 0x06 //000 0011 0#define STA TUS_REG_R 0x07 //000 0011 1#define MEASURE_TEMP 0x03 //000 0001 1#define MEASURE_HUMI 0x05 //000 0010 1#define RESET 0x1e //000 1111 0//写字节程序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;}DA TA=1; //释放数据线SCK=1;error=DATA; //检查应答信号,确认通讯正常_nop_();_nop_();_nop_();SCK=0;DA TA=1;return error; //error=1 通讯错误}//读字节程序char s_read_byte(unsigned char ack)//----------------------------------------------------------------------------------{unsigned char i,val=0;DA TA=1; //释放数据线for(i=0x80;i>0;i>>=1) //高位为1,循环右移{SCK=1;if(DATA) val=(val|i); //读一位数据线的值SCK=0;}DA TA=!ack; //如果是校验,读取完后结束通讯;SCK=1;_nop_();_nop_();_nop_(); //延时3usSCK=0;_nop_();_nop_();_nop_();DA TA=1; //释放数据线return val;}//启动传输void s_transstart(void)// generates a transmission start// _____ ________// DATA: |_______|// ___ ___DA TA=1; SCK=0; //准备_nop_();SCK=1;_nop_();DA TA=0;_nop_();SCK=0;_nop_();_nop_();_nop_();SCK=1;_nop_();DA TA=1;_nop_();SCK=0;}//连接复位void s_connectionreset(void)// communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart// _____________________________________________________ ________// DATA: |_______|// _ _ _ _ _ _ _ _ _ ___ ___// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______{unsigned char i;DA TA=1; SCK=0; //准备for(i=0;i<9;i++) //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位{SCK=1;SCK=0;}s_transstart(); //启动传输}//软复位程序char s_softreset(void)// resets the sensor by a softreset{unsigned char error=0;s_connectionreset(); //启动连接复位error+=s_write_byte(RESET); //发送复位命令return error; //error=1 通讯错误}/*读状态寄存器char s_read_statusreg(unsigned char *p_value, unsigned char *p_checksum)// reads the status register with checksum (8-bit){unsigned char error=0;s_transstart(); //transmission starterror=s_write_byte(STATUS_REG_R); //send command to sensor*p_value=s_read_byte(ACK); //read status register (8-bit)*p_checksum=s_read_byte(noACK); //read checksum (8-bit)return error; //error=1 in case of no response form the sensor}//写状态寄存器char s_write_statusreg(unsigned char *p_value)// writes the status register with checksum (8-bit){unsigned char error=0;s_transstart(); //transmission starterror+=s_write_byte(STATUS_REG_W);//send command to sensorerror+=s_write_byte(*p_value); //send value of status registerreturn error; //error>=1 in case of no response form the sensor} *///温湿度测量char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)// 进行温度或者湿度转换,由参数mode决定转换内容;{// enum {TEMP,HUMI}; //已经在头文件中定义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 通讯错误}//温湿度值标度变换及温度补偿void calc_sth10(float *p_humidity ,float *p_temperature){const float C1=-4.0; // 12位湿度精度修正公式const float C2=+0.0405; // 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; //返回湿度结果}//从相对温度和湿度计算露点/*float calc_dewpoint(float h,float t){float logEx,dew_point;logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2);dew_point = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx);return dew_point;} *//****************************************************************************************************** *****************************************************///DS1602程序(1602.c)://#include<tou.h>//内部等待函数**************************************************************unsigned char LCD_Wait(void){RS=0;RW=1; _nop_();E=1; _nop_();E=0;return DBPort;}//向LCD写入命令或数据********************************************************#define LCD_COMMAND 0 // Command#define LCD_DA TA 1 // Data#define LCD_CLEAR_SCREEN 0x01 // 清屏#define LCD_HOMING 0x02 // 光标返回原点void LCD_Write(bit style, unsigned char input)E=0;RS=style;RW=0; _nop_();DBPort=input; _nop_();//注意顺序E=1; _nop_();//注意顺序E=0; _nop_();LCD_Wait();}//设置显示模式************************************************************ #define LCD_SHOW 0x04 //显示开#define LCD_HIDE 0x00 //显示关#define LCD_CURSOR 0x02 //显示光标#define LCD_NO_CURSOR 0x00 //无光标#define LCD_FLASH 0x01 //光标闪动#define LCD_NO_FLASH 0x00 //光标不闪动void LCD_SetDisplay(unsigned char DisplayMode){LCD_Write(LCD_COMMAND, 0x08|DisplayMode);}//设置输入模式************************************************************ #define LCD_AC_UP 0x02#define LCD_AC_DOWN 0x00 // default#define LCD_MOVE 0x01 // 画面可平移#define LCD_NO_MOVE 0x00 //defaultvoid LCD_SetInput(unsigned char InputMode){LCD_Write(LCD_COMMAND, 0x04|InputMode);}//初始化LCD************************************************************ void LCD_Initial(){E=0;LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动}//液晶字符输入的位置************************void GotoXY(unsigned char x, unsigned char y)if(y==0)LCD_Write(LCD_COMMAND,0x80|x);if(y==1)LCD_Write(LCD_COMMAND,0x80|(x-0x40));}//将字符输出到液晶显示void Print(unsigned char *str){while(*str!='\0'){LCD_Write(LCD_DATA,*str);str++;}}/****************************************************************************************************** *****************************************************///主函数(main.c)://#include<tou.h>typedef union //定义共用同类型{unsigned int i;float f;} value;//延时函数void delay(int z) //z为毫秒数{int x,y;for(x=z;x>0;x--)for(y=125;y>0;y--);}void main(){unsigned int temp,humi;value humi_val,temp_val; //定义两个共同体,一个用于湿度,一个用于温度// float dew_point; //用于记录露点值unsigned char error; //用于检验是否出现错误unsigned char checksum; //CRCuchar wendu[6]; //用于记录温度uchar shidu[6]; //用于记录湿度LCD_Initial(); //初始化液晶Print("TEMP: %C"); //5格空格GotoXY(0,1); //选择湿度显示位置Print("HUMI: %RH"); //5格空格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); //修正相对湿度及温度// dew_point=calc_dewpoint(humi_val.f,temp_val.f); //计算e dew_pointtemp=temp_val.f*10;humi=humi_val.f*10;GotoXY(5,0); //设置温度显示位置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'; //温度小数点后第一位Print(wendu); //输出温度GotoXY(5,1); //设置湿度显示位置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'; //湿度小数点后第一位Print(shidu); //输出湿度}delay(800); //等待足够长的时间,以现行下一次转换}}。

相关文档
最新文档