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

msp430对dht11测量结果的1602显示

msp430对dht11测量结果的1602显示

#include "msp430x14x.h"//typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量*/typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量*/typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量*/typedef signed int S16; /* defined for signed 16-bits integer variable 有符号16位整型变量*/typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 无符号32位整型变量*/typedef signed long S32; /* defined for signed 32-bits integer variable 有符号32位整型变量*/typedef float F32; /* single precision floating point variable (32bits) 单精度浮点数(32位长度)*/typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数(64位长度)*///#define SET_H P4DIR|=BIT0;P4OUT|=BIT0 //SETH#define SET_L P4DIR|=BIT0;P4OUT&=~BIT0 //SETL#define PIN0 P4IN#define SET_IN P4DIR&=~BIT0;#define CPU_F ((double)8000000)#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))#define P55 5#define P56 6#define P57 7#define RS_CLR P5OUT &= ~(1 << P55) //RS置低#define RS_SET P5OUT |= (1 << P55) //RS置高#define RW_CLR P5OUT &= ~(1 << P56) //RW置低#define RW_SET P5OUT |= (1 << P56) //RW置高#define EN_CLR P5OUT &= ~(1 << P57) //E置低#define EN_SET P5OUT |= (1 << P57) //E置高#define DataPort P4OUT //P4口为数据口//===================================================================== ==========U8 k;U8 U8temp;U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;U8U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_t emp;U8 U8comdata;U8 str[5]={"RS232"};U16 U16temp1,U16temp2;//===================================================================== =============void COM(void){U8 i;for(i=0;i<8;i++){//判断数据位是0还是1while(!(PIN0&0X01));delay_us(10);U8temp=0;delay_us(30);if(PIN0&0X01)U8temp=1;while(PIN0&0X01);// 如果高电平高过预定0高电平值则数据位为1U8comdata<<=1;U8comdata|=U8temp;}}/*void Dis_Lcd( ){U8 temp;temp=(U8)(U8RH_data_H/10);PutString_cn(30,80,(unsigned short *)"当前湿度是:");delay_ms(5);PutChar(160,80,(char)(48+temp));delay_ms(5);temp=U8RH_data_H%10;PutChar(170,80,(char)(48+temp));delay_ms(5);PutChar(180,80,'%');delay_ms(5);temp=(U8)(U8T_data_H/10);PutString_cn(30,140,(unsigned short *)"当前温度是:");delay_ms(5);PutChar(160,140,(char)(48+temp));delay_ms(5);temp=U8T_data_H%10;PutChar(170,140,(char)(48+temp));delay_ms(5);PutString_cn(180,140,(unsigned short *)"℃");delay_ms(5);}*/void Clock_Init(){char i;BCSCTL1&=~XT2OFF; //打开XT振荡器BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ do{IFG1&=~OFIFG; //清除震荡标志for(i=0;i<100;i++)_NOP(); //延时等待}while((IFG1&OFIFG)!=0); //如果标志为1,则继续循环等待IFG1&=~OFIFG;}//************************************************************************* // MSP430内部看门狗初始化//************************************************************************* void WDT_Init(){WDTCTL = WDTPW + WDTHOLD; //关闭看门狗}//************************************************************************* // 初始化IO口子程序//************************************************************************* void Port_init(){P4SEL = 0x00;P4DIR = 0xFF;P5SEL = 0x00;P5DIR|= BIT5 + BIT6 + BIT7; //控制口设置为输出模式}//*********************************************************************** // 显示屏命令写入函数//***********************************************************************void LCD_write_com(unsigned char com){RS_CLR;RW_CLR;EN_SET;DataPort = com; //命令写入端口delay_ms(5);EN_CLR;}//*********************************************************************** // 显示屏数据写入函数//***********************************************************************void LCD_write_data(unsigned char data){RS_SET;RW_CLR;EN_SET;DataPort = data; //数据写入端口delay_ms(5);EN_CLR;}//*********************************************************************** // 显示屏清空显示//***********************************************************************void LCD_clear(void){LCD_write_com(0x01); //清屏幕显示delay_ms(5);}//*********************************************************************** // 显示屏单字符写入函数//***********************************************************************void LCD_write_char(unsigned char x,unsigned char y,unsigned char data){if (y == 0){LCD_write_com(0x80 + x); //第一行显示}else{LCD_write_com(0xC0 + x); //第二行显示}LCD_write_data( data);}//*********************************************************************** // 显示屏初始化函数//***********************************************************************void LCD_init(void){LCD_write_com(0x38); //显示模式设置delay_ms(5);LCD_write_com(0x08); //显示关闭delay_ms(5);LCD_write_com(0x01); //显示清屏delay_ms(5);LCD_write_com(0x06); //显示光标移动设置delay_ms(5);LCD_write_com(0x0C); //显示开及光标设置delay_ms(5);}void RH(void){//主机拉低18msSET_L;delay_ms (20);SET_H;//总线由上拉电阻拉高主机延时20usdelay_us(20);//主机设为输入判断从机响应信号SET_IN;while(PIN0&0X01);//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行if(!(PIN0&0X01))//判断从机是否发出80us 的低电平响应信号是否结束delay_us(50);while(!(PIN0&0X01));//判断从机是否发出80us 的高电平,如发出则进入数据接收状态while((PIN0&0X01));//数据接收状态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;SET_H;//数据校验U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);if(U8temp==U8checkdata_temp){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;}/*str[0]=U8RH_data_H;str[1]=U8RH_data_L;str[2]=U8T_data_H;str[3]=U8T_data_L;str[4]=U8checkdata;*/str[0] = (char)(0X30+U8RH_data_H/10);str[1]= (char)(0X30+U8RH_data_H%10);//湿度小数部分str[2] = (char)(0X30+U8RH_data_L/10);//温度整数部分str[3] = (char)(0X30+U8T_data_H/10);str[4] = (char)(0X30+U8T_data_H%10);//温度小数部分str[5] = (char)(0X30+U8T_data_L/10);}void disp(){LCD_write_char(0,0,'s');LCD_write_char(1,0,'h');LCD_write_char(2,0,'i');LCD_write_char(3,0,'d');LCD_write_char(4,0,'u');LCD_write_char(5,0,':');LCD_write_char(6,0,str[0]);LCD_write_char(7,0,str[1]);LCD_write_char(8,0,'.');LCD_write_char(9,0,str[2]);LCD_write_char(10,0,'%');LCD_write_char(11,0,'R');LCD_write_char(12,0,'H');LCD_write_char(0,2,'w');LCD_write_char(1,2,'e');LCD_write_char(2,2,'n');LCD_write_char(3,2,'d');LCD_write_char(4,2,'u');LCD_write_char(5,2,':');LCD_write_char(6,2,str[3]);LCD_write_char(7,2,str[4]);LCD_write_char(8,2,'.');LCD_write_char(9,2,str[5]);LCD_write_char(10,2,0xDF);LCD_write_char(11,2,'C');delay_ms(50);}/*void Set(){U0CTL |= SWRST; //开启设置U0TCTL = SSEL1; //选择SMCLK=6M 波特率=9600 /* 6M / 9600 = 625 625 = 0x0271 0.000 * 8= 0*//* 32768/9600=3.4133 0.4133*8=4*//* U0BR0 = 0x41;U0BR1 = 0x03;U0MCTL =0x00; //00000000U0CTL |= CHAR; //长度8位U0CTL &= ~SWRST;}/*void Send(U8 num){TXBUF0 = num;while((IFG1&UTXIFG0)==0);}void InitClock(void){U8 k;BCSCTL1 &= ~XT2OFF; //开启XT2晶振do{IFG1 &= ~OFIFG; // 清除振荡器失效标志for(k=0xee;k>0;k--){} //延时}while((IFG1 & OFIFG)!=0); //判断XT2是否起振BCSCTL2 = SELM_2 + SELS; // 选择MCLK SMCLK 为XT2 } //初始化//端口初始化函数void InitPort(void){P6DIR=0XFF;// 设置为输出方向P6OUT=0xFF;//P口先输出低电平P3DIR |= 0x10;P3SEL |= 0x30;Set();ME1 |= UTXE0 + URXE0;IE1 |= URXIE0;}*/void main(void){WDT_Init();/*InitClock();InitPort();*//*LCD_Initial();BackLightTo(80);*/Clock_Init();Port_init();/*ClrScreen(1);*/delay_ms(50);/* P6DIR=0XFF;P6OUT=0X7F;delay_ms(50);P6OUT=0XFF;delay_ms(50);*/LCD_init();LCD_clear();while(1){/*Dis_Lcd();*/LCD_init();LCD_clear();/* */RH();// Send(str[k]);disp();while(1){RH();disp();TACTL |= MC0;}//读取模块数据周期不易小于2S delay_ms(50);}}。

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); //等待足够长的时间,以现行下一次转换}}。

