本帖最后由 木子不二 于 2016-7-19 10:12 编辑
开始读出数据总是0xFF,或者其她乱码。 改了下现在死在初始化这里 ,下面是驱动代码,16M主时钟
#include"DS18B20.h"
char Neg_flag;
void Delay_us(unsigned int us)
{
while(--us);
}
void DQ_OUT(void)
{
PA_DDR_bit.DDR3 = 1;
PA_CR1_bit.C13 = 1; //推挽
PA_CR2_bit.C23 = 1;
}
void DQ_IN(void)
{
PA_DDR_bit.DDR3 = 0;
PA_CR1_bit.C13 = 1; //上拉
PA_CR2_bit.C23 = 0;
}
/*******************************************************************************
* Function Name : unsigned char Init_DS18B20(void)
* Description : IO 初始化
* Input : void
* Output : None
* Return : None
*******************************************************************************/
unsigned char Init_DS18B20(void)
{
unsigned char tp;
DQ_OUT();
DQ_1;
Delay_us(10);
DQ_0;
Delay_us(1200); //复位脉冲 480us~ 960us
DQ_IN(); 卡死在这里
Delay_us(60); //等待15~60us
// while(DQ_val==0); //等待存在脉冲消失
if(DQ_val==1) //判断初始化是否成功
tp=1; //初始化成功
else
tp=0;
Delay_us(300);
DQ_0;
return tp;
}
/*******************************************************************************
* Function Name : void Write_DS18B20(unsigned char data)
* Description : 向18B20写数据
* Input : void
* Output : None
* Return : None
*******************************************************************************/
void Write_DS18B20(unsigned char data)
{
unsigned char i;
DQ_OUT();
DQ_1;
for(i=0;i<8;i++)
{
DQ_0;
Delay_us(15);
if(data&0x01)
DQ_1;
else
DQ_0;
data>>=1;
Delay_us(100);
DQ_OUT();
DQ_1;
}
}
/*******************************************************************************
* Function Name : unsigned char Read_DS18B20(void);
* Description : 读18B20数据
* Input : void
* Output : None
* Return : 18B20数据
*******************************************************************************/
unsigned char Read_DS18B20(void)
{
unsigned char i,rdata;
DQ_OUT();
for(i=0;i<8;i++)
{
DQ_0;
Delay_us(1); //写时序开始 1us
DQ_IN(); //释放总线
Delay_us(10); //15us 读取数据
if(DQ_val==1)
rdata&=0x80;
Delay_us(60); //读时序最少60us
rdata>>=1;
DQ_OUT();
}
return rdata;
}
/*******************************************************************************
* Function Name : void Convert_18B20(void);
* Description : 18B20转换
* Input : void
* Output : None
* Return : 转换数据
*******************************************************************************/
void Convert_18B20(void)
{
unsigned char k;
do
k = Init_DS18B20();
while(k);
Delay_us(900);
Write_DS18B20(0xcc); //忽略 ROM
Write_DS18B20(0x44); //启动转换
do
k = Init_DS18B20();
while(k);
Delay_us(900); //等待转换完毕
Write_DS18B20(0x33); //读取ROM
Write_DS18B20(0xbe); //读取暂存器
tem[0] = Read_DS18B20();
tem[1] = Read_DS18B20();
Init_DS18B20();
}
/*******************************************************************************
* Function Name : unsigned int Compute_18B20(unsigned char data);
* Description : 计算18B20转换后的温度值
* Input : 16进制的温度值
* Output : None
* Return : 十进制的温度值
*******************************************************************************/
unsigned int Compute_18B20(void)
{
unsigned int temp,a,b;
float temperature;
a = tem[0];b= tem[1];
a>>=4;
b<<=4;
temp = a|b;
// temp = b;
// temp <<= 8; //two byte compose a int variable
// temp = temp | a;
temperature = temp * 0.0625;
temperature = temperature * 10 + 0.5;
return temp;
}用例程是可以的,
file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\247983663\QQ\WinTemp\RichOle\P@`GFZJ}NDY6U6AUKS2%}T8.png
|