智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 4419|回复: 9
打印 上一主题 下一主题

初学飞思卡尔,用飞思卡尔和DS18B20实现测温,求高手帮助

[复制链接]

9

主题

112

帖子

0

精华

高级会员

Rank: 4

积分
992
QQ
威望
538
贡献
230
兑换币
4
注册时间
2011-7-13
在线时间
112 小时
跳转到指定楼层
1#
发表于 2011-8-8 18:18:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
初学飞思卡尔,用飞思卡尔和DS18B20实现测温,写的程序实现不了,求高手帮助   ,谢谢啊        

#include <hidef.h>      /* common defines and macros */
#include <MC9S12XS128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
#define DS PORTA_PA7
uchar buffer[4]={0x00,0x01,0x02,0x03};
uchar codetable1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar codetable2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
uchar codetable3[]={0xf7,0xfb,0xfd,0xfe};
uchar data=0;
void Delay_DS18B20(int num)
{
   while(num--) ;
}

void delayms(int ms)
{
   int ii,jj;
   if (ms<1) ms=1;
   for(ii=0;ii<ms;ii++)
     for(jj=0;jj<920;jj++);    //busclk:8MHz--1ms
}
void DS_Init(void)
{
    unsigned char i;
    DS=1;
    Delay_DS18B20(2);
    DS=0;
    Delay_DS18B20(20);
    DS=1;
    Delay_DS18B20(10);
    i=DS;
    Delay_DS18B20(10);
}
uchar Readonedata(void)   //读一个字节数据
{
    uint i;
    unsigned char data;
    for(i=0;i<8;i++)
    {
      DS=0;
      data>>=1;
      Delay_DS18B20(2);
      DS=1;
      if(DS)
      data|=0x80;
      Delay_DS18B20(2);
    }
    return(data);
}
void Writeonedata(uchar data)   //写一个字节数据
{
   unsigned char i=0;
   for (i=0; i<8; i++)
   {
       DS = 0;
       DS = data&0x01;
       Delay_DS18B20(10);
       DS = 1;
       data>>=1;
   }
}
void datachange(void)    // 温度转换
{
    DS_Init();
    delayms(3);
    Writeonedata(0xcc);
    Writeonedata(0x44);
    Writeonedata(0xbe); //读取温度寄存器
}                                                   
uchar get_data()
{
   uchar a,b;
   uchar f_data;
   datachange();
   a=Readonedata();
   b=Readonedata();
   data=b;
   data<<=8;
   data=data|a;
   f_data=data*0.0625;
   data=f_data*100;
   return(data);
}
/*void SCI_Init(void)
{
   SCI0CR1=0x00;
   SCI0CR2=0x0c;
   SCI0BDH=0x00;
   SCI0BDL=0x34;
}
void SciTx(uchar text)
{
   unsigned char temp;
   temp=SCI0SR1;
   SCI0DRH=0;
   SCI0DRL=text;
   while(!(SCI0SR1&0x80));
}
char SciRx(void)
                        
{
  char result,temp;
  temp=SCI0SR1;
  while(!(SCI0SR1&0x20));
  result=SCI0DRL;
  return result;
} */
void scan(uchar data)
{
   delayms(3);
   PORTA=0xf7;
   PORTB=codetable1[data/1000];
     
   delayms(3);
   PORTA=0xfb;
   PORTB=codetable1[data%1000/100];
     
   delayms(3);
   PORTA=0xfd;
   PORTB=codetable1[data%100/10];
                                                     
   delayms(3);
   PORTA=0xfe;
   PORTB=codetable1[data%10];
}
void main(void)
{   
    //SCI_Init();
    DDRA=0xff;
    DDRB=0xff;
    PORTA=0xff;
    PORTB=0xff;
   
    DS_Init();
    for(;;)
    {
      datachange();
      scan(data);
      delayms(20);
      
    }
}

9

主题

112

帖子

0

精华

高级会员

Rank: 4

积分
992
QQ
威望
538
贡献
230
兑换币
4
注册时间
2011-7-13
在线时间
112 小时
2#
 楼主| 发表于 2011-8-13 10:48:16 | 只看该作者
来个高手帮帮忙啊!
回复 支持 反对

使用道具 举报

10

主题

455

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6364
QQ
威望
3231
贡献
1725
兑换币
495
注册时间
2011-3-12
在线时间
704 小时
3#
发表于 2011-8-13 22:43:25 | 只看该作者
不懂 等高手
回复 支持 反对

使用道具 举报

9

主题

112

帖子

0

精华

高级会员

Rank: 4

积分
992
QQ
威望
538
贡献
230
兑换币
4
注册时间
2011-7-13
在线时间
112 小时
4#
 楼主| 发表于 2011-8-14 11:38:46 | 只看该作者
