经过这几天的通宵鏖战,刻苦钻研,本人的eZ430-RF2500开发板实验终于取得了突破性进展——成功的在例程中加入了DS18b20温度传感模块!
而且还有蜂鸣器,以实现高温或低温报警功能。下面,就和大家分享一下我的小小成果,呵呵,上图喽!
这是ED端的模块实物连接,焊功不佳,见笑见笑···
以下是电脑通过串口看到的实验现象,已在图中加入相关说明:
以上就是实验过程的展示了。虽然只是个简单的测温传感功能,在大侠们眼里也许不算什么,但也是我绞尽脑汁,认真研究了几天才成功的,所以,自己感觉还是蛮受鼓舞的,呵呵
当然,在这里还要感谢之前所有关注过我的帖子并给予了解答和帮助的坛友们!恐怕随着实验的进行,学习的深入,在下还会有更多的问题,希望各位能继续给予指导!
下面,还是老规矩,该分析分析代码了。分析之前要特别鸣谢0212009623坛友在帖子里提供的DS18b20驱动程序。这个驱动很好用,在这里我就以此为基础来分析,供大家参考:
////////////////////////////////////////////////////////////////////////////////
// 函数(模块)名称:DS18B20.H
// 功能:单总线温度传感器DS18B20驱动函数
// 入口参数:无
// 出口参数:无
// 说明:无
////////////////////////////////////////////////////////////////////////////////
#include "msp430x22x4.h"
#include "DS18B20.H"
////////////////////////////////////////////////////////////////////////////////
#define DS18B20_DIR P2DIR // 温度输入端口方向控制
#define DS18B20_IN P2IN // 温度输入端口寄存器
#define DS18B20_OUT P2OUT // 温度输入端口寄存器
#define DQ BIT0 // 温度输入端口P2.0,开发板上P3引脚
////////////////////////////////////////////////////////////////////////////////
int g_iTemperature = 0; // 温度整数值
int g_iPulse = 1; // 从机返回的存在脉冲 -- 低电平有效
////////////////////////////////////////////////////////////////////////////////
// 函数(模块)名称:DS18B20_Reset
// 功能:初始化过程,复位DS18B20
// 入口参数:无
// 出口参数:cTemp--从机发送来的存在脉冲
// 说明:无
////////////////////////////////////////////////////////////////////////////////
char DS18B20_Reset(void)
{
char cTemp = 1; // 存储从机发送来的存在脉冲
DS18B20_DIR |= DQ; // 设定DQ管脚为输出方向
DS18B20_OUT &=~ DQ; // 主机将DQ脚拉低
DelayUs(500); // 延时480us<= t <= 960us
DS18B20_OUT |= DQ; // 主机将DQ脚拉高,释放总线
DelayUs(60); // 延时15us<= t <= 60us
DS18B20_DIR &=~ DQ; // 主机设定DQ管脚为输入方向
cTemp = (char)(DS18B20_IN & DQ); // 读取从机发送的存在脉冲 低电平
DelayUs(100); // 存在脉冲 低电平60us-240us
return(cTemp);
}
////////////////////////////////////////////////////////////////////////////////
// 函数(模块)名称:DS18B20_ReadByte
// 功能:读取DS18B20转换结果的一位
// 入口参数:无
// 出口参数:cValue--DS18B20的温度值
// 说明:无
////////////////////////////////////////////////////////////////////////////////
char DS18B20_ReadByte(void)
{
char cValue = 0; // 存储从机发送来的温度
char cTemp = 0; // 存储从机发送来的数值
for(unsigned char i=0;i<8;i++)
{
cValue >>= 1; // 右移至低位
DelayUs(1); // 延时1us<= t,保证两次连续读操作间隔1us以上
DS18B20_DIR |= DQ; // 设定DQ管脚为输出方向
DS18B20_OUT &=~ DQ; // 主机将DQ脚拉低至少1us,发起读时隙,
DelayUs(1); // 延时1us<= t,保证拉低总线的时间不少于1us
DS18B20_OUT |= DQ; // 主机将DQ脚拉高,释放总线
DelayUs(1); // 延时1us<= t,保证拉高总线的时间不少于1us(可无)
DS18B20_DIR &=~ DQ; // 主机设定DQ管脚为输入方向
cTemp = (char)(DS18B20_IN & DQ); // 读取从机发送的存在脉冲 低电平
if(cTemp == DQ)
{
cValue |= 0x80; // 存储温度的数据位,低位先传
}
DelayUs(60); // 等待读操作结束 向单总线读一位至少需要60us
}
return(cValue); // 返回温度字节
}
////////////////////////////////////////////////////////////////////////////////
// 函数(模块)名称:DS18B20_WriteByte
// 功能:写DS18B20,主机发送命令
// 入口参数:cValue--写入的值
// 出口参数:无
// 说明:无
////////////////////////////////////////////////////////////////////////////////
void DS18B20_WriteByte(char cValue)
{
char cBit = 0; // 写入的位数据
for(unsigned char i=8;i>0;i--)
{
DelayUs(1); // 延时1us,保证两次连续写操作间隔1us以上
DS18B20_DIR |= DQ; // 设定DQ管脚为输出方向
DS18B20_OUT &=~ DQ; // 主机将DQ脚拉低,写时隙开始
DelayUs(5); // 延时至少1u,保证拉低总线的时间不少于1us
// DS18B20_OUT |= DQ; // 主机将DQ脚拉高,释放总线
// DelayUs(1); // 延时1us,保证拉高总线的时间不少于1us
cBit = cValue & 0x01; // 低位先写
cValue >>= 1;
if(cBit == 1) // 写1
{
DS18B20_OUT |= DQ; // 15us内必须释放总线,DS18B20在写时隙开始后(写起始信号后)的15~16us期间,采样总线数据
}
else // 写0
{
DS18B20_OUT &=~ DQ;
}
DelayUs(50); // 等待读操作结束 向单总线写一位至少需要60us
DS18B20_OUT |= DQ; // 主机将DQ脚拉高,释放总线,为下一个写时隙作准备
}
}
////////////////////////////////////////////////////////////////////////////////
// 函数(模块)名称:DS18B20_ReadTemperature
// 功能:读取DS18B20转换完成后寄存器中的原始温度值
// 入口参数:无
// 出口参数:返回DS18B20寄存器中的温度值
// 说明:无
////////////////////////////////////////////////////////////////////////////////
int DS18B20_ReadTemperature(void)
{
union
{
char cTemperature[2];
int iTemperature;
}uTemperture;
// char cFlag = 0; // 符号标志位
g_iPulse = DS18B20_Reset();
DS18B20_WriteByte(0xCC); // 跳过ROM
DS18B20_WriteByte(0x44); // 开始转换
DelayUs(750000); // 12位的温度转换结果,至少需要750ms
g_iPulse = DS18B20_Reset();
DS18B20_WriteByte(0xCC); // 跳过ROM
DS18B20_WriteByte(0xBE); // 读取暂存器
// 读取温度低字节位
uTemperture.cTemperature[0] = DS18B20_ReadByte();
// 读取温度高字节位
uTemperture.cTemperature[1] = DS18B20_ReadByte();
// 最高位为1,温度为负值
if(uTemperture.cTemperature[1] > 0x7f)
{ // 取反加一
uTemperture.cTemperature[0] = ~uTemperture.cTemperature[1]+1;
uTemperture.cTemperature[1] = ~uTemperture.cTemperature[0];
// cFlag = 1; // 标识为负温度
}
return (uTemperture.iTemperature);
}
////////////////////////////////////////////////////////////////////////////////
// 函数(模块)名称:DS18B20_GetState
// 功能:返回温度值
// 入口参数:无
// 出口参数:无
// 说明:无
////////////////////////////////////////////////////////////////////////////////
int DS18B20_GetState(void)
{
static int s_iTemperature = 0;
_DINT();
s_iTemperature = DS18B20_ReadTemperature();
_EINT();
s_iTemperature = (int)(s_iTemperature * 0.625);
return s_iTemperature;
}
[
本帖最后由 wwh19910609 于 2011-6-16 18:44 编辑 ]