中级会员
 
- 积分
- 221
- 金钱
- 221
- 注册时间
- 2016-6-16
- 在线时间
- 56 小时
|

楼主 |
发表于 2019-6-11 13:57:20
|
显示全部楼层
先遇到问题是,读取的温度一直是0,之前用stm32读取,很顺利,这个stm8s103读取一直是0 程序改了n变,时序确认了n遍,就是不行。问原因。
另外,这款芯片有内部温度传感器嘛,有的话就不用18b20了。
#include "ds18b20.h"
/*********************************************************************************
* 函 数 名: delay_us
* 功能说明: 微秒延时程序,注意此函数的运行环境为(16M时钟速度)
* 形 参:nCount要延时的微秒数,输入nCount=1微妙
* 返 回 值: 无
*********************************************************************************/
void delay_us(u16 nCount) //16M 晶振时 延时 1个微妙
{
nCount*=3;//等同于 nCount=nCount*3 相当于把nCount变量扩大3倍
while(--nCount);//nCount变量数值先减一,再判断nCount的数值是否大于0,大于0循环减一,等于0退出循环。
}
/*********************************************************************************
* 函 数 名: delay_ms
* 功能说明: 毫秒延时程序,注意此函数的运行环境为(16M时钟速度)
* 形 参:nCount要延时的毫秒数,输入nCount=1毫秒
* 返 回 值: 无
*********************************************************************************/
void delay_ms(u16 nCount) //16M 晶振时 延时 1个毫秒
{
while(nCount--)//先判断while()循环体里的nCount数值是否大于0,大于0循环,减一执行循环体,等于0退出循环。
{
delay_us(1000);//调用微妙延时函数,输入1000等译演示1毫秒。
}
}
u8 DS18B20_Read_Byte(void)
{
u8 i=0;
u8 TempData=0;
for(i=0;i<8;i++)
{
TempData>>=1;
DZX_O;
DZX_L;
delay_us(2);
DZX_H;
// delay_us(10);
DZX_I;
delay_us(2);
if(DZX_V)
{
TempData|=0x80;
}
delay_us(60);
}
return TempData;
}
void DS18B20_Write_Byte(u8 dat)
{
u8 i=0;
DZX_O;
for(i=0;i<8;i++)
{
DZX_L;
delay_us(15);
if((dat&0x01))
{
DZX_L;
delay_us(2);
DZX_H;
delay_us(60);
}
else
{
DZX_L;
delay_us(60);
DZX_H;
delay_us(2);
}
dat>>=1;
}
}
void DS18B20_Reset(void)
{
DZX_O;
DZX_L;
delay_us(480);
DZX_H;
delay_us(480);
}
u8 DS18B20_Check(void)
{
u8 retry=0;
DZX_I;
while (retry<60)
{
retry++;
delay_us(1);
if(DZX_V==0) break;
}
if(retry>=60) return 1;
else
{
retry=0;
return 0;
}
}
double DS18B20_Get_wd(void)
{
u8 TL=0,TH=0;
u16 temp=0;
double wd=0;
DS18B20_Reset();
// if(DS18B20_Check()==0) delay_us(480);
DS18B20_Write_Byte(0xCC);
DS18B20_Write_Byte(0x44);
delay_ms(800);
DS18B20_Reset();
DS18B20_Write_Byte(0xCC);
DS18B20_Write_Byte(0xBE);
TL=DS18B20_Read_Byte();
TH=DS18B20_Read_Byte();
temp=TH;
temp=(temp<<8)+TL;
if((temp&0xF800)==0xF800)//负温度
{
temp=~temp;
temp=temp+1;
wd=temp*(-0.0625);
}
else
{
wd=temp*0.0625;
}
return wd;
}
int DS18B20_Demo(void)
{
int temp=0;
temp=DS18B20_Get_wd();
return temp;
// printf("当前环境温度:%d.%d ℃\r\n",(u16)temp,Get_decimal(temp,4));
}
|
|