标题:
基于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