89C51单片机温度检测的实现.docx

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
89C51单片机温度检测的实现

#include reg52.h#include stdio.h #include math.h #includeintrins.h sbit DS18B20=P3^4;sbit dp0=P2^4;sbit dp1=P2^5; sbit dp2=P2^6; sbit dp3=P2^7;sbit BIT7=ACC^7;bit Error_DS18B20,dply=0;int dpbuf[4]={0,0,0,0},x=0;unsigned char table[11]={0x18,0x7b,0x2c,0x29,0x4b,0x89,0x88,0x3b,0x08,0x09,0xff};unsigned char dpt=0,tdh=0,tdl=0,spk=0;/*DS18B20初始化时序程序*/void delay15(unsigned char n){ do { _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); n--; } while(n); }/*DS18B20写一个字节程序*/void RST18B20(void){ DS18B20=0; delay15(36); //根据时序要求进行延时540us DS18B20=1; delay15(6); //根据时序要求进行延时90us Error_DS18B20=DS18B20;//根据时序图进行读18B20的0回应,接收到0才是对的 delay15(18); //根据时序要求进行延时270us}void WR18B20(unsigned char d){ unsigned char i; //d为待写的字节变量 ACC=d; for(i=8;i0;i--) { DS18B20=0; //起始 delay15(1); ACC=ACC1; //将第一位待发数据送入CY DS18B20=CY; //送出一位数据 delay15(3); DS18B20=1; } }/*DS18B20读一个字节程序*/unsigned char RD18B20(void){ unsigned char i; ACC=0; for(i=8;i0;i--) { ACC=ACC1; DS18B20=0; _nop_(); _nop_(); DS18B20=1; delay15(1); BIT7=DS18B20; delay15(3); } return(ACC);}void display() //只负责4个管子的轮流动态显示,不管如何显示,怎么显示。计数功能在中断里完成{ TH0=0xee;//5mS TL0=0x00; if(dpt3) dpt++; //动态显示计数器 else dpt=0; P0=table[dpbuf[dpt]]; switch(dpt) { case 0:dp1=dp2=dp3=1;dp0=0; break; case 1:dp0=dp2=dp3=1;dp1=0; break; case 2:dp0=dp1=dp3=1;dp2=0; P0=table[dpbuf[dpt]]0xf7;//为了增加分与秒之间的小数点 break; case 3:dp0=dp1=dp2=1;dp3=0; }}void Timer0() interrupt 1 //通过中断来循环扫描,实现动态显示{TH0=0xee; //5msTL0=0; spk++; if(spk=200) dply=1;dpbuf[0]=tdl%10; dpbuf[1]=tdl/10;dpbuf[2]=tdh%10;dpbuf[3]=tdh/10; display(); }void main(){ dp0=dp1=dp2=dp3=1; TMOD=0x01;//定时器配置 TH0=0xee; //5ms TL0=0; EA=1; ET0=1; TR0=1; while(1) { if(dply) //计数到1s,每一秒检测一次 { spk=0; EA=0; //关中断,18B20检测时不可以被中断打断,否则时序会出现错误 RST18B20(); WR18B20(0xcc); WR18B20(0xbe); tdl=RD18B20(); tdh=RD18B20(); tdh=tdh*16+tdl/16;//由此拼接成整数部分 tdl=6.25*(tdl0x0f);//不能是0.0625,因为tdl是整形,乘以0.062

文档评论(0)

yan698698 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档