如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
//////////////////////////////ds18b20模块////////////////////////////////////////////////////DS18B20是美国DALLAS半导体公司生产的可组网的一线式数字温度传感器,由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。以下是常见的DS18B20的测温程序,其正确性笔者已经通过仿真实验和实际电路验证过。在程序设计时,只要将ds18b20.c和主程序放在同一个工程中,且在主程序中包含头文件ds18b20.h即可。DS18B20头文件:ds18b20.h#ifndef__DS18B20_H__#define__DS18B20_H__voiddelay_18B20(unsignedinti);Init_DS18B20(void);ReadOneChar(void);WriteOneChar(unsignedchardat);ReadTemperature(void);#endif测温C程序:ds18b20.c#include<AT89X52.H>sbitDQ=P1^0;//定义通信端口unsignedcharsign;voiddelay_18B20(unsignedinti){while(i--);}//初始化函数Init_DS18B20(void){unsignedcharx=0;DQ=1;//DQ复位delay_18B20(8);//稍做延时DQ=0;//单片机将DQ拉低delay_18B20(80);//精确延时大于480usDQ=1;//拉高总线delay_18B20(14);x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败delay_18B20(20);}//读一个字节ReadOneChar(void){unsignedchari=0;unsignedchardat=0;for(i=8;i>0;i--){DQ=0;//给脉冲信号dat>>=1;DQ=1;//给脉冲信号if(DQ)dat|=0x80;delay_18B20(4);}return(dat);}//写一个字节WriteOneChar(unsignedchardat){unsignedchari=0;for(i=8;i>0;i--){DQ=0;DQ=dat&0x01;delay_18B20(5);DQ=1;dat>>=1;}}//读取温度ReadTemperature(void){unsignedchara=0;unsignedcharb=0;unsignedintt=0,temp=0;Init_DS18B20();WriteOneChar(0xCC);//跳过读序号列号的操作WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度delay_18B20(100);a=ReadOneChar();b=ReadOneChar();Init_DS18B20();WriteOneChar(0xCC);//跳过读序号列号的操作WriteOneChar(0x44);//启动温度转换//传感器返回值除16得实际温度值//为了得到2位小数位,先乘100,再除16,考虑整型数据长度,//技巧处理后先乘25,再除4,除4用右移实现temp=b&0xf0;if(temp==0xf0){sign=0x40;a=~a;b=~b;}elsesign=0x3f;b=b&0x0f;t=(b*256+a)*25/4;return(sign,t);}/////////////////////////////////////////////////////////网上程序//////////////////////////////////////////////////就算是用软件的方式提高精度也只是虚拟的温度,18B20精度就是0.0625度,符合你的要求了,下面是我写的程序,有兴趣你可以参考一下。带报警设置#include<AT89X51.H>#defineucharunsignedchar