智能车制作

标题: 请教大神,如何一直51上的ds18b20测温度程序给K60,想了好久一直没法解决 [打印本页]

作者: 黄浩    时间: 2013-7-31 14:50
标题: 请教大神,如何一直51上的ds18b20测温度程序给K60,想了好久一直没法解决
最近开始学习K60,想一直51的测温度程序。可是就是没反应。
/******************** (C) COPYRIGHT 2011 野火嵌入式开发工作室 ********************
* 文件名       :main.c
* 描述         :基于MK60DN512Z***10的ds18b20测温程序
*
*
* 作者         :
* 时间       :
* 技术支持论坛 :http://www.ourdev.cn/bbs/bbs_list.jsp?bbs_id=1008
**********************************************************************************/



#include "common.h"
#include "include.h"


#define D0 PTD0_OUT
#define D1 PTD1_OUT
#define D2 PTD2_OUT
#define D3 PTD3_OUT
#define D4 PTD4_OUT
#define D5 PTD5_OUT
#define D6 PTD6_OUT
#define D7 PTD7_OUT



//#define D0 L




void  main(void)
{
    gpio_init  (PORTD, 0, GPO, HIGH);           //初始化 PTD15 :输出高电平 ,即 初始化 LED3,灭
    gpio_init  (PORTD, 1, GPO, HIGH);
    gpio_init  (PORTD, 2, GPO, HIGH);
    gpio_init  (PORTD, 3, GPO, HIGH);
    gpio_init  (PORTD, 4, GPO, HIGH);
    gpio_init  (PORTD, 5, GPO, HIGH);
    gpio_init  (PORTD, 6, GPO, HIGH);
    gpio_init  (PORTD, 7, GPO, HIGH);



    DisableInterrupts;                                //禁止总中断

    pit_init_ms(PIT0, 500);                          //初始化PIT0,定时时间为: 500ms

    EnableInterrupts;                                      //开总中断
//    L=0;
    while(1)
    {
//
  //测温在中断服务程序中 isr.c 文件
      //D4= 0;
      //time_delay_ms(500);
    }
}

/******************** (C) COPYRIGHT 2011 野火嵌入式开发工作室 ********************
* 文件名       :isr.c
* 描述         :中断处理例程
*
* 实验平台     :野火kinetis开发板
* 库版本       :
* 嵌入系统     :
*
* 作者         :野火嵌入式开发工作室
* 淘宝店       :http://firestm32.taobao.com
* 技术支持论坛 :http://www.ourdev.cn/bbs/bbs_list.jsp?bbs_id=1008
**********************************************************************************/

#include "common.h"
#include "include.h"

#define DSO PTE0_OUT
#define DSI PTE0_IN

void gpiodir(u8 k)//设置E0口作为输入输出//1:输出,0:输入
{
  u8 kk;
  kk=k;
  PORTE_PCR0=PORT_PCR_MUX(1);
  GPIO_DDR_1bit(PORTE,0,kk);

}

/**********************************************************************
* 函数名称:Delay_ms();Delay_us();
* 函数功能:延时函数
* 入口参数:
* 出口参数:
* 修改人  :
* 修改时间
**********************************************************************/
/******延时ms******/
void Delay_ms(uint16 mt)
{
    uint16 mx, my;
    for(mx = 7800; mx > 0; mx--)
        for(my = mt; my > 0; my--);
}
/******延时us******/
void Delay_us(uint16 ut)
{
    uint16 ux, uy;
    for(ux = 0; ux <= 800; ux++)
        for(uy = ut; uy > 0; uy--);
}

/*************************************************************/
/*                      初始化18B20                          */
/*************************************************************/
void init18b20(void)
{
gpiodir(1);//DSDDR=1;
DSO = 1;
Delay_us(15);
DSO = 0;          //拉低数据线,复位总线;
Delay_us(760);     //延时504us
DSO = 1;         //提升数据线;
Delay_us(45);     //延时32us;
gpiodir(0);//DSDDR=0;
while(DSI)       //等待从器件器件应答信号;
{asm("nop");}
gpiodir(1);//DSDDR=1;
Delay_us(190);     //延时128us;
DSO = 1;          //提升数据线,准备数据传输;
}

/*************************************************************/
/*                      向18B20写入数据                      */
/*************************************************************/
void WR18b20(u8 cmd)
{
    u8 k;
    for(k=0;k<8;k++)
    {
        if(cmd & 0x01)              //低位在前;
        {
            DSO = 0;
            Delay_us(15);
            DSO = 1;          //发送数据;
        }                        
        else
        {
            DSO = 0;           
            Delay_us(15);
        }
        Delay_us(100);                   //延时64us等待从器件采样;
        DSO = 1;                 //拉高总线
        Delay_us(15);             
        cmd >>= 1;
    }
}