主要是初始化不成功,时间改了又改,DS18b20就是初始化不了
回复 支持 反对

使用道具 举报

15

主题

119

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2957
QQ
威望
469
贡献
2294
兑换币
2
注册时间
2010-11-14
在线时间
97 小时
5#
发表于 2011-8-14 15:24:40 | 只看该作者
额。。前两天用51调试的 也用的你这个方法处理的数据 但是总是不行  显示的数据不对 后来换了个才行
你的这个貌似精确不到小数点后一位啊,在整形的时候 你的小数点后面的数貌似已经被消除了吧。。。感觉 显示不出来多数都是时序不对  还是再看看吧  像连续写的时候  一定要有1us的时间间隔啊 什么的  我也不知道了 再检查下读写什么的吧
回复 支持 反对

使用道具 举报

9

主题

112

帖子

0

精华

高级会员

Rank: 4

积分
992
QQ
威望
538
贡献
230
兑换币
4
注册时间
2011-7-13
在线时间
112 小时
6#
 楼主| 发表于 2011-8-16 19:57:21 | 只看该作者
回复 5# 道明似也


    恩,谢谢了,我再试试吧
回复 支持 反对

使用道具 举报

2

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
274
威望
188
贡献
66
兑换币
0
注册时间
2011-10-29
在线时间
10 小时
7#
发表于 2011-12-14 19:45:12 | 只看该作者
这个你要看那个ds18b20初始化与数据写入的时序图,用示波器把波形挂出来。18B20对时序非常敏感
下面是我调试成功的程序
/*********延时函数*********/
void delay_10us(int z)
{
   int i,j;
   for(j=5;j>0;j--)
    for(i=z;i>0;i--)      ;
}  

void delay_30us(int z)
{
   int i,j;
   for(j=40;j>0;j--)
    for(i=z;i>0;i--)      ;
}

/******************DS18B20初始化******************/
void DS_init(void)
{
   DDRT=0XFF;
   DQ=0;
   delay(2);         //延时时间在480到960us秒之间   
   DQ=1;
   delay_10us(20);         //延时时间在15到60us秒之间    此处延时为45us
   DDRT=0X00;
   delay_30us(5);           //监测DS18B20是否将DQ线拉低

   while(!DQ);         
}
/******************DS18B20写字节******************/
void DS_write_byte(unsigned char dat)
{
        unsigned char i;
        unsigned char j=4;
        DDRT=0XFF;
        for(i=0;i<8;i++)
                {
                        DQ=0;                           //开始传送数据
         delay_10us(8);          
                        DQ=(dat&0x01);
                        delay_10us(85);                   //在再延时45us   判断DQ是为低电平 还是高电平
                          DQ=1;
         while(j)
         {
            j--;   
         }
              dat=dat>>1;
                }       
}
unsigned char  DS_read_byte()
{
        unsigned char i;
        unsigned char k;
        for(i=0;i<8;i++)
                {

         DDRT=0XFF;
                        DQ=0;
         delay_10us(8);          
                        DQ=1;                        //总线再次将DQ线拉高    为了监测DS18B20的输出状态
                   k>>=1;
                   DDRT=0X00;               
                  if(DQ)
                  {
                      k=k|0X80;
                  }
                   delay_10us(80);               
                   delay_10us(1);                       
                }
                return k;               
}

希望对你有帮助
回复 支持 反对

使用道具 举报

2

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
274
威望
188
贡献
66
兑换币
0
注册时间
2011-10-29
在线时间
10 小时
8#
发表于 2011-12-14 19:46:59 | 只看该作者
我用的时钟频率是32M 的,
还要提醒你一下,就是延时函数是不能按比例来算的,不成严格的倍数关系
回复 支持 反对

使用道具 举报

5

主题

76

帖子

0

精华

高级会员

Rank: 4

积分
816
QQ
威望
406
贡献
252
兑换币
236
注册时间
2013-1-22
在线时间
79 小时
9#
发表于 2013-3-8 19:03:42 | 只看该作者
aiaizhaojun 发表于 2011-12-14 19:45
这个你要看那个ds18b20初始化与数据写入的时序图,用示波器把波形挂出来。18B20对时序非常敏感
下面是我调试 ...

可是我按照你的去做,屏幕上显示的还是255· 这是为什么呢?
回复 支持 反对

使用道具 举报

5

主题

76

帖子

0

精华

高级会员

Rank: 4

积分
816
QQ
威望
406
贡献
252
兑换币
236
注册时间
2013-1-22
在线时间
79 小时
10#
发表于 2013-3-8 19:08:43 | 只看该作者
高手 出现255的原因是不是DS18b20根本没有完成初始化,以及读写数据的,求教育
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-6 12:41 , Processed in 0.104398 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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