常驻嘉宾
- 积分
- 3624
- 威望
- 1822
- 贡献
- 1194
- 兑换币
- 1053
- 注册时间
- 2012-11-26
- 在线时间
- 304 小时
|
2#
楼主 |
发表于 2013-7-30 20:39:41
|
只看该作者
/******************** (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); //清中断标志位
}
|
|