SHT11温湿度传感器MSP430源代码

SHT11温湿度传感器MSP430源代码
nop();
}
//等待响应
//SHT_DAT_OUT;
SHT_DAT_1;
SHT_DAT_IN;
nop();
SHT_SCK_1;
nop();
error=Read_SHT_Dat;
SHT_SCK_0;
nop();
//error=1时无响应
return error;
}
for(temp=0;temp<4294967295;temp++)
{
read_temp=Read_SHT_Dat;
uchar SHT_Rea_Byte(uchar ack)
{
uchar temp,val=0,read_temp;
//释放数据线
SHT_SCK_OUT;
SHT_DAT_OUT;
SHT_DAT_1;
nop();
SHT_DAT_IN;
for(temp=0x80;temp>0;temp/=2)
// reads the status register with checksum (8-bit)
uchar SHT_Rea_Sta(uchar *p_value,uchar *p_checksum)
{
uchar error=0;
SHT_Tra_Sta(); //transmission start
default:break;
}
/*准备接收*/
//数据线为输出
SHT_DAT_OUT;
SHT_DAT_1;
//数据线为输入
SHT_DAT_IN;
/*wait until sensor has finished the measurement or timeout (~2 sec.) is reached*/

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 液 晶模块

SHT10+LCD1602温湿度测量及显示(完整版)

SHT10+LCD1602温湿度测量及显示(完整版)
#define RESET 0x1e //000 1111 0
/****************定义函数****************/
void s_transstart(void); //启动传输函数
void s_connectionreset(void); //连接复位函数
char s_write_byte(unsigned char value);//DHT90写函数
// communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart
{
unsigned char i;
DATA=1; SCK=0; //Initial state
for(i=0;i<9;i++) //9 SCK cycles
;-------------------------------------*/
void LCD_disp_char(uchar x,uchar y,uchar dat)
{
uchar address;
if(y==1)
address=0x80+x;
else
address=0xc0+x;
LCD_write_command(address);
LCD_RS=0; //指令
LCD_RW=0; //写入
LCD_E=1; //允许
LCD_DB=dat;
delay_n10us(10); //实践证明,我的LCD1602上,用for循环1次就能完成普通写指令。
LCD_E=0;
delay_n10us(10); //实践证明,我的LCD1602上,用for循环1次就能完成普通写指令。

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

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

基于51单片机SHT11温湿度传感器检测程序(含电路图)?下面是原理图:下面是SHT11与MCU连接的典型电路:下面是源代码:#include <>#include <>/******************************************************** 宏定义********************************************************/ #define uint unsigned int#define uchar unsigned char#define noACK 0#define ACK 1#define STATUS_REG_W 0x06#define STATUS_REG_R 0x07#define MEASURE_TEMP 0x03#define MEASURE_HUMI 0x05#define RESET 0x1eenum?{TEMP,HUMI};typedef?union?;uchar wendu[6];uchar shidu[6];/******************************************************** 1ms延时函数********************************************************/ void?delay(int?z){int?x,y;for(x=z;x>0;x--)for(y=125;y>0;y--);}/******************************************************** 50us延时函数********************************************************/ void?delay_50us(uint t){uint j;for(;t>0;t--)for(j=19;j>0;j--);}/******************************************************** 50ms延时函数********************************************************/void?delay_50ms(uint t){uint j;for(;t>0;t--)for(j=6245;j>0;j--);}/******************************************************** 12864液晶写指令********************************************************/ void?write_12864com(uchar com){lcdrs=0;delay_50us(1);P0=com;lcden=1;delay_50us(10);lcden=0;delay_50us(2);}/******************************************************** 12864液晶写数据********************************************************/ void?write_dat(uchar dat){lcdrs=1;lcdrw=0;delay_50us(1);P0=dat;lcden=1;delay_50us(10);lcden=0;delay_50us(2);}/******************************************************** 12864液晶初始化********************************************************/ void?init12864lcd(void){delay_50ms(2);write_12864com(0x30);delay_50us(4);write_12864com(0x30);delay_50us(4);write_12864com(0x0f);delay_50us(4);write_12864com(0x01);delay_50us(240);write_12864com(0x06);delay_50us(10);write_12864com(0x0c);delay_50us(10);}/******************************************************** 12864液晶显示函数********************************************************/ void?display1(void){uchar i;write_12864com(0x80);for(i=0;i<18;i++){write_dat(table2[i]);delay_50us(1);}}/******************************************************** 12864液晶显示函数********************************************************/ void?display2(void){uchar i;write_12864com(0x90);for(i=0;i<18;i++){write_dat(table3[i]);delay_50us(1);}}/******************************************************** 12864液晶显示函数********************************************************/ void?display3(void){uchar i;write_12864com(0x88);for(i=0;i<8;i++){write_dat(table4[i]);delay_50us(1);}}/******************************************************** 12864液晶显示函数********************************************************/ void?displaywendu(void){uchar i;write_12864com(0x94);for(i=0;i<3;i++){write_dat(wendu[i]);delay_50us(1);}for(i=0;i<1;i++){write_dat(table5[i]);delay_50us(1);}for(i=4;i<5;i++){write_dat(wendu[i]);delay_50us(1);}}/******************************************************** 12864液晶显示函数********************************************************/ void?displayshidu(void){uchar i;write_12864com(0x8C);for(i=0;i<3;i++){write_dat(shidu[i]);delay_50us(1);}for(i=0;i<1;i++){write_dat(table5[i]);delay_50us(1);}for(i=4;i<5;i++){write_dat(shidu[i]);delay_50us(1);}}/******************************************************** SHT11写字节程序********************************************************/ char?s_write_byte(unsigned?char?value){unsigned?char?i,error=0;for?(i=0x80;i>0;i>>=1)?//高位为1,循环右移{if?(i&value) DATA=1;?//和要发送的数相与,结果为发送的位 else?DATA=0;SCK=1;_nop_();_nop_();_nop_();?//延时3usSCK=0;}DATA=1;?//释放数据线SCK=1;error=DATA;?//检查应答信号,确认通讯正常_nop_();_nop_();_nop_();SCK=0;DATA=1;return?error;?//error=1 通讯错误}/******************************************************** SHT11读字节程序********************************************************/ char?s_read_byte(unsigned?char?ack){unsigned?char?i,val=0;DATA=1;?//释放数据线for(i=0x80;i>0;i>>=1)?//高位为1,循环右移{SCK=1;if(DATA) val=(val|i);?//读一位数据线的值SCK=0;}DATA=!ack;?//如果是校验,读取完后结束通讯;SCK=1;_nop_();_nop_();_nop_();?//延时3usSCK=0;_nop_();_nop_();_nop_();DATA=1;?//释放数据线return?val;}/******************************************************** SHT11启动传输********************************************************/ void?s_transstart(void){DATA=1; SCK=0;?//准备_nop_();SCK=1;_nop_();DATA=0;_nop_();SCK=0;_nop_();_nop_();_nop_();SCK=1;_nop_();DATA=1;_nop_();SCK=0;}/******************************************************** SHT11连接复位********************************************************/ void?s_connectionreset(void){unsigned?char?i;DATA=1; SCK=0;?//准备for(i=0;i<9;i++)?//DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位{SCK=1;SCK=0;}s_transstart();?//启动传输}/********************************************************SHT11温湿度检测********************************************************/char?s_measure(unsigned?char?*p_value, unsigned?char?*p_checksum, unsigned?charmode){unsigned error=0;unsigned?int?i;s_transstart();?//启动传输switch(mode)?//选择发送命令{case?TEMP : error+=s_write_byte(MEASURE_TEMP);?break;?//测量温度case?HUMI : error+=s_write_byte(MEASURE_HUMI);?break;?//测量湿度default?:?break;}for?(i=0;i<65535;i++)?if(DATA==0)?break;?//等待测量结束if(DATA) error+=1;?// 如果长时间数据线没有拉低,说明测量错误*(p_value) =s_read_byte(ACK);?//读第一个字节,高字节 (MSB)*(p_value+1)=s_read_byte(ACK);?//读第二个字节,低字节 (LSB)*p_checksum =s_read_byte(noACK);?//read CRC校验码return?error;?// error=1 通讯错误}/********************************************************SHT11温湿度值标度变换及温度补偿********************************************************/void?calc_sth10(float?*p_humidity ,float?*p_temperature){const?float?C1=;?// 12位湿度精度修正公式const?float?C2=+;?// 12位湿度精度修正公式const?float?C3=;?// 12位湿度精度修正公式const?float?T1=+;?// 14位温度精度 5V条件修正公式const?float?T2=+;?// 14位温度精度 5V条件修正公式float?rh=*p_humidity;?// rh: 12位湿度float?t=*p_temperature;?// t: 14位温度float?rh_lin;?// rh_lin: 湿度 linear值float?rh_true;?// rh_true: 湿度 ture值float?t_C;?// t_C : 温度℃t_C=t* - 40;?//补偿温度rh_lin=C3*rh*rh + C2*rh + C1;?//相对湿度非线性补偿rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;?//相对湿度对于温度依赖性补偿if(rh_true>100)rh_true=100;?//湿度最大修正if(rh_true<rh_true=;?//湿度最小修正*p_temperature=t_C;?//返回温度结果*p_humidity=rh_true;?//返回湿度结果}/********************************************************?主函数********************************************************/void?main(void){unsigned?int?temp,humi;value humi_val,temp_val;?//定义两个共同体,一个用于湿度,一个用于温度 unsigned?char?error;?//用于检验是否出现错误unsigned?char?checksum;?//CRCinit12864lcd();display1();display2();display3();s_connectionreset();?//启动连接复位while(1){error=0;?//初始化error=0,即没有错误error+=s_measure((unsigned?char*)&,&checksum,TEMP);?//温度测量error+=s_measure((unsigned?char*)&,&checksum,HUMI);?//湿度测量if(error!=0) s_connectionreset();?////如果发生错误,系统复位else{=(float);?//转换为浮点数=(float);?//转换为浮点数calc_sth10(&,&;?//修正相对湿度及温度temp=*10;humi=*10;wendu[0]=temp/1000+'0';?//温度百位wendu[1]=temp%1000/100+'0';?//温度十位?wendu[2]=temp%100/10+'0';?//温度个位wendu[3]=0x2E;?//小数点wendu[4]=temp%10+'0';?//温度小数点后第一位displaywendu();shidu[0]=humi/1000+'0';?//湿度百位shidu[1]=humi%1000/100+'0';?//湿度十位shidu[2]=humi%100/10+'0';?//湿度个位shidu[3]=0x2E;?//小数点shidu[4]=humi%10+'0';?//湿度小数点后第一位displayshidu();}?delay(800);?//等待足够长的时间,以现行下一次转换 }}相关手册资料及源码下载地址:。

Proteus仿真下的SHT11温度湿度监控系统设计

Proteus仿真下的SHT11温度湿度监控系统设计

上海交通大学温度湿度监控系统仿真设计研究报告设计题目:基于SHT11的温度湿度监控系统Proteus仿真设计学院:电子信息与电气工程学院姓名:2019年5月24日设计任务书题目基于SHT11的温度湿度监控系统Proteus仿真设计一、设计的目的1.将理论知识运用于实践当中,掌握模拟电路设计的基本方法、基本步骤以及基本要求。

在实践中了解电子器件的功能与作用。

2.学会温湿度监测系统的设计方法,完成要求的性能和指标3.锻炼、提高在电子设计中发现问题、分析问题、解决问题的能力。

二、设计的内容及要求1.设计一套基于51单片机的温湿度Proteus仿真监控系统;2.采用高精度SHT11温湿度传感器模块;3.LCD液晶实时显示当前环境温度、湿度值;4.设计报警单元,实现系统对超限温湿度监控报警;5.设计输入单元,可对系统正常温湿度范围进行调节;6.仿真系统能够可靠、稳定地运行;三、指导教师评语四、成绩指导教师(签章)年月日摘要在日常生活中,温度、湿度是两种最基本的环境参数,是与人类的生活、工作关系最密切的物理量,也是各门学科与工程研究设计中经常遇到的,必须精确测量和不可忽略的物理量。

从工业炉温、环境气温到人体温度,从空间、海洋到家用电器,每个技术领域都离不开温度、湿度的测量与监控。

SHT11是基于CMOSens技术的新型智能温湿度传感器,它将温度湿度传感器、信号放大调理、A/D转换、二线串行接口全部集成于一个芯片内,融合了CMOS 芯片技术与传感器技术,使传感器具有品质卓越、超快响应、抗干扰能力强、性价比极高等特点。

温湿度监控系统的软件部分是以Keil为开发平台,C语言为软件系统的开发语言,同时采用模块化编程。

具体分为以下几个部分:主控制、温湿度采集程序、温湿度数据处理程序、LCD显示程序、按键设置程序和LED,蜂鸣器报警程序。

系统通过SHT11温湿度传感器感应周围的环境的温度和湿度,通过单片机对采集到的数据进行读取处理,经过LCD1602显示模块实时显示温湿度数据,同时可以通过按键模块对温湿度报警上、下限值进行设定。

  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 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: |_______|// ___ ___// SCK : ___| |___| |______{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 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_DA TA 1 // Data#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(); //初始化液晶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); //等待足够长的时间,以现行下一次转换}}。

相关文档
最新文档