智能车制作
标题:
求用K60的DS18B20测温程序
[打印本页]
作者:
黄浩
时间:
2013-7-30 20:25
标题:
求用K60的DS18B20测温程序
[attach]49377[/attach]
刚刚开始学习K60,用51测温程序改了一下,,,,可是无论如何都采集不了温度值,,希望大神可以帮忙解决一下!
用野火的底层库写的。
作者:
黄浩
时间:
2013-7-30 20:39
/******************** (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);
gpio_init (PORTD, 7, GPO, HIGH);
DisableInterrupts; //禁止总中断
pit_init_ms(PIT0, 500); //初始化PIT0,定时时间为: 500ms
EnableInterrupts; //开总中断
// L=0;
while(1)
{
// time_delay_us(500);
//测温在中断服务程序中 isr.c 文件
}
}
/******************** (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 DQ PTE0_OUT
/**********************************************************************
* 函数名称: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初始化
------------------------------------------------*/
u8 Init_DS18B20(void)
{
u8 dat=0;
DQ = 1; //DQ复位
Delay_us(5); //稍做延时
DQ = 0; //单片机将DQ拉低
Delay_us(200); //精确延时 大于 480us 小于960us
Delay_us(200);
DQ = 1; //拉高总线
Delay_us(50); //15~60us 后 接收60-240us的存在脉冲
dat=gpio_get(PORTE, 0); //如果x=0则初始化成功, x=1则初始化失败
Delay_us(25); //稍作延时返回
return dat;
}
/*------------------------------------------------
读取一个字节
------------------------------------------------*/
u8 ReadOneChar(void)
{
u8 i=0;
u8 dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
Delay_us(25);
}
return(dat);
}
/*------------------------------------------------
写入一个字节
------------------------------------------------*/
void WriteOneChar(u8 dat)
{
u8 i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
Delay_us(25);
DQ = 1;
dat>>=1;
}
Delay_us(25);
}
/*------------------------------------------------
读取温度
------------------------------------------------*/
u16 ReadTemperature(void)
{
u8 a=0;
u16 b=0;
u16 t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Delay_ms(10);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar(); //低位
b=ReadOneChar(); //高位
b<<=8;
t=a+b;
return(t);
}
void PIT0_IRQHandler(void)
{
s16 temp;
float temperature;
temp=ReadTemperature();
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); //清中断标志位
}
作者:
苦茶123
时间:
2016-5-3 17:34
你解决了没?
作者:
黄浩
时间:
2016-5-22 12:10
苦茶123 发表于 2016-5-3 17:34
你解决了没?
http://www.znczz.com/thread-165694-2-1.html
欢迎光临 智能车制作 (http://111.231.132.190/)
Powered by Discuz! X3.2