当前位置:首页 >> 电子/电路 >>

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


基于 51 单片机 SHT11 温湿度传感器检测程 序(含电路图)
?

? 下面是原理图:

下面是 SHT11 与 MCU 连接的典型电路:

下面是源代码:

view source print? 001.#include <reg52.h> 002.#include <intrins.h> 003. 004./******************************************************** 005. 宏定义 006.********************************************************/ 007.#define uint unsigned int 008.#define uchar unsigned char 009.#define noACK 0 010.#define ACK 1 011.#define STATUS_REG_W 0x06 012.#define STATUS_REG_R 0x07 013.#define MEASURE_TEMP 0x03 014.#define MEASURE_HUMI 0x05 015.#define RESET 0x1e 016. 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_(); //延时 3us 228. 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; //如果是校验,读取完后结束通讯 www.it165.net ; 253. SCK=1; 254. _nop_();_nop_();_nop_(); //延时 3us 255. 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; //CRC 354. 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. else 366. { 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 温湿度传感器检测程序相关资




相关文章:
基于51单片机SHT11温湿度传感器检测程序.doc
传感器|基于51单片机SHT11温湿度传感器检测程序_电子/电路_工程科技_专业资料。基于 51 单片机 SHT11 温湿度传感器检测程 序(含电路图) ? ? 下面是原理图: 下面...
基于51单片机SHT11温湿度传感器检测程序(运用12864液晶....doc
基于51单片机SHT11温湿度传感器检测程序(运用12864液晶显示) - /*
基于51单片机SHT11温湿度传感器检测程序.doc
温湿度| 单片机| 传感器|基于51单片机SHT11温湿度传感器检测程序_信息与通信_工程科技_专业资料。基于 51 单片机 SHT11 温湿度传感器检测程 序(含电路图) ? ? ...
基于SHT11温湿度传感器课程设计.doc
采用湿度和温度测量,即用一个温湿度传感器 SHT11 ...51 单片机 系统 显示单元 图 1 系统框图 4 硬件...片内含4k bytes的可反复擦写的只读程序存储器 (PEROM...
基于AT89752单片机的SHT11温湿度测试仪 (正式).doc
本系统采用技术成熟的 SHT11 作为测量温湿度传感器...最后设计了系统各个功能部分的软件程序。 由本设计...功能强大 AT89C51 单片机可提供许多 高性价比的...
基于sht11数字传感器的温湿度控制器设计.doc
关键词:sht11;温湿度传感器;51 单片机 中图分类号: TP21 文献标识码: A ...该部分的程序采用模块化设计的方 法,主要包括主程序初始化,键盘扫描,温湿度测量...
数字温湿度传感器SHT11及其应用.pdf
数字温湿度传感器SHT11及其应用 - 介绍了数字温湿度传感器SHT11的工作原理、内部结构、测量时序及输出特性,并以SHT11测量元件,设计了一种基于单片机的温湿度测控...
基于数字温湿度传感器SHT11的温湿度测控系统_冯显英.pdf
基于数字温湿度传感器SHT11的温湿度测控系统_冯显英_...系数以程序形式储存在 OTP 内存 中 , 在测量过程...AT89C51SHT11连接 进行采样 时 , 只需 用两...
基于AT89752单片机的SHT11温湿度测试仪毕业论文.doc
基于AT89752单片机的SHT11温湿度测试仪毕业论文_工学...6 2.2.2 SHT11 温湿度传感器的介绍 ... 8 2...最后设计了系统各个功能部分的软件程序。由 本设计...
求温湿度传感器SHT11的源程序(51单片机语言).txt
温湿度传感器SHT11源程序(51单片机语言) - #define DATA
数字温湿度传感器SHT11及其应用_图文.pdf
并以SHTll为 测量元件,设计了一种基于单片机温湿度测控系统,给出了系统的...(3)温度测量、控制子程序:微控制器首先发布 亟A亡畚WRSM89C51 测控系统电路...
SHT11温湿度传感器AVR单片机程序.txt
SHT11温湿度传感器AVR单片机程序 [日期:2010-09-12 ] [来源
基于数字温湿度传感器SHT11的温湿度测控系统.pdf
同时对利用 SHT11温 湿度传感器、 AT89C51微控器...关键词: 温湿度 传感器 单片机 测控系统 internal ...校准系数以程序形式储存在 OTP 内存 中, 在测量...
数字温湿度传感器SHT11及其应用_张艳丽.doc
数字温湿度传感器SHT11及其应用_张艳丽_电子/电路_...校准系 数以程序形式储存在 OTP 内存中,在测量过程...基于51单片机SHT11温湿度... 10页 3下载券 数字...
基于51单片机的温湿度检测器设计.pdf
》 设计应用 》 基于51单片机温湿度检测器设计苏州信息职业技术学院通信与信息...传感器上电后,要等待 11ms,从“休眠”状态 表1 SHT10 命令对照表 2.系统...
基于SHT11数字传感器的温湿度控制器设计_论文.pdf
基于SHT11数字传感器的温湿度控制器设计_电子/电路_...显示测量数据 ,设计 了一种基于单片机的温湿度测控 ...关键词 :shtl1 ;温湿度传 感器;51单 片机 中...
SHT11单片机程序.doc
SHT11 数字式温湿度传感器单片机程序(温度和湿度的分开写的,实质是一 样的) 1,单独测温度的程序,在 TX-1C 板子上用数码管显 示温度值 #include<reg51.h...
数字温湿度传感器sht11及其应用_图文.doc
本文基于数字温湿度传感器SHTll 的温湿度测控系统电路结构简单、检测准确、稳定性...戴佳 51单片机C语言应用程序设计实例精讲 2006 3.沙占友 集成化智能传感器原理...
中文翻译应用sht11 71智能传感器对温湿度的检测大学论文.doc
中文翻译应用sht11 71智能传感器温湿度检测大学论文 - 中北大学 20
温湿度传感器SHT11的检测系统设计.pdf
温湿度传感器SHT11检测系统设计 - 温湿度传感器 SHT11检测系统设计 1 SHT11 简介 SHT11 是瑞士 Scnsirion 公司推出的一款数字温湿度传感器芯片。该芯片广泛....
更多相关标签: