这几天,因为BDM的问题,没办法调试MCF52211,值得等从飞思卡尔买来原版的仿真器再说。称这几天时间,整理了NSS08Kit-R1开发板的资料。闲来没事,贴个MC9S08AC16读写DS18B20的程序
/******************************
@ Nicrosystem Freescale S08 DevKit(NSS08Kit-R1)
@ author:bluehacker<nicrosystem@gmail.com>
@ date:2009-04-09
********************************/
/*****************************
@说明:
ds18b20的驱动
*****************************/
#include "derivative.h"
#include "delay.h"
#include "ds18b20.h"
#define DS18B20_DQ PTDD_PTDD0
#define SET_DS18B20_DQ_OUT() PTDDD_PTDDD0=1
#define SET_DS18B20_DQ_IN() PTDDD_PTDDD0=0
//该函数发起一个read time slot,读回一个bit的数据返回
unsigned char issue_read_timeslot()
{
unsigned char i;
SET_DS18B20_DQ_OUT();
DS18B20_DQ=1;
delay_us(1);
DS18B20_DQ=0;//产生一个下降沿,开始一个读time slot(时隙)
//根据ds18b20的1-wire协议要求,必须延时至少1us
delay_us(2);
//释放总线
DS18B20_DQ=1;
SET_DS18B20_DQ_IN();
//根据ds18b20的1-wire协议要求,必须延时至少15us
//这样读到的数据才有效
delay_10us(2);
i="DS18B20"_DQ;
SET_DS18B20_DQ_OUT();
return i;
}
//初始化与ds18b20连接的MC9S08AC16引脚
void init_ds18b20_port()
{
PTDPE_PTDPE0=0;//disable pull up
PTDDS_PTDDS0=1;
SET_DS18B20_DQ_OUT();
}
//初始化
//如果返回1,表示初始化成功,ds18b20正确连接在1-wire总线上
//如果返回0,则初始化失败,可能ds18b20没有连接
unsigned char reset_pulse(void)
{
unsigned char flag="0";
DS18B20_DQ=1;
delay_us(1);
DS18B20_DQ=0;
//拉低约600us(必须在480us--960us之间)
delay_10us(60);
DS18B20_DQ=1;
SET_DS18B20_DQ_IN();
delay_10us(6);
//检测DS18B20应答
if(DS18B20_DQ)
flag=0;
else
flag=1;
SET_DS18B20_DQ_OUT();
return flag;
}
/*从ds18b20读一个字节
* ds18b20返回的数据是LSB的,即最低位先发,最高位最后发
*/
unsigned char read_byte(void)
{
unsigned char i,j,tmp;
tmp=0;
SET_DS18B20_DQ_OUT();
for(i=0;i<8;i++)
{
tmp>>=1;
DS18B20_DQ=1;
delay_us(1);
DS18B20_DQ=0;//产生一个下降沿,开始一个读time slot(时隙)
//根据ds18b20的1-wire协议要求,必须延时至少1us
delay_us(2);
//释放总线
DS18B20_DQ=1;
SET_DS18B20_DQ_IN();
//根据ds18b20的1-wire协议要求,必须延时至少15us
//这样读到的数据才有效
delay_10us(2);
if(DS18B20_DQ)
tmp|=0x80;
delay_10us(1);
SET_DS18B20_DQ_OUT();
}
return tmp;
}
void write_command(unsigned char cmd)
{
unsigned char i;
SET_DS18B20_DQ_OUT();
for(i=0;i<8;i++)
{
DS18B20_DQ=1;
if(cmd&0x01)//write 1 time slot
{
DS18B20_DQ=0;//产生下降沿,开始一个write 1 time slot
DS18B20_DQ=1;//释放总线
delay_10us(7);//delay at least 60us
}
else{//write 0 time slot
DS18B20_DQ=0;//产生下降沿,开始一个write 0 time slot
delay_10us(7);
DS18B20_DQ=1;
}
cmd>>=1;
}
DS18B20_DQ=1;
}
//启动一次温度测量
void convert(void)
{
reset_pulse();
write_command(SKIPROM);
write_command(CONVERT);
//wait for ds18b20 complete
SET_DS18B20_DQ_IN();
while(issue_read_timeslot()==0);
}
void get_temperature_data(unsigned char *temp)
{
reset_pulse();
write_command(SKIPROM);
write_command(READSPAD);
temp[0]=read_byte();//低字节
temp[1]=read_byte();//高字节
reset_pulse();//终止继续传输后续字节
}
//读ds18b20供电情况,如果返回1表示ds18b20是由外部电源供电
//返回0表示是利用1-wire总线寄生供电
unsigned char read_power_supply()
{
reset_pulse();
write_command(READPS);
return issue_read_timeslot();
}
void read_ds18b20_id(unsigned char *id)
{
unsigned char i;
reset_pulse();
write_command(0x33);
for(i=0;i<8;i++)
{
id=read_byte();
}
}
文章评论(0条评论)
登录后参与讨论