专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
TI
测温程序读不出数据
2019-07-23 16:11
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
TI MCU
5252
18
1442
430 149的DS18B20测温程序读不出数据
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
18条回答
jlyuan
2019-07-24 04:52
#include <msp430x14x.h>
#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[0] = Read_DS18B20(); //
tem[1] = 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[0]&0xF0)
{
Neg_flag = 1; //负数标志
temper = tem[1]+tem[0]*256;
temper = (~temper) +1; //取反加一
}
else
{
temper = tem[1]+tem[0]*256;
}
return temper;
}
加载中...
查看其它18个回答
一周热门
更多
>
相关问题
CPLD的方波输出
4 个回答
11个版本Quartus II 软件下载,安装包网盘合集,附教程,47G!
20 个回答
请大家帮忙到21IC发展大家谈支持我申请新版面
20 个回答
【通知】21ic中国电子网服务条款 (所有人员必读)
1 个回答
满载而归乙亥年,大展鸿途庚子年---集签赢好礼
20 个回答
相关文章
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
TI
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#include <msp430x14x.h>
#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[0] = Read_DS18B20(); //
tem[1] = 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[0]&0xF0)
{
Neg_flag = 1; //负数标志
temper = tem[1]+tem[0]*256;
temper = (~temper) +1; //取反加一
}
else
{
temper = tem[1]+tem[0]*256;
}
return temper;
}
一周热门 更多>