常驻嘉宾
- 积分
- 3624
- 威望
- 1822
- 贡献
- 1194
- 兑换币
- 1053
- 注册时间
- 2012-11-26
- 在线时间
- 304 小时
|
最近开始学习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); //清中断标志位
}
|
|