基于某51单片机SHT11温湿度传感器检测程序_第1页
基于某51单片机SHT11温湿度传感器检测程序_第2页
基于某51单片机SHT11温湿度传感器检测程序_第3页
基于某51单片机SHT11温湿度传感器检测程序_第4页
基于某51单片机SHT11温湿度传感器检测程序_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上基于51单片机SHT11温湿度传感器检测程序(含电路图)· · 下面是原理图:下面是SHT11与MCU连接的典型电路:下面是源代码: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 0x0

2、6012.#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=P

3、20;030.sbit lcdrw=P21;031.sbit lcden=P22;032.sbit SCK = P10;033.sbit DATA = P11;034.035./*036. 变量定义037.*/038.uchar table2="SHT11 温湿度检测"039.uchar table3="温度为: "040.uchar table4="湿度为:"041.uchar table5="."042.uchar wendu6;043.uchar shidu6;044.045./*046. 

4、;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. 

5、;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

6、=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. dela

7、y_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(

8、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.&

9、#160;134. write_dat(table2i);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(table3i);149. delay_50us(1);150. 151.152.

10、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(table4i);163. delay_50us(1);164. 165.166.167./*168. 12864液晶显示函数169.*/170.void displaywendu(void)171.172.

11、0;uchar i;173. write_12864com(0x94);174. for(i=0;i<3;i+)175. 176. write_dat(wendui);177. delay_50us(1);178. 179. for(i=0;i<1;i+)180. 181. write_dat(table5i);182. delay_50us(1);183. 184. for(i=4;i<5;i+)185. 186. write_dat(

12、wendui);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(shidui);202. delay_50us(1);203. 204. for(i=0;i<1;i+)

13、205. 206. write_dat(table5i);207. delay_50us(1);208. 209. for(i=4;i<5;i+)210. 211. write_dat(shidui);212. delay_50us(1);213. 214.215.216./*217. SHT11写字节程序218.*/219.char s_write_byte(unsigned char value)220.221. unsigned ch

14、ar 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.

15、 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

16、,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.&

17、#160;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.&

18、#160;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

19、;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.30

20、2. 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); brea

21、k; /测量湿度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); 

22、;/读第二个字节,低字节 (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位

23、湿度精度 修正公式325. const float C2=+0.0405; / 12位湿度精度 修正公式326. const float C3=-0.; / 12位湿度精度 修正公式327. const float T1=+0.01; / 14位温度精度 5V条件 修正公式328. const float T2=+0.00008; / 14位温度精度 5V条件 修正公式329.330. float rh=*p_hum

24、idity; / 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

25、*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.&

26、#160;主函数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

27、();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_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论