智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 5472|回复: 12
打印 上一主题 下一主题

请教大神,如何一直51上的ds18b20测温度程序给K60,想了好久一直没法解决

  [复制链接]

5

主题

99

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3624
威望
1822
贡献
1194
兑换币
1053
注册时间
2012-11-26
在线时间
304 小时
跳转到指定楼层
1#
发表于 2013-7-31 14:50:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近开始学习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);       //清中断标志位
}

4

主题

124

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2502
威望
1256
贡献
814
兑换币
683
注册时间
2012-6-4
在线时间
216 小时
毕业学校
长春理工
2#
发表于 2013-7-31 15:36:02 | 只看该作者
时序搞好了应该没问题的
回复 支持 反对

使用道具 举报

15

主题

568

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3854
威望
1932
贡献
1070
兑换币
1308
注册时间
2013-1-30
在线时间
426 小时
3#
发表于 2013-7-31 16:29:34 | 只看该作者
IO口模拟高低电平,搞好时序就行
回复 支持 反对

使用道具 举报

22

主题

1613

帖子

1

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6784
QQ
威望
2910
贡献
1540
兑换币
1579
注册时间
2012-3-17
在线时间
1167 小时
4#
发表于 2013-7-31 16:59:10 | 只看该作者
注意 延时
51 的IO口速度很慢,而k60的IO速很快,中间需要加入延时,你用示波器比较两者的 波形差别
回复 支持 反对

使用道具 举报

5

主题

121

帖子

0

精华

高级会员

Rank: 4

积分
816
威望
427
贡献
261
兑换币
257
注册时间
2012-11-2
在线时间
64 小时
5#
发表于 2013-8-1 17:33:01 | 只看该作者
用MPC5604你可以直接用51的程序
回复 支持 反对

使用道具 举报

5

主题

99

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3624
威望
1822
贡献
1194
兑换币
1053
注册时间
2012-11-26
在线时间
304 小时
6#
 楼主| 发表于 2013-8-2 08:50:11 | 只看该作者

RE: 请教大神,如何移植51上的ds18b20测温度程序给K60,想了好久一直没法解决

野火 发表于 2013-7-31 16:59
注意 延时
51 的IO口速度很慢,而k60的IO速很快,中间需要加入延时,你用示波器比较两者的 波形差别

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

使用道具 举报

13

主题

104

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1053
威望
496
贡献
299
兑换币
314
注册时间
2013-3-7
在线时间
129 小时
毕业学校
皖西学院
7#
发表于 2013-8-21 13:30:19 | 只看该作者
黄浩 发表于 2013-8-2 08:50
修改过程中我特意用示波器测量了每一个需要延时的时间,然后才改的,还是不可以

兄弟、、我们遇到一样的问题了、、我也是按照51的延时换成k60的延时、、就是不行、、一直是死在初始化里面、、都出不了初始化;
回复 支持 反对

使用道具 举报

5

主题

99

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3624
威望
1822
贡献
1194
兑换币
1053
注册时间
2012-11-26
在线时间
304 小时
8#
 楼主| 发表于 2013-8-21 21:39:26 | 只看该作者
曹益奇 发表于 2013-8-21 13:30
兄弟、、我们遇到一样的问题了、、我也是按照51的延时换成k60的延时、、就是不行、、一直是死在初始化里面 ...

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

使用道具 举报

4

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
威望
171
贡献
82
兑换币
88
注册时间
2014-4-17
在线时间
19 小时
毕业学校
西北民族大学
9#
发表于 2015-11-26 16:30:51 | 只看该作者
你这个可以了吗?

回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

注册会员

Rank: 2

积分
91
威望
58
贡献
23
兑换币
26
注册时间
2014-12-3
在线时间
5 小时
毕业学校
广西大学
10#
发表于 2015-11-27 15:40:09 | 只看该作者
我也想知道楼主最后怎么解决的
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-5 19:38 , Processed in 0.204862 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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