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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
218.
219.char s_write_byte(unsigned char value)
220.{
221. unsigned char i,error=0;
222. for (i=0x80;i>0;i>>=1)
223. {
224. if (i&value) DATA=1;
225. else DATA=0;
226. SCK=1;
227. _nop_();_nop_();_nop_();
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;
237.}
238.
239.
240.
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)
247. {
248. SCK=1;
249. if(DATA) val=(val|i);
250. SCK=0;
251. }
252. DATA=!ack;
253. SCK=1;
254. _nop_();_nop_();_nop_();
255. SCK=0;
256. _nop_();_nop_();_nop_();
257. DATA=1;
258. return val;
259.}
260.
261.
262.
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.
284.
285.void s_connectionreset(void)
286.{
287. unsigned char i;
288. DATA=1; SCK=0;
289. for(i=0;i<9;i++)
290. {
291. SCK=1;
292. SCK=0;
293. }
294. s_transstart();
295.}
296.
297.
298.
299.
300.char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
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);
315. *(p_value+1)=s_read_byte(ACK);
316. *p_checksum =s_read_byte(noACK);
317. return error;
318.}
319.
320.
321.
322.void calc_sth10(float *p_humidity ,float *p_temperature)
323.{
324. const float C1=-4.0;
325. const float C2=+0.0405;
326. const float C3=-0.0000028;
327. const float T1=+0.01;
328. const float T2=+0.00008;
329.
330. float rh=*p_humidity;
331. float t=*p_temperature;
332. float rh_lin;
333. float rh_true;
334. float 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;
354. init12864lcd();
355. display1();
356. display2();
357. display3();
358. s_connectionreset();
359. while(1)
360. {
361. 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.}