查看: 3472|回复: 4

[其他] DS180B20采集程序,大侠帮忙看看~

[复制链接]

该用户从未签到

9

主题

38

帖子

0

新手上路

Rank: 1

积分
96
最后登录
1970-1-1
发表于 2010-8-12 21:54:19 | 显示全部楼层 |阅读模式
程序一直调不出来,调的过程中结果不是全是F,就是全是0,哪位好心帮我看看吧~先谢过了!
 
#include       /* common defines and macros */
#include       /* derivative information */
#pragma LINK_INFO  DERIVATIVE "mc9s12xf512"
#include "Fr_UNIFIED_types.h"
uint16 TempeValue,TempeValdone;
boolean  TempeReady = 0;
uint32  timech;

#define DQ 1
#define DQ_H PTP_PTP0 = 0 //设置P0.0口为输出
#define DQ_L  PTP_PTP0 = 1 //设置P0.0口为输入
uint8 flag=0;
uint8 Temp=0;
uint8  tempH;
uint8 tempL;
uint8 f;
uint8 tmp;
uint8 tmp_t,COUNTER =  0;
 
void Delay(uint32 time) //3.75us
{
  for(;time>0;time--);
     
}

//初始化作为输入口
void GPIO_Iint()
{
DDRP_DDRP0 = 0;   
}
//初始化作为输出口
void GPIO_Oint()
{
 DDRP_DDRP0 = 1;       
}
// 函数功能:一线总线复位及从设备应答控制程序
void TxReset(void)
{  
   
     do{
    int err = 5;
    flag = 0; 
    GPIO_Oint();
     DQ_H;
    Delay(2);              //延时5us
    DQ_L;              //置低,初始化开始  
    Delay(480);            //延时722us    
  
    GPIO_Iint();
     Delay(45);             //延时60us以上
            
                        /*等待18B20发出存在脉冲--低电平*/             
    while((PTP_PTP0 == 1)||(err == 0))  {
      err--;  
      Delay(12);
    }
    
    if(err == 0)  flag = 0;
    else flag = 1;
      Delay(39); //60us
       GPIO_Oint();
      DQ_H;
      Delay(79); //120us,总480us
       Delay(79);
      Delay(79);
      Delay(79);
     
    } while(flag  == 0) ;
   
}

void WrByte(uint8 b)
{
    uint8 i;
     for(i=0;i>1;
     }
}
//读数据的一位,满足读时隙要求读取
uint8 RdBit(void)
{
    uint8  read_bit;
   
    GPIO_Oint();        /*先置高再置低,告诉18B20 读开始*/
     
    DQ_L;          
    Delay(2);              //延时5us
   
     GPIO_Iint();
    Delay(5);     //10us
    if(PTP_PTP0)
       read_bit=0x80;
    else
      read_bit=0;
   
     GPIO_Oint();           //输出
    DQ_H;                  //置高,释放总线
     Delay(40);
   
    return read_bit;
}
//读取数据的一个字节
uint8  RdByte(void)
{
    uint8 i,Data=0;
    for(i=0;i>1;
       Data=Data|RdBit();
    }
     return Data;
}
//启动一次DS18B20测温,并读取测温结果//得到完整的温度值(整数和小数)
uint8  get_temp_t(void)
{  
     uint8 i,j;
     TxReset();
      COUNTER++;
     if(flag)       //如果一线总线复位及从设备应答控制 成功 则向下执行
     {
        WrByte(0xCC);    //跳过ROM
        COUNTER++;
         WrByte(0x44);    //开始一次温度变换
        COUNTER++;
        Delay(480);        //700us
        COUNTER++;
        TxReset(); //一线总线复位及从设备应答控制
         COUNTER++;
        WrByte(0xCC);     //跳过ROM
         COUNTER++;
        WrByte(0xBE);    //读暂存存储器
         COUNTER++;
        tempL=RdByte();
        COUNTER++;
         tempH=RdByte();
        COUNTER++;
    }     
       
        
                  COUNTER = 0;
            return(f);
}
void temperaturehandler(void) { 
   
    TempeReady = 1;
     get_temp_t();
  TempeValue = (uint16)tempH;
  TempeValue = TempeValue   VCOFRQ = 00b        */         
    SYNR_VCOFRQ1 = 0;
    SYNR_VCOFRQ0 = 0;
       
    /* Fref =  OSCCLK/(REFDV+1) = 4MHz/1 = 4MHz -> REFRQ= 01b     */   
     REFDV_REFFRQ1 = 0;
    REFDV_REFFRQ0 = 1;
   
    PLLCTL_PLLON = 1;    /* PLL enabled */
   
        while(!CRGFLG_LOCK)
            ;        /* Wait until the PLL is within the desired frequency */
                 
    CLKSEL_PLLSEL = 1;    /* Select clock source from PLL  */
             
              GPIO_Oint();
   for(;;) { 
            
      temperaturehandler();    
             
  } /* wait forever */
  /* please make sure that you  never leave this function */
}
 
 
我知道答案 目前已有3人回答
回复