/*************************************************************/
/*                      由18B20读取数据                      */
/*************************************************************/
u8 RD18b20(void)
{
    u8 k;
    u8 tmp=0;
    DSO = 1;
    Delay_us(15);          //准备读;
    for(k=0;k<8;k++)
    {
      tmp >>= 1;                     //先读取低位
      DSO = 0;                  //Read init;
      Delay_us(15);                    
      DSO = 1;                      //必须写1,否则读出来的将是不预期的数据;
      asm("nop");asm("nop");asm("nop");                        //延时9us?
      gpiodir(0);//DSDDR=0;
      asm("nop");
      if(DSI)              //在12us处读取数据;
      tmp |= 0x80;
      Delay_us(100);
      gpiodir(1);//DSDDR=1;
      DSO = 1;
      Delay_us(15);
        //恢复One Wire Bus;
    }
    return tmp;
}

/*************************************************************/
/*                      由18B20读取温度                      */
/*************************************************************/
u16 read_T(void)
{
         u16 t;
         u8 temp[2];

   init18b20();
   WR18b20(0xcc);
   WR18b20(0x44);
   init18b20();
   WR18b20(0xcc);
   WR18b20(0xbe);
   temp[0]=RD18b20();
   temp[1]=RD18b20();
   init18b20();
   t=(temp[1]<<8)|temp[0];
   return(t);
}


void PIT0_IRQHandler(void)
{
    s16 temp;
    float temperature;

        temp=read_T();
        temperature=(float)temp*0.0625;//处理室温值

        if(temperature<28.0)
          GPIO_SET_8bit(PORTD, 0, 0xfc);
        else if(temperature<30.0)
          GPIO_SET_8bit(PORTD, 0, 0xf0);
        else if(temperature<32.0)
          GPIO_SET_8bit(PORTD, 0, 0xc0);
        else
          GPIO_SET_8bit(PORTD, 0, 0x00);

        //D7=~D7;


  PIT_Flag_Clear(PIT0);       //清中断标志位
}


作者: w717342899    时间: 2013-7-31 15:36
时序搞好了应该没问题的
作者: 若苦似甜    时间: 2013-7-31 16:29
IO口模拟高低电平,搞好时序就行
作者: 野火    时间: 2013-7-31 16:59
注意 延时
51 的IO口速度很慢,而k60的IO速很快,中间需要加入延时,你用示波器比较两者的 波形差别
作者: 447200632    时间: 2013-8-1 17:33
用MPC5604你可以直接用51的程序
作者: 黄浩    时间: 2013-8-2 08:50
标题: RE: 请教大神,如何移植51上的ds18b20测温度程序给K60,想了好久一直没法解决
野火 发表于 2013-7-31 16:59
注意 延时
51 的IO口速度很慢,而k60的IO速很快,中间需要加入延时,你用示波器比较两者的 波形差别

修改过程中我特意用示波器测量了每一个需要延时的时间,然后才改的,还是不可以

作者: 曹益奇    时间: 2013-8-21 13:30
黄浩 发表于 2013-8-2 08:50
修改过程中我特意用示波器测量了每一个需要延时的时间,然后才改的,还是不可以

兄弟、、我们遇到一样的问题了、、我也是按照51的延时换成k60的延时、、就是不行、、一直是死在初始化里面、、都出不了初始化;
作者: 黄浩    时间: 2013-8-21 21:39
曹益奇 发表于 2013-8-21 13:30
兄弟、、我们遇到一样的问题了、、我也是按照51的延时换成k60的延时、、就是不行、、一直是死在初始化里面 ...

后来有人说可能和18B20  需要5V 供电有关,,,,,我也一直没有试过,你可以尝试一下

作者: dzsj    时间: 2015-11-26 16:30
你这个可以了吗?


作者: 何日深夜    时间: 2015-11-27 15:40
我也想知道楼主最后怎么解决的
作者: 黄浩    时间: 2015-12-6 15:31
dzsj 发表于 2015-11-26 16:30
你这个可以了吗?

时序问题
作者: 黄浩    时间: 2015-12-6 15:33
何日深夜 发表于 2015-11-27 15:40
我也想知道楼主最后怎么解决的

时序问题,楼上给例程了
作者: Stefan_kFohF    时间: 2017-3-6 14:59
我的初始化都不成功:Q,怎么解决的




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