7802|12

255

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

eZ430-RF2500试用心得(七)—测温成功心狂喜 显示失败眉紧锁 [复制链接]

            经过这几天的通宵鏖战,刻苦钻研,本人的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 编辑 ]

最新回复

可以写一个子程序,把数据分开来传输。 解决端口不足的问题。  详情 回复 发表于 2011-6-23 10:36
 
点赞 关注

回复
举报

255

帖子

0

TA的资源

纯净的硅(中级)

沙发
 

    接着,再来看看ED端是如何采集传感器温度数据并发送给AP端的。其实很简单,因为本实验就是基于TI的例程的(前面已经发帖仔细分析过了历程源代码),所以很多任务可以直接调用已有的模块,并修改一下参数设置就可以了:

    首先要在demo_ED,即ED端的出程序文件中加入#include "ds18b20.h"头文件,以便直接调用测温函数。

    然后在linkTo()函数中加入以下代码:

degc = DS18B20_GetState();
   
    if (degc>320||degc<0)     P4OUT = 0xEF;  //蜂鸣器和P4.7端口(开发板上的P9引脚)相连,超过32℃(但应和320相比较)或低于0℃蜂鸣器就报警
   
    temp = results[1];                       //提取电压值         
    volt = (temp*25)/512;                 //转换数据为十进制格式
    
    msg[0] = degc&0xFF;                 //向发送包中加入温度数据低八位
    msg[1] = (degc>>8)&0xFF;        //向发送包中加入温度数据高八位 
    msg[2] = volt;                             //向发送包中加入电压数据
    这样,就完成了ED端的温度测量、采集、发送任务,下面就是AP端的接收、传送任务了。不过,其实不需要在AP端的程序代码里做任何改动,直接用例程的的源代码就可以了。因为发生改变的只是ED端传送来的数据包msg[]中的温度数据由原来的片内温度改成了DS18b20测量的环境温度,AP端不必区分这个,只要把数据提取出来,再按原方式发送到串口供电脑处理就可以了。

    最后,附上源代码:

 

eZ430-RF2500-DS18B20.zip (907.29 KB, 下载次数: 79)

    至此,总算完成了原计划的一半,还有一个预定目标:把相关数据信息显示在AP端上加入的LCD12864液晶显示模块。现在已经开始在尝试了,但还没能实现该功能,而且似乎遇到了很大的问题,怎么也想不通。唉,时间不多了,事情还有很多,我要加油了!

 
 

回复

755

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 
LCD12864程序出问题了?
 
 
 

回复

255

帖子

0

TA的资源

纯净的硅(中级)

4
 

回复 板凳 deweyled 的帖子

嗯,程序下载运行,液晶屏一点反应也没有。这样吧,我把代码发上来,麻烦您有空看看,帮忙找找问题在哪儿。也希望其他坛友不吝赐教,给予在下指点。我实在是想不出问题在哪里了,感觉好像没问题的样子···

ez430加入12864模块.zip (764.19 KB, 下载次数: 27)

[ 本帖最后由 wwh19910609 于 2011-6-17 16:39 编辑 ]
 
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

5
 

回复 4楼 wwh19910609 的帖子

http://hi.baidu.com/lyzhangxiang ... 309e0f5aaf5391.html

看看这个 首先你得确定你的硬件没问题  

我所见的液晶不好使的基本上都是硬件问题,很少有驱动问题的,因为现在已经很少有人自己写驱动了,都是网上找的。当然430的话建议找一个匹配的,虽然这个8080或者6800时序不是那么敏感,还是不能小视。现在在宿舍,公司电脑上有lcd12864的驱动430的,这个东西要是有驱动的话太好用了,先确定硬件问题,楼主说lcd没显示,有背光吗,或者那个你调节那个电阻可以看到黑色的阴影的有无么?
 
 
 

回复

1万

帖子

16

TA的资源

版主

6
 

不错,顶

 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

回复

255

帖子

0

TA的资源

纯净的硅(中级)

7
 

回复 5楼 lyzhangxiang 的帖子

多谢lyzhangxiang大哥的指导!不好意思,这两天一直在忙着复习和课程设计,所以没能及时回复您。我想也应该是硬件问题,我用的是金鹏公司生产的OCM12864-9型号的液晶屏,该型号的说明书里的第十五引脚没有PSB的用法,只标注了/CS1这个用法,好像说明该型号不支持串行功能。我现在正在尝试把液晶屏嫁接到一块有74HC595解码芯片的板子上,不过那个板子原来是用的51单片机,编程方式跟430差别还是蛮大的,所以现在还没调试成功。
 
 
 

回复

255

帖子

0

TA的资源

纯净的硅(中级)

8
 

回复 6楼 ddllxxrr 的帖子

呵呵,多谢帮顶!
 
 
 

回复

255

帖子

0

TA的资源

纯净的硅(中级)

9
 

回复 5楼 lyzhangxiang 的帖子

果然,我猜得没错,该型号的12864不支持串行,只能并行··· 可是开发板上引出的I/O口都不是连续的,是从P2、P3、P4三个端口中选了一些引出来,所以直接写并行程序会很不方便。看来真要费一番功夫了···
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(中级)

10
 

请教楼主

楼主用P2.0作为DS18B20的温度采集端口,不用将程序里的INCH_10改为INCH_0吗?P2.0不是作为AD10的输入通道A0吗?
 
 
 

回复

755

帖子

0

TA的资源

五彩晶圆(初级)

11
 

回复 9楼 wwh19910609 的帖子

可以写一个子程序,把数据分开来传输。
解决端口不足的问题。
 
 
 

回复

255

帖子

0

TA的资源

纯净的硅(中级)

12
 

回复 11楼 deweyled 的帖子

嗯,好像是个方法,但我不会啊···
 
 
 

回复

255

帖子

0

TA的资源

纯净的硅(中级)

13
 

回复 10楼 liminite 的帖子

对哦,大侠的话倒是提醒了我,这些端口不能随便用的。我今晚按楼主说的试试
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表