tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff};
//--------------------------------------- //名称:复位DS18B20函数 //--------------------- bit Reset(void) {
unsigned inti; bit k;
ds18b20=0; //拉低DQ总线开始复位 i=95; //保持DQ低大约870uS,符合不低于48US的要求
while(i--); //保持DQ低大约870uS,符合不低于48US的要求
//保持DQ低大约870uS,符合不低于48US的要求
ds18b20=1; //拉高准备接收数据 i=9; //大约80uS后 while(i--); //大约80uS后 //大约80uS后
k=ds18b20; //读出数据并保存 i=55; //维持约490US,符合总读时隙不低于480US的要求
while(i--); //维持约400US,符合总读时隙不低于480US的要求
//维持约400US,符合总读时隙不低于480US的要求
return k; //k=0为复位成功,k=1为复位失败 }
//--------------------------------------- //名称:读一字节函数
//--------------------------------------- unsigned char ReadByte(void) {
unsigned inti;
unsigned char j,buf=0;
for(j=0;j<8;j++) //接收8次还原一个字节数据
{
buf=buf>>1; //接收前,想将接收缓冲区右移 ds18b20=0; //拉低
_nop_(); //维持2US,符合大于1US小于15US的规范
_nop_(); //维持2US,符合大于1US小于15US的规范
ds18b20=1; //拉高,为读数据做准备 _nop_(); //维持6US,符合大于1US小于15US的规范
_nop_(); //维持6US,符合大于1US小于15US的规范
_nop_(); //维持6US,符合大于1US小于15US的规范
_nop_(); //维持6US,符合大于1US小于15US的规范
_nop_(); //维持6US,符合大于1US小于15US的规范
_nop_(); //维持6US,符合大于1US小于15US的规范
_nop_(); //维持6US,符合大于1US小于15US的规范
if(ds18b20==1)
buf|=0x80; //读出1位数据保存于buf中 i=7; //维持约52US,符合总读时隙不低于60US的要求
while(i--); //维持约52US,符合总读时隙不低于60US的要求
//维持约52US,符合总读时隙不低于60US的要求 }
return buf; //退出的同时将接收缓冲区参数返回 }
//--------------------------------------- //名称:写一字节函数
//--------------------------------------- void WriteByte(unsigned char dat) {
unsigned inti; unsigned char j; for(j=0;j<8;j++) {
if(dat&0x01) //如果写1
{
ds18b20=0; //拉低
_nop_(); //维持2US,符合大于1US小于15US的规范
_nop_(); //维持2US,符合大于1US小于15US的规范
ds18b20=1; //拉高
i=7; //维持约63US,符合不低于60US的要求
while(i--); //维持约63US,符合不低于60US的要求 }
else //如果写0 {
ds18b20=0; //拉低
i=7; //维持约63US,符合不低于60US的要求
while(i--); //维持约63US,符合不低于60US的要求
ds18b20=1; //拉高
_nop_(); //维持2US,符合大于1US的规范
_nop_(); //维持2US,符合大于1US的规范 }
dat=dat>>1; //写入字节右移1位 } }
//--------------------------------------- //名称:DS18B20温度转换函数 //--------------------------------------- bit Convert(void) {
if(Reset()==0) //复位DS18B20成功 {
WriteByte(0xcc); //写入跳过序列号命令字 Skip Rom
WriteByte(0x44); //写入温度转换命令字 Convert T
return 1; //启动温度转换成功 }
else //失败 {
return 0; //启动温度转换失败
} }
//--------------------------------------- //名称:转换结束处理函数
//--------------------------------------- void ReadFlash(void) {
unsigned char Lsb,Msb;
if(Reset()==0) //复位DS18B20成功 {
WriteByte(0xcc); //写入跳过序列号命令字 Skip Rom
WriteByte(0xbe); //写入读取数据令字 Read Scratchpad
Lsb=ReadByte(); //读出第一个字节暂存于LSB
Msb=ReadByte(); //读出第二个字节暂存于MSB
temp1=Lsb; //temp1内装温度参数的小数部分 temp2=Msb;//>>4)|(Lsb<<4);//temp2内装温度参数的整数部分 }
else {
temp1=0; //如果复位失败,温度参数清零 temp2=0; //如果复位失败,温度参数清零 } }
//---------------------------------------
void main(void) //主函数,单片机开机后就是从这个函数开始运行 {
unsigned char TT;
while(1) //死循环,单片机初始化后,将一直运行这个死循环 {
if(Convert()==1) //启动转换 {
ReadFlash(); //读取温度 TT=(temp2<<4)|(temp1>>4); P3=tab[TT/10]; //温度整数部分个位 P2=tab[TT%10]; //温度整数部分十位 }
} }
#include\"reg52.h\" #include\"intrins.h\"
#define uchar unsigned char sbit DIO=P3^0; sbit B7=B^7; uchartL,tH;
void delay(uchar us) {
while(us--); }
bit init18b20() {
bit w;
DIO=0; //pull low
delay(145); //pull low 880us DIO=1; //pull High
delay(13); //pull High 90us w=DIO; //after read state
delay(88); //Not less than 480 us return w; //w=0,success,w=1,fail
}
uchar r18b20(void) {
uchari;
B=0;
for(i=0;i<8;i++) {
B=B>>1; DIO=0;
_nop_(); //pull low 2us
_nop_(); //12M nop 2 times,6M 1 time. DIO=1; //pull high read _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
B7=DIO; //read bit to B delay(8); // 60us
}
}
return B;
void w18b20(uchardat) {
uchari;
if(dat& 0x01)
{
for(i=0;i<8;i++) {
DIO=0;
_nop_(); _nop_(); DIO=1; delay(10);
} else
{
DIO=0;
_nop_(); _nop_();
DIO=0; delay(8); DIO=1; _nop_(); _nop_();
}
dat=dat>>1;
} }
bitconverT(void) {
if(init18b20()==0) //0 sucess
{
w18b20(0xcc);
w18b20(0x44); return 1;
}
else //1 fail }
voidreaddata(void) {
return 0;
ucharLsb,Msb;
if(init18b20()==0) //sucess {
w18b20(0xcc);
w18b20(0xbe); Lsb=r18b20(); Msb=r18b20(); tL=Lsb; tH=Msb;
}
else {
tL=0;
tH=0;
} }
void main() {
uchar temp;
while(1)
{
if(converT()==1) //start conver
{
readdata();
temp=(tH<<4) | (tL>>4); P2=temp;
} } }
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- dfix.cn 版权所有 湘ICP备2024080961号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务