专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
Ds18b20+1602 测温,温度一直显示-1度,怎么回事?
2019-07-15 20:24
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
10254
8
1449
我用
proteus
仿真
可以用1602显示出正确的温度,可是焊完
电路
,1602一直显示-1度,是怎么回事啊?
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
sdqdlgj
2019-07-16 02:20
硬件没有焊错,程序如下:(我写的是.h文件,然后调用该.h文件)
---------------------------------------------以下为主文件---------------------------------------------------------
#include<pic.h>
#include "Ds18b20.h" //调用温度传感器头文件,头文件的编写在下面
#include "1602.h" //调用1602显示的都文件
__CONFIG(0x3B31);
void main()
{
Lcd1602_Init();
uchar Temper[4];
Disp(0,0,'T');
Disp(1,0,'E');
Disp(2,0,'M');
Disp(3,0,'P');
Disp(4,0,':');
while(1)
{
Temper[0]=Ds18_TemPart(Ds18_GetTem_char())[0];
Temper[1]=Ds18_TemPart(Ds18_GetTem_char())[1];
Temper[2]=Ds18_TemPart(Ds18_GetTem_char())[2];
Temper[3]=Ds18_TemPart(Ds18_GetTem_char())[3];
if(Temper[0]==1)
{
Disp(5,0,'-');
}
else
{
Disp(5,0,'+');
}
Disp(6,0,'0'+Temper[1]);
Disp(7,0,'0'+Temper[2]);
Disp(8,0,'0'+Temper[3]);
}
}
-------------------------------------------以下为Ds18b20的头文件-----------------------------------------------------------
//--------------------------------------------
//Ds18b20 模块函数
//--------------------------------------------
//DQ为Ds数据连接口
//T_DQ为数据接口传输方向
//使用Ds18_GetTem_char()返回一个字节,包含温度
//使用Ds18_TemPart(uchar temp)将Ds18_GetTem_char()的字节返回一个数组[4]
//[0]:温度正负 [1]:温度百位 [2]:温度十位 [3]:温度个位
//---------------------------------------------------
#include<pic.h>
#define DQ RC0
#define T_DQ TRISC0
#define DQ_HIGH() T_DQ=1
#define DQ_LOW() T_DQ=0;DQ=0
#define uint unsigned int
#define uchar unsigned char
void Ds18_delay(uint x);
void Ds18_delay(uint x);
void Ds18_delayus(uint,uchar);
void Ds18_init();
void Ds18_write_byte(uchar date);
uchar Ds18_read_byte();
void Ds18_reset()
{
uchar st=1;
DQ_HIGH();
NOP();NOP();
while(st)
{
DQ_LOW();
Ds18_delayus(70,30);
DQ_HIGH();
Ds18_delayus(4,4);
if(DQ==1)
st=1;
else
st=0;
Ds18_delayus(50,10);
}
}
void Ds18_write_byte(uchar date)
{
uchar i,temp;
DQ_HIGH();
NOP();NOP();
for(i=8;i>0;i--)
{
temp=date&0x01;//01010101
DQ_LOW();
Ds18_delayus(0,0);
if(temp==1)
DQ_HIGH();
Ds18_delayus(2,2);
DQ_HIGH();
date=date>>1;//00101010
}
}
uchar Ds18_read_byte()
{
uchar i,date=0;
static bit j;
for(i=8;i>0;i--)
{
date=date>>1;
DQ_HIGH();
NOP();NOP();
DQ_LOW();
NOP();NOP();NOP();NOP();NOP();NOP();
DQ_HIGH();
NOP();NOP();NOP();NOP();
j=DQ;
if(j==1)
date=date|0x80;//1000 0000
Ds18_delayus(1,1);
}
return (date);
}
void Ds18_delayus(uint x,uchar y)
{
uint i;
uchar j;
for(i=x;i>0;i--);
for(j=y;j>0;j--);
}
void Ds18_delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void Ds18_init()
{
T_DQ=0;
DQ=0;
}
uchar Ds18_GetTem_char()
{
Ds18_init();
uchar tem1=0,tem2=0;
uchar tem[4];
uchar *temper;
Ds18_reset(); //复位
Ds18_write_byte(0xCC);//跳过ROM
Ds18_write_byte(0x44);//温度转换
Ds18_reset();
Ds18_write_byte(0xCC);
Ds18_write_byte(0xBE);
tem1=Ds18_read_byte();
tem2=Ds18_read_byte();
tem1=tem1>>4;
tem2=tem2<<4;
tem1=tem1|tem2;
return tem1;
}
uchar *Ds18_TemPart(uchar temp)
{
uchar tem2;
uchar tem[4];
uchar temper;
tem2=temp&0x7F;
tem[0]=(temp&0x80)>>7;
if(tem[0]==1)
{
tem2=128-tem2;
}
tem[1]=tem2/100;
tem[2]=tem2%100/10;
tem[3]=tem2%10;
temper=tem;
return temper;
}
加载中...
查看其它8个回答
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
---------------------------------------------以下为主文件---------------------------------------------------------
#include<pic.h>
#include "Ds18b20.h" //调用温度传感器头文件,头文件的编写在下面
#include "1602.h" //调用1602显示的都文件
__CONFIG(0x3B31);
void main()
{
Lcd1602_Init();
uchar Temper[4];
Disp(0,0,'T');
Disp(1,0,'E');
Disp(2,0,'M');
Disp(3,0,'P');
Disp(4,0,':');
while(1)
{
Temper[0]=Ds18_TemPart(Ds18_GetTem_char())[0];
Temper[1]=Ds18_TemPart(Ds18_GetTem_char())[1];
Temper[2]=Ds18_TemPart(Ds18_GetTem_char())[2];
Temper[3]=Ds18_TemPart(Ds18_GetTem_char())[3];
if(Temper[0]==1)
{
Disp(5,0,'-');
}
else
{
Disp(5,0,'+');
}
Disp(6,0,'0'+Temper[1]);
Disp(7,0,'0'+Temper[2]);
Disp(8,0,'0'+Temper[3]);
}
}
-------------------------------------------以下为Ds18b20的头文件-----------------------------------------------------------
//--------------------------------------------
//Ds18b20 模块函数
//--------------------------------------------
//DQ为Ds数据连接口
//T_DQ为数据接口传输方向
//使用Ds18_GetTem_char()返回一个字节,包含温度
//使用Ds18_TemPart(uchar temp)将Ds18_GetTem_char()的字节返回一个数组[4]
//[0]:温度正负 [1]:温度百位 [2]:温度十位 [3]:温度个位
//---------------------------------------------------
#include<pic.h>
#define DQ RC0
#define T_DQ TRISC0
#define DQ_HIGH() T_DQ=1
#define DQ_LOW() T_DQ=0;DQ=0
#define uint unsigned int
#define uchar unsigned char
void Ds18_delay(uint x);
void Ds18_delay(uint x);
void Ds18_delayus(uint,uchar);
void Ds18_init();
void Ds18_write_byte(uchar date);
uchar Ds18_read_byte();
void Ds18_reset()
{
uchar st=1;
DQ_HIGH();
NOP();NOP();
while(st)
{
DQ_LOW();
Ds18_delayus(70,30);
DQ_HIGH();
Ds18_delayus(4,4);
if(DQ==1)
st=1;
else
st=0;
Ds18_delayus(50,10);
}
}
void Ds18_write_byte(uchar date)
{
uchar i,temp;
DQ_HIGH();
NOP();NOP();
for(i=8;i>0;i--)
{
temp=date&0x01;//01010101
DQ_LOW();
Ds18_delayus(0,0);
if(temp==1)
DQ_HIGH();
Ds18_delayus(2,2);
DQ_HIGH();
date=date>>1;//00101010
}
}
uchar Ds18_read_byte()
{
uchar i,date=0;
static bit j;
for(i=8;i>0;i--)
{
date=date>>1;
DQ_HIGH();
NOP();NOP();
DQ_LOW();
NOP();NOP();NOP();NOP();NOP();NOP();
DQ_HIGH();
NOP();NOP();NOP();NOP();
j=DQ;
if(j==1)
date=date|0x80;//1000 0000
Ds18_delayus(1,1);
}
return (date);
}
void Ds18_delayus(uint x,uchar y)
{
uint i;
uchar j;
for(i=x;i>0;i--);
for(j=y;j>0;j--);
}
void Ds18_delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void Ds18_init()
{
T_DQ=0;
DQ=0;
}
uchar Ds18_GetTem_char()
{
Ds18_init();
uchar tem1=0,tem2=0;
uchar tem[4];
uchar *temper;
Ds18_reset(); //复位
Ds18_write_byte(0xCC);//跳过ROM
Ds18_write_byte(0x44);//温度转换
Ds18_reset();
Ds18_write_byte(0xCC);
Ds18_write_byte(0xBE);
tem1=Ds18_read_byte();
tem2=Ds18_read_byte();
tem1=tem1>>4;
tem2=tem2<<4;
tem1=tem1|tem2;
return tem1;
}
uchar *Ds18_TemPart(uchar temp)
{
uchar tem2;
uchar tem[4];
uchar temper;
tem2=temp&0x7F;
tem[0]=(temp&0x80)>>7;
if(tem[0]==1)
{
tem2=128-tem2;
}
tem[1]=tem2/100;
tem[2]=tem2%100/10;
tem[3]=tem2%10;
temper=tem;
return temper;
}
一周热门 更多>