您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > SHT11温湿度传感器与1602应用代码和仿真设计
...仿真图形运行后结果...#ifndef__TOU_H__#define__TOU_H__#includereg52.h#includeintrins.h//#includemath.h//Keillibrary#defineucharunsignedcharenum{TEMP,HUMI};sbitDATA=P1^1;sbitSCK=P1^0;sbitRS=P2^0;sbitRW=P2^1;sbitE=P2^2;sfrDBPort=0x80;//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口/********DS1602函数声明********/voidLCD_Initial();voidGotoXY(unsignedcharx,unsignedchary);voidPrint(unsignedchar*str);voidLCD_Write(bitstyle,unsignedcharinput);/********SHT10函数声明********/voids_connectionreset(void);chars_measure(unsignedchar*p_value,unsignedchar*p_checksum,unsignedcharmode);voidcalc_sth10(float*p_humidity,float*p_temperature);//floatcalc_dewpoint(floath,floatt);#endif/***********************************************************************************************************************************************************///SHT10程序(SHT10.c)://#includetou.h...#definenoACK0//继续传输数据,用于判断是否结束通讯#defineACK1//结束数据传输;//地址命令读/写#defineSTATUS_REG_W0x06//00000110#defineSTATUS_REG_R0x07//00000111#defineMEASURE_TEMP0x03//00000011#defineMEASURE_HUMI0x05//00000101#defineRESET0x1e//00011110//写字节程序chars_write_byte(unsignedcharvalue){unsignedchari,error=0;for(i=0x80;i0;i=1)//高位为1,循环右移{if(i&value)DATA=1;//和要发送的数相与,结果为发送的位elseDATA=0;SCK=1;_nop_();_nop_();_nop_();//延时3usSCK=0;}DATA=1;//释放数据线SCK=1;error=DATA;//检查应答信号,确认通讯正常_nop_();_nop_();_nop_();SCK=0;DATA=1;returnerror;//error=1通讯错误}//读字节程序chars_read_byte(unsignedcharack)//----------------------------------------------------------------------------------{unsignedchari,val=0;DATA=1;//释放数据线for(i=0x80;i0;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;//释放数据线returnval;}//启动传输voids_transstart(void)//generatesatransmissionstart//_____________//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;}//连接复位voids_connectionreset(void)//communicationreset:DATA-line=1andatleast9SCKcyclesfollowedbytransstart//_____________________________________________________________//DATA:|_______|//_______________//SCK:__||__||__||__||__||__||__||__||__||______||___||______{unsignedchari;DATA=1;SCK=0;//准备for(i=0;i9;i++)//DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位{SCK=1;SCK=0;...}s_transstart();//启动传输}//软复位程序chars_softreset(void)//resetsthesensorbyasoftreset{unsignedcharerror=0;s_connectionreset();//启动连接复位error+=s_write_byte(RESET);//发送复位命令returnerror;//error=1通讯错误}/*读状态寄存器chars_read_statusreg(unsignedchar*p_value,unsignedchar*p_checksum)//----------------------------------------------------------------------------------//readsthestatusregisterwithchecksum(8-bit){unsignedcharerror=0;s_transstart();//transmissionstarterror=s_write_byte(STATUS_REG_R);//sendcommandtosensor*p_value=s_read_byte(ACK);//readstatusregister(8-bit)*p_checksum=s_read_byte(noACK);//readchecksum(8-bit)returnerror;//error=1incaseofnoresponseformthesensor}//写状态寄存器chars_write_statusreg(unsignedchar*p_value)//writesthestatusregisterwithchecksum(8-bit){unsignedcharerror=0;s_transstart();//transmissionstarterror+=s_write_byte(STATUS_REG_W);//sendcommandtosensorerror+=s_write_byte(*p_value);//sendvalueofstatusregisterreturnerror;//error=1incaseofnoresponseformthesensor}*///温湿度测量chars_measure(unsignedchar*p_value,unsignedchar*p_checksum,unsignedcharmode)//进行温度或者湿度转换,由参数mode决定转换内容;{//enum{TEMP,HUMI};//已经在头文件中定义unsignederror=0;...unsignedinti;s_transstart();//启动传输switch(mode)//选择发送命令{caseTEMP:error+=s_write_byte(MEASURE_TEMP);break;//测量温度caseHUMI:error+=s_write_byte(MEASURE_HUMI);break;//测量湿度default:break;}for(i=0;i65535;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);//readCRC校验码returnerror;//error=1通讯错误}//温湿度值标度变换及温度补偿voidcalc_sth10(float*p_humidity,float*p_temperature){constfloatC1=-4.0;//12位湿度精度修正公式constfloatC2=+0.0405;//12位湿度精度修正公式constfloatC3=-0.0000028;//12位湿度精度修正公式constfloatT1=+0.01;//14位温度精度5V条件修正公式constfloatT2=+0.00008;//14位温度精度5V条件修正公式floatrh=*p_humidity;//rh:12位湿度floatt=*p_temperature;//t:14位温度floatrh_lin;//rh_lin:湿度linear值floatrh_true;//rh_true:湿度ture值floatt_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_true100)rh_true=100;//湿度最大修正if(rh_true0.1)rh_true=0.1;//湿度最小修正*p_temperature=t_C;//返回温度结果*p_humidity=rh_true;//返回湿度结果}//从相对温度和湿度计算露点/*floatcalc_dewpoint(floath,floatt){floatlogEx,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);returndew_point;}*//***********************************************************************************************************************************************************///DS1602程序(1602.c)://#includetou.h//内部等待函数**************************************************************unsignedcharLCD_Wait(void){RS=0;RW=1;_nop_();E=1;_nop_()
本文标题:SHT11温湿度传感器与1602应用代码和仿真设计
链接地址:https://www.777doc.com/doc-6135078 .html