新手求解stm8 ds18b02程序的问题

liangyan860705 2015-06-26 10:43:22
我最近写了一个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);
}
...全文
158 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
liangyan860705 2015-06-26
  • 打赏
  • 举报
回复
说明以下 PA_DDR = 0b00001010; PA_CR1 = 0b00000000; // 将PA1,PA3设置开漏输出 将PA2设置上拉输入 PA_CR2 = 0b00000000; 应该是: // 将PA1,PA3设置开漏输出 将PA2设置悬浮输入 板上DQ端焊有个10K的上拉电阻的

27,383

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