Board logo

标题: 基于ARM9的18B20温度传感器程序 [打印本页]

作者: yuyang911220    时间: 2014-12-24 22:30     标题: 基于ARM9的18B20温度传感器程序

18B20温度传感器,典型的时序操作器件,用51单片机写很方便,可是把这现成的程序移植到FPGA、ARM、430上面,还需要一定的翻译功底。

//-------------------------------------------------------------------------------------
//函数名称:dmsec //入口参数:count //函数功能:延时子程序
//-------------------------------------------------------------------------------------
void dmsec(uint count) { uchar i;
while(count--) {
  for(i=0;
  i<125;
  i++);
}
}
//-------------------------------------------------------------------------------------
//函数名称:tmreset //入口参数:无 //函数功能:
//-------------------------------------------------------------------------------------
void tmreset(void) {
  ushort i;
  dq=0;
  i=343;
  while(i>0)i--;
  //大约900us dq=1;
  i=13;
  while(i>0)i--;
}//-------------------------------------------------------------------------------------
//函数名称:tmpre //入口参数:无 //函数功能:等待DS18B20应答
//-------------------------------------------------------------------------------------
void tmpre(void) {
  uchar i;
  while(dq);
  while(~dq);
  i=13;
  while(i>0)i--;
}//-------------------------------------------------------------------------------------
//函数名称:tmrbit //入口参数:无 //返回值: dat//函数功能:在总线上读一位
//-------------------------------------------------------------------------------------
bit tmrbit(void) {
  uchar i;
  bit dat;
  dq=0;
  i++;
  dq=1;
  i++;
  i++;
  dat=dq;
  i=30;
  while(i>0)i--;
  return(dat);
}//-------------------------------------------------------------------------------------
//函数名称:tmrbyte //入口参数:无 //返回值: dat//函数功能:读一个字节
//-------------------------------------------------------------------------------------
uchar tmrbyte(void) {
  uchar i,j,dat=0;
  for(i=1;i<=8;i++){
   j=tmrbit();
   dat=(j<<7)|(dat>>1);
  }
   return(dat);
}//-------------------------------------------------------------------------------------
  //函数名称:tmwbyte //入口参数:dat //函数功能:写命令
//-------------------------------------------------------------------------------------
void tmwbyte(uchar dat) {
  uint i;
  uchar j;
  bit testb;
  for(j=1;j<=8;j++){
   testb=dat&0x01;
   dat=dat>>1;
   if(testb){
    dq=0;
    //写1i++;
    i++;
    dq=1;
    i=27;
    while(i>0)i--;
   }
   else {
    dq=0;
    //写0i=27;
    while(i>0)i--;
    dq=1;
    i++;
    i++;
   }
  }
//-------------------------------------------------------------------------------------
//函数名称:tmrbyte //入口参数:无 //函数功能:读取温度值
//-------------------------------------------------------------------------------------
void read_tr() {
uchar a,b;
ushort y;
tmreset();
tmpre();
dmsec(1);
tmwbyte(0xcc);
tmwbyte(0x44);
dmsec(100);
tmreset();
tmpre();
dmsec(1);
tmwbyte(0xcc);
tmwbyte(0xbe);
a=tmrbyte();
//l b=tmrbyte();
//h y=b&0x0f;
y=y<<8;
y=a|y;
if(y>0x800) {
  y=0x1000-y;
  bjTr=cal12bit(y);
  bjTr=bjTr+0x8000;
}
else
{
   bjTr=cal12bit(y);
}
} //12位精度
void temp_init(void) {
tmreset();
tmpre();
tmwbyte(0xcc);
tmwbyte(0x4e);
tmwbyte(0x88);
tmwbyte(0x44);
tmwbyte(0x7f);
tmreset();
}




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0