智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 5885|回复: 13
打印 上一主题 下一主题

[编程类] MC9S12XS128芯片,用DS18B20温度传感器显示不出正确的温度

[复制链接]

2

主题

33

帖子

0

精华

高级会员

Rank: 4

积分
782
威望
427
贡献
261
兑换币
228
注册时间
2012-10-29
在线时间
47 小时
毕业学校
浙江万里学院
跳转到指定楼层
1#
发表于 2013-3-9 19:59:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人初学飞思卡尔MC9S12XS128芯片,用DS18B20温度传感器用液晶显示温度的程序为啥显示不出正确的温度啊?求大神指教!!!
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#define uchar unsigned char
#define uint unsigned int
#define  LCD_RS PORTK_PK0
#define  LCD_RW  PORTK_PK1
#define  LCD_EN  PORTK_PK2
#define  LCD_PSB PORTK_PK3
#define  ds   PORTA_PA2
uchar a[6]={"室温:"};
uchar b[]="0123456789";
uint temp;
float f_temp;
void delayus(uint xus)    //延时
{
unsigned int i;
for(i=xus;i>0;i--);
}
void delay(uint xms)     //延时
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
                        
void write_cmd(uchar z)      //写地址
{
  LCD_RS=0;
  LCD_RW=0;
  delay(5);
  PORTB=z;
  LCD_EN=1;
  delay(5);
  LCD_EN=0;
}
void write_dat(uchar s)         //写数据
{
  LCD_RS=1;
  LCD_RW=0;
  delay(5);
  PORTB=s;
  LCD_EN=1;
  delay(5);
  LCD_EN=0;
}
                                    //液晶初始化
void chushi(void)
{  
   LCD_PSB=1;
   write_cmd(0x30);
   delay(5);
   write_cmd(0x0c);
   delay(5);
   write_cmd(0x01);
   delay(5);
  
}

uint dsreset(void)      // ds18b20复位,初始化函数
{
uint i;
DDRA_DDRA2=1;
ds=1;
delayus(1);
ds=0;
delayus(650);
ds=1;
delayus(30);
  DDRA_DDRA2=0;  //定义A2为输入
   delayus(30);
  i=ds;
  DDRA_DDRA2=1;
  delayus(600);
   ds=1;
   return i;
}


uchar tempread(void)//读一个字节数据函数
{
uint i;
  uchar dat;
  for(i=0;i<8;i++)
  {  ds=1;
     delayus(1);
     ds=0;
      delayus(2);
     ds=1;
     dat>>=1;
     DDRA_DDRA2=0;
      
      if(ds)
     dat|=0x80;   
     delayus(30);
     DDRA_DDRA2=1;
     ds= 1;  
      delayus(8);
  
   }
   
   return(dat);
}
void tempwritebyte(uchar dat)   //向传感器写一个字节函数
{                                       
uchar j;
    ds=1;
for(j=1;j<=8;j++)
  { ds=0;
   
   
  ds=dat&0x01;
   delayus(45);
ds=1;
  dat=dat>>1;  
  
  }
  
  ds=1;
}
void tempchange(void)  //开始获取温度并转换
{
dsreset();
//delay(1);
tempwritebyte(0xcc);//写跳过读ROM指令
tempwritebyte(0x44);//写温度转换指令

}

uint get_temp()     //读取温度
{
uint a,b;
dsreset();
//delay(1);
tempwritebyte(0xcc);         
tempwritebyte(0xbe);
a=tempread();     //读低8位
b=tempread();     //读高8位
temp=b;
temp<<=8;    //两个字节组合为1个字
temp=temp|a;
f_temp=temp*0.0625;  //温度在寄存器中为12位,分辨率为0.0625
temp=f_temp*10+0.5;  //乘以10表示小数点后面只取1位,加0.5是四舍五入
//f_temp=f_temp+0.05;
return temp;     //temp是整型

}

void dis_temp(uint t)    //数据显示程序
{
  uint bai,shi,ge;
write_cmd(0x90);
   delay(50);
   bai=t/100%10;
    write_dat(b[bai]);
  shi=t%100/10;
    write_dat(b[shi]);
  ge=t%10;
   write_dat(b[ge]);


}

void main(void) {
  uchar i;
  DDRB=0xff;
  DDRK=0xff;
  chushi();            
  
for(;;)
  
{
     tempchange();
     dis_temp(get_temp());
     write_cmd(0x80);
     for(i=0;i<5;i++)
     {
      write_dat(a[i]);
     delay(10);
     }

  }
}

8

主题

206

帖子

0

精华

高级会员

Rank: 4

积分
808

活跃会员奖章优秀会员奖章

QQ
威望
418
贡献
300
兑换币
174
注册时间
2011-12-23
在线时间
45 小时
2#
发表于 2013-3-9 20:05:23 | 只看该作者
你的延时可能不太精确,DS18B20对时间要求很高!
回复 支持 反对

使用道具 举报

8

主题

206

帖子

0

精华

高级会员

Rank: 4

积分
808

活跃会员奖章优秀会员奖章

QQ
威望
418
贡献
300
兑换币
174
注册时间
2011-12-23
在线时间
45 小时
3#
发表于 2013-3-9 20:06:51 | 只看该作者
uchar b[]="0123456789";写成“uchar b[]={'0','1'23456789};”试试
回复 支持 反对

使用道具 举报

2

主题

33

帖子

0

精华

高级会员

Rank: 4

积分
782
威望
427
贡献
261
兑换币
228
注册时间
2012-10-29
在线时间
47 小时
毕业学校
浙江万里学院
4#
 楼主| 发表于 2013-3-9 20:37:25 | 只看该作者
王谦623 发表于 2013-3-9 20:06
uchar b[]="0123456789";写成“uchar b[]={'0','1'23456789};”试试

这个好像不行!我的延时改过几次了,但是没什么变化!显示的数字都是“959”
回复 支持 反对

使用道具 举报

42

主题

1054

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3034

优秀会员奖章活跃会员奖章

QQ
威望
1650
贡献
780
兑换币
625
注册时间
2012-7-6
在线时间
302 小时
5#
发表于 2013-3-10 08:51:01 | 只看该作者
你把温度传感器捏住看显示有没有变化  以前用51试过测温度
回复 支持 反对

使用道具 举报

8

主题

206

帖子

0

精华

高级会员

Rank: 4

积分
808

活跃会员奖章优秀会员奖章

QQ
威望
418
贡献
300
兑换币
174
注册时间
2011-12-23
在线时间
45 小时
6#
发表于 2013-3-10 08:55:02 | 只看该作者
扑克脸的笑容 发表于 2013-3-9 20:37
这个好像不行!我的延时改过几次了,但是没什么变化!显示的数字都是“959”

哦,我的可以,我拿AVR写的。
回复 支持 反对

使用道具 举报

2

主题

33

帖子

0

精华

高级会员

Rank: 4

积分
782
威望
427
贡献
261
兑换币
228
注册时间
2012-10-29
在线时间
47 小时
毕业学校
浙江万里学院
7#
 楼主| 发表于 2013-3-10 09:02:14 | 只看该作者
穆旦阿斗 发表于 2013-3-10 08:51
你把温度传感器捏住看显示有没有变化  以前用51试过测温度

之前试过,数据没有变化,显示的值是固定,不正确
回复 支持 反对

使用道具 举报

2

主题

33

帖子

0

精华

高级会员

Rank: 4

积分
782
威望
427
贡献
261
兑换币
228
注册时间
2012-10-29
在线时间
47 小时
毕业学校
浙江万里学院
8#
 楼主| 发表于 2013-3-10 09:02:52 | 只看该作者
王谦623 发表于 2013-3-10 08:55
哦,我的可以,我拿AVR写的。

好吧。。。谢谢
回复 支持 反对

使用道具 举报

200

主题

2621

帖子

1

精华

杰出人士

蜗牛

Rank: 12Rank: 12Rank: 12

积分
12488

优秀会员奖章活跃会员奖章论坛骨干奖章论坛元老奖章在线王奖章资源大师奖章

QQ
威望
5973
贡献
3101
兑换币
1999
注册时间
2011-10-21
在线时间
1707 小时
9#
发表于 2013-3-10 09:10:54 | 只看该作者
扑克脸的笑容 发表于 2013-3-10 09:02
之前试过,数据没有变化,显示的值是固定,不正确

烧了,肯定插反过,我的烧了的时候数值就固定不变。如果你觉得是程序问题你试试这个

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

42

主题

1054

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3034

优秀会员奖章活跃会员奖章

QQ
威望
1650
贡献
780
兑换币
625
注册时间
2012-7-6
在线时间
302 小时
10#
发表于 2013-3-10 10:43:51 | 只看该作者
扑克脸的笑容 发表于 2013-3-10 09:02
之前试过,数据没有变化,显示的值是固定,不正确

有可能是这样的 我们那个它一开始就是850,不管怎么调刚开启的时候就会显示850,但马上又会显示正常值了,可能刚开启的时候会有的固定的值,你看看是不是没有进入温度测量的程序?可能是温度传感器的时序的问题,不知道是不是有人说的你接反了烧了。    这样吧你直接给读取温度的那个变量赋值,看看能显示不?能的话就是时序不对,不能的话就是根本没有执行到温度测量和数据更新。但多半是时序不对,导致数据不会正确显示课更新
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-26 12:34 , Processed in 0.090026 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表