使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2010-8-13 10:10:40 | 显示全部楼层

    RE:DS180B20采集程序,大侠帮忙看看~

    可能是通信问题,读取不到实际的值。
    该会员没有填写今日想说内容.

    该用户从未签到

    9

    主题

    38

    帖子

    0

    新手上路

    Rank: 1

    积分
    96
    最后登录
    1970-1-1
     楼主| 发表于 2010-8-25 09:36:50 | 显示全部楼层

    回复:DS180B20采集程序,大侠帮忙看看~

    #include       /* common defines and macros */
    #include      /* derivative information */
    #pragma LINK_INFO DERIVATIVE "mc9s12xf512"
    #include "Fr_UNIFIED_types.h"

    uint16 TempeValue,TempeValdone;
    boolean  TempeReady = 0;
    uint32 timech;

    #define Skip_ROM 0xCC
    #define Write    0x4E
    #define DQ 1
    #define DQ_H PTP_PTP0 = 0 //设置P0.0口为输出
    #define DQ_L PTP_PTP0 = 1 //设置P0.0口为输入
    uint8 flag=0;
    uint8 Temp=0;
    uint8 tempH;
    uint8 tempL;
    uint8 f;
    uint8 tmp = 0;
    uint8 tmp_t,COUNTER = 0;


    void Delay(unsigned int time)
    {
    PITCFLMT = 0x00; //关闭计时器
    PITCE = 0x01;   //使能通道1
    PITMUX = 0x00;  //使用宏时钟0
    PITMTLD0 = 19;   //宏时钟为1us
    PITLD0 = time-1;  //timeus
    PITTF = 0x01;   // 清时钟标志位
    PITCFLMT = 0x80; //使能计时器
    while(!(PITTF&0x01));
    PITTF = 0x01;
    PITCFLMT = 0x00;
    }
    void DelayMS(unsigned int time) //100ms
    {  
    PITCFLMT = 0x00; //关闭计时器
    PITCE = 0x01;   //使能通道1
    PITMUX = 0x00;  //使用宏时钟0
    PITMTLD0 = 199;   //宏时钟为10us
    PITLD0 = time*10000-1;  //timeus
    PITTF = 0x01;   // 清时钟标志位
    PITCFLMT = 0x80; //使能计时器
    while(!(PITTF&0x01));
    PITTF = 0x01;
    PITCFLMT = 0x00;
    }


    //初始化作为输入口
    void GPIO_Iint()
    {
     
    DDRP_DDRP0 = 0;     //端口pp0设为输入,并拉高
    PERP_PERP0 = 1;
    PPSP_PPSP0 = 0;
    }

    //初始化作为输出口
    void GPIO_Oint()
    {
        
     DDRP_DDRP0 = 1;        
    }



    // 函数功能:一线总线复位及从设备应答控制程序
    void TxReset(void)
    {   

    do{
    int err = 10;
    flag = 0;  
    GPIO_Oint();
    DQ_H;
    Delay(10);              
    DQ_L;          //置低,初始化开始
        Delay(500);             //延时500us     

    GPIO_Iint();
    //Delay(60);         
    /*等待18B20发出存在脉冲--低电平*/              
    while((PTIP_PTIP0 == 1)&&(err != 0)) {
    err--;   
    Delay(20);
    }
    COUNTER++;
    if(err == 0) flag = 0;
    else flag = 1;

    //GPIO_Oint();
    //DQ_H;
    Delay(480);

    } while(flag == 0) ;

    }


    现在改用定时器做了一下,还是不能初始化,收不到低电平脉冲
     

    该用户从未签到

    9

    主题

    38

    帖子

    0

    新手上路

    Rank: 1

    积分
    96
    最后登录
    1970-1-1
     楼主| 发表于 2010-8-25 16:51:52 | 显示全部楼层

    回复:DS180B20采集程序,大侠帮忙看看~

    #define DQ_H PTP_PTP0 = 0 //设置P0.0口为输出
    #define DQ_L PTP_PTP0 = 1原来是这里写反了 
  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2010-8-25 20:28:44 | 显示全部楼层

    RE:DS180B20采集程序,大侠帮忙看看~

    不好意思,这几天有事没在。既然解决了,我也回来顶一下。
    该会员没有填写今日想说内容.
    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-20 20:40 , Processed in 0.096259 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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