打印
[菜农助学交流]

温度传感器DS18B20

[复制链接]
2446|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
数字式温度传感器:
芯片先初始化:
 UNLOCKREG(); // 芯片注册解锁
SYSCLK->PWRCON.XTL12M_EN = 1; // 设定12M外部晶振

DrvSYS_Delay(5000); // 等待时钟就绪
LOCKREG(); //向“0x5000_0100”写入任何值,就可以重锁保护寄存器


然后再初始化串口:
 STR_UART_T param;

DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, 0); // 使能UART时钟
DrvGPIO_InitFunction(E_FUNC_UART0); // 复用功能引脚设置

param.u32BaudRate = 115200; // 波特率
param.u8cDataBits = DRVUART_DATABITS_8; // 数据位
param.u8cStopBits = DRVUART_STOPBITS_1; // 停止位
param.u8cParity = DRVUART_PARITY_NONE; // 校验位
param.u8cRxTriggerLevel = DRVUART_FIFO_1BYTES; // FIFO存储深度 1 字节
param.u8TimeOut = 0; // FIFO超时设定
DrvUART_Open(UART_PORT0, ¶m); // 串口开启、结构体整体赋值


下一步就是获取18B20的ID号:
void get_rom(unsigned char* p)
{
unsigned char i;
if (resetDS18B20()==0xff)
{
writeByteDS18B20(ds18b20_read_rom);
for (i=0;i<8;i++)
{
*p++ = readByteDS18B20();
}
}
}


初始化代码:
/**********************************************************************
functionName: unsigned char resetDS18B20(void)
description :DS18B20初始化
**********************************************************************/
unsigned char resetDS18B20(void)
{
unsigned char errTime=0;
HLD_DS18B20; //控制总线
CLR_DS18B20; //强制拉低
delay_nus(260); //以上延时大于480us
SET_DS18B20;
RLS_DS18B20; //释放总线,总线自动上拉 DDR
delay_nus(7); //15~60us

while (STU_DS18B20)
{
delay_nus(3); //5.15us
errTime++;
if (errTime>20)
return(0x00); //如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)
}
errTime=0;
while (!(STU_DS18B20))
{
delay_nus(3); //5.15us
errTime++;
if (errTime>50)
return(0x00); //如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
}
HLD_DS18B20; //控制总线
SET_DS18B20; //强制拉高
return(0xff);
}


下面就是一些DS18B20的常用读写操作,只要服从DATASHEET的时序规范就可以了:
/**********************************************************************
functionName: unsigned char readByteDS18B20(void)
description :读DS18B20一个字节
**********************************************************************/
unsigned char readByteDS18B20(void)
{
unsigned char i;
unsigned char retVal=0;
//RLS_DS18B20; //释放总线
for (i=8;i>0;i--)
{
retVal>>=1;
HLD_DS18B20; //控制总线
CLR_DS18B20; //强制拉低
delay_nus(1); //延时大于1us
SET_DS18B20; //释放总线,DS18B20会将总线强制拉低
RLS_DS18B20; //释放总线
delay_nus(1);

if (STU_DS18B20)
retVal|=0x80;
delay_nus(15); //31us

}
HLD_DS18B20; //控制总线
SET_DS18B20; //强制拉高
return(retVal);
}

/**********************************************************************
functionName: unsigned char readByteDS18B20(void)
description :写DS18B20一个字节
**********************************************************************/
void writeByteDS18B20(unsigned char wb)
{
unsigned char i;
unsigned char temp;

//RLS_DS18B20; //释放总线
for (i=0;i<8;i++)
{
HLD_DS18B20; //控制总线
CLR_DS18B20; //强制拉低
delay_nus(1); //14.92us
temp=wb>>i;
if (temp&=0x01)
SET_DS18B20; //释放总线
else
CLR_DS18B20; //强制拉低
delay_nus(15); //30.38us
SET_DS18B20; //释放总线
delay_nus(1); //2.71us(大于1us就行了)
}
}

/**********************************************************************
functionName: get_rom(unsigned char* p)
description :读ROM
**********************************************************************/
void get_rom(unsigned char* p)
{
unsigned char i;
if (resetDS18B20()==0xff)
{
writeByteDS18B20(ds18b20_read_rom);
for (i=0;i<8;i++)
{
*p++ = readByteDS18B20();
}
}
}

/**********************************************************************
functionName: void set_ds18b20(char th,char tl,unsigned char config)
description :设定DS18B20模式
**********************************************************************/
void set_ds18b20(char th,char tl,unsigned char config)
{
if (resetDS18B20()==0xff)
{
writeByteDS18B20(ds18b20_skip_rom);
writeByteDS18B20(ds18b20_write_ram);
writeByteDS18B20(th);
writeByteDS18B20(tl);
writeByteDS18B20(config);
}
}
/**********************************************************************
functionName: convert_ds18b20(void)
description :写DS18B20一个字节
**********************************************************************/
void convert_ds18b20(void)
{
if (resetDS18B20()==0xff)
{
writeByteDS18B20(ds18b20_skip_rom); //跳过ROM
writeByteDS18B20(ds18b20_convert_tem); //启动温度转换
}
}

/**********************************************************************
functionName: unsigned int readTempDS18B20(void)
description :读DS18B20温度 有正负符号标志和两个小数点精度
**********************************************************************/
unsigned int readTempDS18B20(void)
{
unsigned char tempL,tempH,wm0,wm2;
unsigned int x;

if (resetDS18B20()==0)
return 0;
writeByteDS18B20(ds18b20_skip_rom); //跳过ROM
writeByteDS18B20(ds18b20_read_ram); //读数据
tempL=readByteDS18B20();
tempH=readByteDS18B20();
wm0=tempL;
wm0=wm0>>4;
tempH=tempH<<4;
wm2=wm0+tempH; //温度的整数值
if (wm2&0x80) //测试符号位
{
DS18B20_sign_flag=1;
wm2=256-wm2;
}
else
DS18B20_sign_flag=0;

x = wm2*100; //字符型赋给整形,扩大100倍

if (tempL&0x08) //提高测试精度
{
x=x+50;
}
if (tempL&0x04)
{
x=x+25;
}
if (tempL&0x02)
{
x=x+12;
}
if (tempL&0x01)
{
x=x+6;
}

convert_ds18b20();//启动温度转换
return(x);
}



最后上效果演示图:

温度.png (14.1 KB )

温度.png

相关帖子

沙发
Swallow_0322| | 2012-1-9 07:41 | 只看该作者
顶!

使用特权

评论回复
板凳
hotpower| | 2012-1-9 08:40 | 只看该作者
最好把唯一ID显示出来。

使用特权

评论回复
地板
yulri| | 2012-2-9 15:29 | 只看该作者
记下了,先!!

使用特权

评论回复
5
neo_bright| | 2012-2-16 21:23 | 只看该作者
:)学习

使用特权

评论回复
6
技美电子| | 2012-2-16 21:34 | 只看该作者
学习了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

17

帖子

1

粉丝