📄 text.lst
字号:
195 void Init_DS18B20(void)
196 {
197 1 unsigned char x=0;
198 1 DQ = 1; //DQ复位
199 1 delay_18B20(8); //稍做延时
200 1 DQ = 0; //单片机将DQ拉低
201 1 delay_18B20(80); //精确延时 大于 480us
202 1 DQ = 1; //拉高总线
203 1 delay_18B20(14);
204 1 x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
205 1 delay_18B20(20);
206 1 }
207
208 /***********ds18b20读一个字节**************/
209
210 unsigned char ReadOneChar(void)
211 {
212 1 uchar i=0;
213 1 uchar dat = 0;
214 1 for (i=8;i>0;i--)
215 1 {
216 2 DQ = 0; // 给脉冲信号
217 2 dat>>=1;
218 2 DQ = 1; // 给脉冲信号
219 2 if(DQ)
220 2 dat|=0x80;
221 2 delay_18B20(4);
222 2 }
223 1 return(dat);
224 1 }
225 /*************ds18b20写一个字节****************/
226
227 void WriteOneChar(uchar dat)
228 {
229 1 unsigned char i=0;
230 1 for (i=8; i>0; i--)
231 1 {
232 2 DQ = 0;
233 2 DQ = dat&0x01;
234 2 delay_18B20(5);
235 2 DQ = 1;
236 2 dat>>=1;
237 2 }
238 1 }
239
240 /**************读取ds18b20当前温度************/
241
C51 COMPILER V8.02 TEXT 04/04/2007 18:33:49 PAGE 5
242 void ReadTemperature(void)
243 {
244 1 unsigned char a=0;
245 1 unsigned char b=0;
246 1 unsigned int t=0;
247 1
248 1 Init_DS18B20();
249 1 WriteOneChar(0xCC); // 跳过读序号列号的操作
250 1 WriteOneChar(0x44); // 启动温度转换
251 1
252 1 delay_18B20(100); // this message is wery important
253 1
254 1 Init_DS18B20();
255 1 WriteOneChar(0xCC); //跳过读序号列号的操作
256 1 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
257 1
258 1 delay_18B20(100);
259 1
260 1 a=ReadOneChar(); //读取温度值低8位
261 1 b=ReadOneChar(); //读取温度值高8位
262 1 temp1=b<<4;
263 1 temp1+=(a&0xf0)>>4; //小数点前的数据
264 1 temp2=a&0x0f; //小数点后的数据
265 1 temp=temp1;
266 1
267 1 // temp=((b*256+a)>>4);//当前采集温度值除16得实际温度值
268 1
269 1
270 1
271 1 // temp1 = t/100%10; //温度值十位
272 1 // temp2 = t/10%10; //温度值个位
273 1 // temp3 = t%10; //温度值十分位
274 1 }
275
276 /***************液晶显示子函数1正常显示*****************/
277
278 void displayfun1(void)
279 {
280 1 WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号
281 1 DisplayListChar(0,0,str0);
282 1 DisplayListChar(0,1,str1);
283 1
284 1 DisplayOneChar(3,0,hour/10+0x30);
285 1 DisplayOneChar(4,0,hour%10+0x30);
286 1
287 1 DisplayOneChar(6,0,minite/10+0x30);
288 1 DisplayOneChar(7,0,minite%10+0x30);
289 1
290 1 DisplayOneChar(9,0, seconde/10+0x30);
291 1 DisplayOneChar(10,0,seconde%10+0x30);
292 1
293 1 DisplayOneChar(5,1,temp1/10+0x30);
294 1 DisplayOneChar(6,1,temp1%10+0x30);
295 1 DisplayOneChar(8,1,temp2/10+0x30);
296 1 }
297
298 /***************定时器t0初始化*******************/
299
300
301 void init_timer0(void)
302 {
303 1 TMOD=0x01; //time0为定时器,方式1
C51 COMPILER V8.02 TEXT 04/04/2007 18:33:49 PAGE 6
304 1 TH0=0x3c; //预置计数初值
305 1 TL0=0xb0;
306 1 EA=1;
307 1 ET0=1;
308 1 TR0=1;
309 1 }
310
311 /***********定时器t0中断子函数**************/
312
313 void timer0(void) interrupt 1 using 0 //定时器0方式1,50ms中断一次
314 {
315 1 TH0=0x3c;
316 1 TL0=0xb0;
317 1 mstcnt++;
318 1 if(mstcnt>=20 ) {seconde++; mstcnt=0; }
319 1 if(seconde>=60) {minite++; seconde=0;}
320 1 if(minite>=60 ) {hour++; minite=0; }
321 1 if(hour>=24 ) {hour=0;}
322 1 }
323
324
325 /*****************系统报警子函数***************************/
326
327 void playalarm(void) //语音提示温度上升过快
328 {
329 1
330 1 if(temp>20&&temp<25)
331 1 {
332 2 RED_ALARM=0;
333 2 PLAYE_ADDR=0x11;
334 2 _nop_();
335 2 PLAYE_ADDR=0x10;
336 2 delay_LCM(2000); //等待放音结束
337 2 RED_ALARM=1;
338 2 }
339 1
340 1 if(temp>25&&temp<30) //语音提示温度上升过慢
341 1 {
342 2 GREEN_ALARM=0;
343 2 PLAYE_ADDR=0x21;
344 2 _nop_();
345 2 PLAYE_ADDR=0x20;
346 2 delay_LCM(2000);
347 2 GREEN_ALARM=1;
348 2 }
349 1
350 1 if(temp>30) //语音提示恒温控制
351 1 {
352 2 WRITE_ALARM=0;
353 2 PLAYE_ADDR=0x31;
354 2 _nop_();
355 2 PLAYE_ADDR=0x30;
356 2 delay_LCM(1000);
357 2 WRITE_ALARM=1;
358 2 }
359 1 }
360
361 /***************the main funtion****************/
362
363 void main(void)
364 {
365 1 P1=0xff; //初始化p1口,全设为1
C51 COMPILER V8.02 TEXT 04/04/2007 18:33:49 PAGE 7
366 1 P3=0xff;
367 1 delay_LCM(500);
368 1 initLCM( ); //LCD初始化
369 1 init_timer0( ); //时钟定时器0初始化
370 1 DisplayListChar(0,0,str0);
371 1 DisplayListChar(0,1,str1);
372 1 Init_DS18B20( ); //DS18B20初始化
373 1
374 1 while (1)
375 1 {
376 2 delay_LCM(10);
377 2 ReadTemperature( );
378 2 playalarm( );
379 2 displayfun1( );
380 2 delay_LCM(10);
381 2 }
382 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 847 ----
CONSTANT SIZE = 34 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 11 10
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -