原创 Freescale MC9S08AC16读写DS18B20

2009-5-26 10:12 3493 5 5 分类: MCU/ 嵌入式

这几天,因为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();
 }
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /3 下一条