📄 8583 b20.lst
字号:
231
232 /*void DS18B20_init(void)
233 {
234 flag_init=1; //初始化成功标志位,0为成功
235 DQ=1; //DQ复位
236 _nop_();
237 DQ=0; //拉低DQ
238 Delay_uS(58); //延时484us(此信号要求480us~960us)
239 DQ=1; //释放DQ
240 Delay_uS(5); //延时61us (在检测到 I/O 引脚上的上升沿之后DS18B20等待15us~60us并且接着发送存在脉冲60-240us
-的低电平信号)
C51 COMPILER V7.07 8583_B20 02/05/2009 23:03:45 PAGE 5
241 flag_init=DQ;
242 Delay_uS(40); //延时241us(DS18B20发送存在脉冲的低电平信号60~240us)
243 }
244 */
245 unsigned char Readonechar(void) //读一个字节
246 {
247 1 unsigned char i,dat=0;
248 1 for(i=8;i>0;i--)
249 1 {
250 2 DQ=0;
251 2 dat>>=1;
252 2 DQ=1;
253 2 if(DQ)
254 2 dat|=0x80;
255 2 Delay_uS(6);//延时61us(所有读时间片的最短持续期限为60us,各个读时间片之间必须有最短为1us的恢复时间)
256 2 }
257 1 return dat;
258 1 }
259
260 void Writeonechar(unsigned char dat) //写一个字节
261 {
262 1 unsigned char i;
263 1 for(i=8;i>0;i--)
264 1 {
265 2 DQ=0;
266 2 DQ=dat&0x01;
267 2 Delay_uS(5); //延时61us(在I/O线由高电平变为低电平之后DS1820在15us~60us之间对 I/O 线采样)
268 2 DQ=1;
269 2 dat>>=1;
270 2 }
271 1 }
272
273 void Readtemperature(void)
274 {
275 1 tens=0;units=0;decile=0;tmp=0;
276 1 tmprt=0;
277 1 DS18B20_init();
278 1 Writeonechar(0xcc);// 跳过读序列号的操作
279 1 Writeonechar(0x44);// 启动温度转换
280 1 Delay1mS(500);
281 1 DS18B20_init();
282 1 Writeonechar(0xcc);//跳过读序号列号的操作
283 1 Writeonechar(0xbe);//读取温度寄存器
284 1
285 1 units=Readonechar();//读低八位
286 1 tens=Readonechar(); //读高八位
287 1
288 1 tens<<=8;
289 1 tens|=units; //高低位合并
290 1 tmprt=tens*0.0625; //计算温度值
291 1 tmp=tmprt*10+0.5; //放大10倍输出并四舍五入
292 1
293 1 tens=tmp/100; //十位
294 1 units=tmp/10%10; //个位
295 1 tempb21=(uchar)units;
296 1 tempb20=(uchar)tens;
297 1 decile=tmp%10; //小数位
298 1 }
299 //////////////////断码输出//////////////////////
300
301 void send164(uchar m)
302 {uchar k,i,b;
C51 COMPILER V7.07 8583_B20 02/05/2009 23:03:45 PAGE 6
303 1 k=SEG7[m];
304 1 i=8;
305 1 CLK=0;
306 1 while (i--)
307 1 {b=k>>i;
308 2 if((b&0x01)==0x01)DATA=1;//判断b的最低位的值是多少
309 2 else DATA=0;
310 2 CLK=1; _nop_();
311 2 CLK=0;
312 2 }
313 1
314 1 }
315 //P2 KOU //P1kou
316
317 void dis_time(uchar m)
318 {
319 1 P1&=0XC3;/// 等价于 P1=P1&0xc3;;准备送段码 ,位码口全部清零
320 1 P2=0X00;////准备送段码,位码口全部清零
321 1
322 1 {switch(m)
323 2 {case 0:{send164(tempb21);P2|=act[m];P1&=0XC3;}break;
324 3 case 1:{send164(tempb20);P2|=act[m];P1&=0XC3;}break;
325 3 case 2:{send164(day/10);P2|=act[m];P1&=0XC3;}break;
326 3 case 3:{send164(day%10);P2|=act[m];P1&=0XC3;}break;
327 3 case 4:{send164(hou/10);P2|=act[m];P1&=0XC3;}break;
328 3 case 5:{send164(hou%10);P2|=act[m];P1&=0XC3;}break;
329 3 case 6:{send164(min/10);P2|=act[m];P1&=0XC3;}break;
330 3 case 7:{send164(min%10);P2|=act[m];P1&=0XC3;}break;
331 3 case 8:{send164(sec/10);P1|=act[m];P2=0X00;}break;
332 3 case 9:{send164(sec%10);P1|=act[m];P2=0X00;}break;
333 3 case 10:{send164(tempb20);P1|=act[m];P2=0X00;}break;
334 3 case 11:{send164(tempb21);P1|=act[m];P2=0X00;}break;
335 3
336 3 default:break;}
337 2 }
338 1
339 1 }
340
341
342 void dis_adjtime(uchar m)
343 {
344 1 if(cnt>100)
345 1 {
346 2 P1&=0XC3;
347 2 P2=0X00;
348 2 switch(m)
349 2 {case 0:{send164(mon/10);P2|=act[m];P1&=0XC3;}break;
350 3 case 1:{send164(mon%10);P2|=act[m];P1&=0XC3;}break;
351 3 case 2:{send164(day/10);P2|=act[m];P1&=0XC3;}break;
352 3 case 3:{send164(day%10);P2|=act[m];P1&=0XC3;}break;
353 3 case 4:{send164(hou/10);P2|=act[m];P1&=0XC3;}break;
354 3 case 5:{send164(hou%10);P2|=act[m];P1&=0XC3;}break;
355 3 case 6:{send164(min/10);P2|=act[m];P1&=0XC3;}break;
356 3 case 7:{send164(min%10);P2|=act[m];P1&=0XC3;}break;
357 3 case 8:{send164(0);P1&=act[m];P2=0X00;}break;
358 3 case 9:{send164(0);P1&=act[m];P2=0X00;}break;
359 3 case 10:{send164(0);P1&=act[m];P2=0X00;}break;
360 3 case 11:{send164(0);P1&=act[m];P2=0X00;}break;
361 3 default:break;
362 3 }
363 2 }
364 1 else
C51 COMPILER V7.07 8583_B20 02/05/2009 23:03:45 PAGE 7
365 1 {
366 2 P1&=0XC3;
367 2 P2=0X00;
368 2 }
369 1 }
370
371
372 void TIMERIni(void)
373 {
374 1 TMOD=0X11;
375 1 TH0=0xFa;TL0=0x24;TH1=0X3C;TL1=0XAF;
376 1 EA=1;
377 1 ET0=1;
378 1 ET1=1;
379 1 TR1=1;TR0=1;
380 1 }
381
382
383
384
385
386 /*******************************************************************
387 起动总线函数
388 函数原型: void Start_I2c();
389 功能: 启动I2C总线,即发送I2C起始条件.
390
391 ********************************************************************/
392 void Start_I2c(void)
393 {
394 1 SDA=1; /*发送起始条件的数据信号*/
395 1 _Nop();
396 1 _Nop();
397 1 SCL=1;
398 1 _Nop(); /*起始条件建立时间大于4.7us,延时*/
399 1 _Nop();
400 1 _Nop();
401 1 _Nop();
402 1 _Nop();
403 1 _Nop(); /*起始条件建立时间大于4.7us,延时*/
404 1 SDA=0; /*发送起始信号*/
405 1 _Nop(); /* 起始条件锁定时间大于4μs*/
406 1 _Nop();
407 1 _Nop();
408 1 _Nop();
409 1 _Nop();
410 1 _Nop(); /*起始条件建立时间大于4.7us,延时*/
411 1 SCL=0; /*钳住I2C总线,准备发送或接收数据 */
412 1 _Nop();
413 1 _Nop();
414 1 _Nop();
415 1 _Nop();
416 1 }
417
418
419
420
421 /*******************************************************************
422 结束总线函数
423 函数原型: void Stop_I2c();
424 功能: 结束I2C总线,即发送I2C结束条件.
425
426 ********************************************************************/
C51 COMPILER V7.07 8583_B20 02/05/2009 23:03:45 PAGE 8
427 void Stop_I2c(void)
428 {
429 1 SDA=0; /*发送结束条件的数据信号*/
430 1 _Nop(); /*发送结束条件的时钟信号*/
431 1 _Nop(); /*发送结束条件的时钟信号*/
432 1 SCL=1; /*结束条件建立时间大于4μs*/
433 1 _Nop();
434 1 _Nop();
435 1 _Nop();
436 1 _Nop();
437 1 _Nop();
438 1 SDA=1; /*发送I2C总线结束信号*/
439 1 _Nop();
440 1 _Nop();
441 1 _Nop();
442 1 _Nop();
443 1 _Nop();
444 1 }
445
446
447
448
449 /*******************************************************************
450 字节数据传送函数
451 函数原型: void SendByte(uchar c);
452 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
453 此状态位进行操作.(不应答或非应答都使ack=0 假)
454 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
455 ********************************************************************/
456 void SendByte(uchar c)
457 {
458 1 uchar BitCnt;
459 1
460 1 for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
461 1 {
462 2 if((c<<BitCnt)&0x80)SDA=1; /*判断发送位*/
463 2 else SDA=0;
464 2 _Nop();
465 2 _Nop();
466 2 SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -