智能车制作

标题: MC9S12XS128芯片,用DS18B20温度传感器显示不出正确的温度 [打印本页]

作者: 扑克脸的笑容    时间: 2013-3-9 19:59
标题: MC9S12XS128芯片,用DS18B20温度传感器显示不出正确的温度
本人初学飞思卡尔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);
     }

  }
}


作者: 王谦623    时间: 2013-3-9 20:05
你的延时可能不太精确,DS18B20对时间要求很高!
作者: 王谦623    时间: 2013-3-9 20:06
uchar b[]="0123456789";写成“uchar b[]={'0','1'23456789};”试试

作者: 扑克脸的笑容    时间: 2013-3-9 20:37
王谦623 发表于 2013-3-9 20:06
uchar b[]="0123456789";写成“uchar b[]={'0','1'23456789};”试试

这个好像不行!我的延时改过几次了,但是没什么变化!显示的数字都是“959”
作者: 穆旦阿斗    时间: 2013-3-10 08:51
你把温度传感器捏住看显示有没有变化  以前用51试过测温度
作者: 王谦623    时间: 2013-3-10 08:55
扑克脸的笑容 发表于 2013-3-9 20:37
这个好像不行!我的延时改过几次了,但是没什么变化!显示的数字都是“959”

哦,我的可以,我拿AVR写的。

作者: 扑克脸的笑容    时间: 2013-3-10 09:02
穆旦阿斗 发表于 2013-3-10 08:51
你把温度传感器捏住看显示有没有变化  以前用51试过测温度

之前试过,数据没有变化,显示的值是固定,不正确

作者: 扑克脸的笑容    时间: 2013-3-10 09:02
王谦623 发表于 2013-3-10 08:55
哦,我的可以,我拿AVR写的。

好吧。。。谢谢
作者: qinlu123    时间: 2013-3-10 09:10
扑克脸的笑容 发表于 2013-3-10 09:02
之前试过,数据没有变化,显示的值是固定,不正确

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

作者: 穆旦阿斗    时间: 2013-3-10 10:43
扑克脸的笑容 发表于 2013-3-10 09:02
之前试过,数据没有变化,显示的值是固定,不正确

有可能是这样的 我们那个它一开始就是850,不管怎么调刚开启的时候就会显示850,但马上又会显示正常值了,可能刚开启的时候会有的固定的值,你看看是不是没有进入温度测量的程序?可能是温度传感器的时序的问题,不知道是不是有人说的你接反了烧了。    这样吧你直接给读取温度的那个变量赋值,看看能显示不?能的话就是时序不对,不能的话就是根本没有执行到温度测量和数据更新。但多半是时序不对,导致数据不会正确显示课更新
作者: 517045126    时间: 2013-4-20 10:05
我也在用ds18b20测温 但程序我都不会编  请求大神帮忙啊   
急啊  谢谢了  
作者: 扑克脸的笑容    时间: 2013-4-22 20:15
517045126 发表于 2013-4-20 10:05
我也在用ds18b20测温 但程序我都不会编  请求大神帮忙啊   
急啊  谢谢了

51?还是飞思卡尔?
作者: 517045126    时间: 2013-4-25 10:00
扑克脸的笑容 发表于 2013-4-22 20:15
51?还是飞思卡尔?

是飞思卡尔的。
作者: 飞卡搬砖小工    时间: 2013-4-30 17:54
延时不对吧,同意时序有问题




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2