如何使用ds18b20我的延时老是有问题晶振12Mhz
来源:学生作业帮助网 编辑:六六作业网 时间:2024/11/24 06:17:57
如何使用ds18b20我的延时老是有问题晶振12Mhz
如何使用ds18b20
我的延时老是有问题
晶振12Mhz
如何使用ds18b20我的延时老是有问题晶振12Mhz
#include
#include
#include
sbit DQ=P2^3;
unsigned char tempL=0; //临时变量低位
unsigned char tempH=0; //临时变量高位
double temperature; //温度值
/*void delay10(void) //误差 0us//10us
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=2;a>0;a--);
}
void delay15(void) //误差 0us//15us
{
unsigned char a;
for(a=6;a>0;a--);
}*/
void delay30(void) //误差 0us //30us
{
unsigned char a,b;
for(b=3;b>0;b--)
for(a=3;a>0;a--);
}
void delay45(void) //误差 0us //45us
{
unsigned char a;
for(a=21;a>0;a--);
}
/*void delay60(void) //误差 0us
{
unsigned char a,b;
for(b=3;b>0;b--)
for(a=8;a>0;a--);
}
void delay128(void) //误差 0us
{
unsigned char a,b;
for(b=25;b>0;b--)
for(a=1;a>0;a--);
}
*/
void delay500(void) //误差 0us//500us
{
unsigned char a,b;
for(b=71;b>0;b--)
for(a=2;a>0;a--);
}
/*void delay800(void) //误差 0us //800us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=2;b>0;b--)
for(a=197;a>0;a--);
}
void delay70(void) //误差 0us
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=32;a>0;a--);
}
void delay14(void) //误差 0us
{
unsigned char a,b,c,d;
for(d=1;d>0;d--)
for(c=1;c>0;c--)
for(b=1;b>0;b--)
for(a=1;a>0;a--);
}
void delay40ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
*/
void delay150ms(void) //误差 0us //150ms
{
unsigned char a,b,c;
for(c=3;c>0;c--)
for(b=116;b>0;b--)
for(a=214;a>0;a--);
}
/*void delay600ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=244;c>0;c--)
for(b=8;b>0;b--)
for(a=152;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
*/
void delay800ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=95;c>0;c--)
for(b=138;b>0;b--)
for(a=29;a>0;a--);
_nop_(); //if Keil,require use intrins.h
_nop_(); //if Keil,require use intrins.h
}
//
ReadTemperature(void)
{
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0x44); //启动温度转换
delay800ms(); //转换需要一点时间,延时100~200ms
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)
tempL=ReadOneChar(); //读出温度的低位LSB
tempH=ReadOneChar(); //读出温度的高位MSB
//温度转换,把高低位做相应的运算转化为实际温度
temperature=((tempH*256)+(tempL))*0.0625;
delay150ms();
return(temperature);
}
试试这个