测温程序读不出数据
每次读出来的数据总是0xFF#include "DS18B20.h"
extern void Delay(unsigned int dly);
#define DQ_IN(P1DIR&=~BIT6)
#define DQ_OUT (P1DIR|= BIT6)
#define DQ_val (P1IN & BIT6)
#define DQ_1 (P1OUT|=BIT6)
#define DQ_0 (P1OUT&=~BIT6)
unsigned char tem[]={0,0},Neg_flag;//数组存储读取的温度数据,负数标志
/*******************************************************************************
* Function Name: void Delayus(unsigned int dly)
* Description : 延时 dly us
* Input : dly
* Output : None
* Return : None
*******************************************************************************/
void Delayus(unsigned int dly)
{
TACTL|= TASSEL_2+MC_1+TACLR;
CCR0= dly;
while(!(TACTL&BIT0)); //等待时间到
TACTL= 0; //停止计数 ??????
TACTL &= ~BIT0; //清中断标志
}
/*******************************************************************************
* 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_0; //MCU 拉低最少480us 再释放等待DS拉高
Delayus(600); //480us~960us
DQ_1;
DQ_IN; //释放总线
Delayus(55); //等15~60us
_NOP();
if(DQ_val==BIT6) tp=1; //初始失败
else tp=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;
for(i=0;i<8;i++)
{
DQ_0; //下降沿
Delayus(3); //15~60us 等待18B20采样
if(data&0x01) //写从低到高位
{
DQ_1;
}
else
{
DQ_0;
}
Delayus(65);
data>>=1;
DQ_1;
Delayus(2);
}
}
/*******************************************************************************
* Function Name: unsigned char Read_DS18B20(void);
* Description : 读18B20数据
* Input : void
* Output : None
* Return : 18B20数据
*******************************************************************************/
unsigned char Read_DS18B20(void)
{
unsigned int i, rdata;
for(i=0;i<8;i++)
{
rdata>>=1;
DQ_0;
Delayus(2); //下降沿
DQ_1;
DQ_IN; //释放总线
Delayus(3); //延时5 us
if(DQ_val==BIT6)
{
rdata |= 0x80; //读从高位开始
}
Delayus(45);
DQ_OUT;
DQ_1;
Delayus(2);
}
return rdata;
}
/*******************************************************************************
* Function Name: unsigned char Convert_18B20(void);
* Description : 18B20转换
* Input : void
* Output : None
* Return : None
*******************************************************************************/
unsigned char *Convert_18B20(void)
{
unsigned char n;
do
n = Init_DS18B20(); //复位
while(n);
Write_DS18B20(0xCC); //跳过 ROm指令
Write_DS18B20(0x44); //温度转换 RAM指令
Delay(750); //等待750us温度转换完成
do
n = Init_DS18B20(); //复位
while(n);
Write_DS18B20(0xCC); //跳过ROM
Write_DS18B20(0xBE);; //读存储器指令 读数据
tem = Read_DS18B20(); //
tem = Read_DS18B20();
return tem;
}
/*******************************************************************************
* Function Name: unsigned char Compute_18B20(unsigned char data);
* Description : 计算18B20转换后的温度值
* Input : 16进制的温度值
* Output : None
* Return : 十进制的温度值
*******************************************************************************/
float Compute_18B20()
{
unsigned char temper=0;
if(tem&0xF0)
{
Neg_flag = 1; //负数标志
temper = tem+tem*256;
temper = (~temper) +1; //取反加一
}
else
{
temper = tem+tem*256;
}
return temper;
} 根据你的时钟来调整延时的。
定时器没设置好,子系统时钟源没有8分频啊
DS18B20是单线通信,时序比较重要,所以系统时钟一定配置好了
单片机的工作频率也不一样 还有时序
延时需要调节下,保证延时要比较准。
你也可以参考下火哥和原子的。
相应寄存器的值是多少,看看有变化没有
我这用的是C8051F020,18b20实验死活就是调不通
18b20做的人多了,例程网上一堆,楼主下一个修改修改
同意,STM32下的也是不少的,要注意引脚方向的切换和延时的准确性。
说明时序有问题它并没有响应你
时许有问题 用示波器看看波形吧
说明没有理睬你
微调一下延时时间
18b20对时序的要求挺高的
有可能18b20损坏了
我第一次写程序就是写的这个程序 调试了好久 最后还是发现是时许有问题
好的,我明天去单位试一下,多谢各位大侠了哈
页:
[1]