新手求解stm8 ds18b02程序的问题
我最近写了一个stm8s103f的DS18B02程序不知哪里出了问题,经过测试复位是正常的,就是写与读的函数不知那个出了问题,Temperature返回值是65535,我是个新手,请各位大神,帮我分析一下,哪里出错了,不胜感激。
部分代码以下:
#include "STM8S103F.h"
#define nop() _asm("nop") /* No Operation */
_Bool DS18B20_IO @PA_DDR:2;
#define DQ_OUT(X) DS18B20_IO=1;DQ_O=X
#define DQ_IN() DS18B20_IO=0
_Bool DQ_O @PA_ODR:2;
_Bool DQ @PA_IDR:2;
CLK_ICKR = 0x01;//高速内部RC振荡器使能
CLK_SWR = 0xE1;//HSI为主时钟源
//CLK_CKDIVR = 0x18;//时钟分频寄存器 16/8=2M
CLK_CKDIVR = 0x10;//时钟分频寄存器 16/4=4M
PA_DDR = 0b00001010;
PA_CR1 = 0b00000000; // 将PA1,PA3设置开漏输出 将PA2设置上拉输入
PA_CR2 = 0b00000000;
void DelayXus(unsigned int n)
{
while (n--)
{
nop();
nop();
nop();
IWDG_KR = 0xAA; //刷新IDDG,避免产生看门狗复位
}
}
//---------------------------------------
//名称: 复位DS18B20函数
//作者:cby
//网站:宁波单片机开发网
//网址:www.nbdpj.com
//邮箱:nbdpj@nbdpj.com
//日期:20110201
//-----------------------------------------
unsigned char DS18B20_Reset(void)
{
unsigned char i,outbit;
i=10;
DQ_OUT(0); //设置PA2位输出口,PA2=0;
DelayXus(400); //延时503us
DQ_IN(); //设置PA2为输入口释放总线等电阻拉高总线
while(i--)
{
if(DQ==0){ outbit=1;i=0;} //接收到应答信号
else{outbit=0;} //没有接收到应答信号,继续复位
}
DelayXus(430); //延时430us
return outbit; //带参数返回,如果接收到应答,返回1,否则返回
}
/**************************************
从DS18B20读1字节数据
**************************************/
unsigned char DS18B20_ReadByte(void)
{
unsigned char i;
unsigned char dat = 0;
for (i=0; i<8; i++) //8位计数器
{
dat >>= 1;
DQ_OUT(0); //开始时间片
DelayXus(2); //延时等待
DQ_OUT(1); //开始时间片
DQ_IN(); //准备接收
DelayXus(12); //接收延时
if (DQ==1) dat |= 0x80; //读取数据
else dat &= 0x7f;
DelayXus(50); //等待时间片结束
}
return dat;
}
/**************************************
向DS18B20写1字节数据
**************************************/
void DS18B20_WriteByte(unsigned char dat)
{
unsigned char i;
unsigned char temp;
for (i=0; i<8; i++) //8位计数器
{
temp=dat&0x01;
if(temp==1)
{
DQ_OUT(0); //开始时间片
DelayXus(2); //延时等待
DQ_OUT(1); //送出数据
DelayXus(60); //等待时间片结束
}
else
{
DQ_OUT(0); //开始时间片
DelayXus(60); //延时等待
DQ_OUT(1); //送出数据
DelayXus(2); //等待时间片结束
}
dat=dat>>1; //右移一位
//DQ_IN(); //恢复数据线
}
}
/***************************************************************************
函数功能:向DS18B20读温度值
入口参数:
出口参数:temperature
***************************************************************************/
unsigned int ReadTemperature(unsigned char *TPH,unsigned char *TPL)
{
unsigned int Temperature=0;
if(DS18B20_Reset()==1) //设备复位
{
DS18B20_WriteByte(0xCC); //跳过ROM命令
DS18B20_WriteByte(0x44); //开始转换命令
DelayXus(50); //等待时间片结束,等待转换完成
if(DS18B20_Reset()==1) //设备复位
{
DS18B20_WriteByte(0xCC); //跳过ROM命令
DS18B20_WriteByte(0xBE); //读暂存存储器命令
(*TPL) = DS18B20_ReadByte(); //读温度低字节
(*TPH) = DS18B20_ReadByte(); //读温度高字节
}
}
Temperature=(unsigned int)(((*TPH)<<8)+(*TPL));
return(Temperature);
}