This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

【MSP430 LaunchPad设计心得】+温湿度测试仪



MSP430 LaunchPad设计心得】+温湿度测试仪

1. MSP-EXP430G2 LaunchPad简介

MSP-EXP430G2 LaunchPad 是一款易于使用且价格低廉的闪存编程器和调试工具,它提供了在 MSP430 超值系列器件上进行开发所需的一切内容。它提供了具有集成仿真功能的 14/20 引脚 DIP 插座目标板,可通过 Spy Bi-Wire2 线 JTAG)协议对系统内置的 MSP430 超值系列器件进行快速编程和调试。由于 MSP430 闪存的功耗极低,因此无需外部电源即可在数秒内擦除闪存并对其进行编程。

MSP-EXP430G2 LaunchPad特性如下:

  • LaunchPad 开发板采用:
    o 14/20
    引脚 DIP (N) 插座
    o
    用于调试和编程的内置闪存仿真
    o 2
    个 可编程 LED
    o 1
    个高功率 LED
    o 1
    个可编程按钮
    o 1
    个复位按钮
  • 实现在采用 14 20 引脚 DIP (N) 封装的所有 MSP430 超值系列器件上的开发。
  • LaunchPad 的集成仿真器接口将基于闪存的 MSP430 超值系列器件与 PC 相连接,可通过 USB 实现实时系统内编程和调试。
  • 包含一根可与 PC 相连接的微型 USB 电缆。
  • 附带的 MSP430G2211IN14MSP430G2231IN14器件特性如下:
    · MSP430G2211IN14内置2kB闪存、128B RAM10 GPIO116位定时器、WDTBORComparator A+模块;
    · MSP430G2231IN14内置2kB 闪存、128B RAM10 GPIO116位定时器、WDTBOR1 USI (I2C/SPI) 以及 8 通道 10 ADC
    · 附带的 MSP430G2231IN14器件采用预加载的样本程序。
  • 现已推出可供免费下载的 IAR Kickstart Code Composer Studio 版本 5.1 集成开发环境,它们包含汇编器、连接器、仿真器、源码级调试器和 C编译器。
  • 符合 RoHS
收到的MSP-EXP430G2 LaunchPad见下图:
打开包装后,内部包装如下:
通过USB电缆将其连接至PC后,MSP-EXP430G2 LaunchPad工作画面如下:
2. 基于MSP-EXP430G2 LaunchPad的温湿度控制仪
好了,现在开始基于MSP-EXP430G2 LaunchPad的可视化温湿度控制仪的设计。
2.1 温湿度传感器的选型及设计
温湿度传感器选用瑞士Sensirion公司的SHT11SHT11是一款含有已校准数字输出的单芯片温湿度传感器。它采用先进的工业CMOS过程微加工技术,确保产品具有极高的可靠性及卓越的长期稳定性。它内部包含一个电容式聚合体测湿元件和一个能隙式测湿元件,并与一个14ADC转换器和一个串行接口电路在同一芯片上实现无缝连接。每个SHT11元件都在极为精确的温湿度校验室进行校准,校准系数存在OTP内存中,用传感器内部在检测信号的过程中调用。因此,SHT11具有反应快速、测量准确、抗干扰能力强、性价比高的优点。
SHT11可测量的温度范围是:-40~128℃(-40~254℉),测量精度:±0.4℃,可选12/14位分辨率.
SHT11可测量的湿度范围是:0%RH~100%RH,测量精度:±3%RH,可选8/12位分辨率。
SHT11的串行接口为两线串行接口,在传感器读取及电源损耗方面均做了优化,它与I2C类似,但与I2C接口不兼容。
SHT11内含一个可通断的加热元件,它可将SHT11的自身温度提高5~15℃(9~27℉),在测量环境的湿度>95%RH时,打开加热元件可防止SHT11结露,同时缩短了测量时间,但在打开加热元件后,测量的温度值略有升高,相对湿度值略有下降。因此在高精度测量时,在打开加热元件后,应对测量的温湿度值进行补偿。
SHT11的测量过程如下:
1.      SHT11发送 “启动传输”命令,通知SHT11启动一次测量;
2.      SHT11发送 “温度测量”命令(0x03)或“湿度测量”命令(0x05),通知SHT11启动相应的测量,根据测量精度的不同,所用的测量时间也不尽相同。当测量位数为8位、12位、14位时,所需的测量时间大约为20ms80ms320ms。当SHT11测量结束后,会将串行总线的DATA线拉至低电平并进入空闲状态以通知MCU测量结束,可以读取当前的测量结果。
3. SHT11发送 “读取寄存器”命令(0x07),读取相应的测量结果。测量结果传输格式为:两个字节的测量数据和一个字节的CRC-8校验。测量数据的格式为MSB在前,右值有效。用CRC-8数据的确认位表示通讯结束。当不需要CRC-8校验数据时,可在接收完测量数据的LSB位后,保持确认位ACK为高来终止通讯。
4. 当与SHT11通讯中断后,通过发送复位序列来复位串口,但SHT11状态寄存器内容仍保持不变。复位序列为:DATA保持为高,触发SCK时钟9次或更多。在下次通讯前在发送“启动传输”命令即可。
SHT11在测量通讯结束后,会自动转为休眠状态。同时为了减小SHT11工作时发热对测量结果的影响,建议每秒测量次数不超过两次为宜。
SHT11进行温湿度测量的源代码如下:
 
 
/**************************
函数功能:SHT11启动时序
***************************/
void SHT11_Start()
{
    SHT11_SCK|=1;
    SHT11_DATA|=2;
    Delay_5us();
    SHT11_DATA&=0xfd;
    Delay_5us();
    SHT11_SCK&=0xfe;
    Delay_5us();
    SHT11_SCK|=1;
    Delay_5us();
    SHT11_DATA|=2;
}
 
/******************************
函数名称:SHT11_Sendbyte(uchar dat)
函数功能: SHT11发送8bite数据
******************************/
void SHT11_Sendbyte(uchar dat)
{
    uchar i;
 
    SHT11_SCK&=0xfe;
    Delay_5us();
    for(i=0;i<8;i++)
    {
       if(dat&0x80)
       {
           SHT11_DATA|=1;
           Delay_5us();
       }
       else
       {
           SHT11_DATA&=0xfd;
           Delay_5us();
       }
       dat=dat<<1;
       SHT11_SCK|=1;
       Delay_5us();
       SHT11_SCK&=0xfe;
    }
}
/*********************************
函数名称SHT11_Answer()
函数功能:检测SHT11的响应信号(在第九个时钟周期)
***********************************/
void SHT11_Answer()
{
    SHT11_SCK|=1;
    Delay_5us();
    while(SHT11_DATA==1);
    SHT11_SCK&=0xfe;
    SHT11_DATA|=2;
}
 
/************************************
函数名称:SHT11_Test_Finish()
函数功能:检测SHT11温湿度检测是否完毕
*************************************/
void SHT11_Test_Finish()
{
    while(SHT11_DATA==1);
}
 
/************************************
函数名称:SHT11_Receivebyte()
函数功能:SHT11接收8bite数据
*************************************/
uchar SHT11_Receivebyte()
{
    uchar i;
    uchar dat;
 
    SHT11_SCK&=0xfe;
    Delay_5us();
    for(i=0;i<8;i++)
    {
       SHT11_SCK|=1;
       Delay_5us();
       dat=dat<<1;
       if(SHT11_DATA&0x2)
       {
           dat=dat|0x01;
           Delay_5us();
       }
       else
       {
           dat=dat&0xfe;
           Delay_5us();
       }
        SHT11_SCK&=0xfe;
       Delay_5us();
    }
    SHT11_DATA|=1; //释放数据总线
    return(dat);
}
 
/***********************************
函数名称:MCU_Answer()
函数功能:单片机向SHT11发送应答信号
*************************************/
void MCU_Answer()
{
    SHT11_SCK&=0xfe;
    Delay_5us();
    SHT11_DATA&=0xfd;
    Delay_5us();
    SHT11_SCK|=1;
    Delay_5us();
    SHT11_SCK&=0xfe;
    Delay_5us();
    SHT11_DATA|=2; //释放数据总线 这条指令非常重要 不加的话导致单片机不能读取低8
}
/***********************************
函数名称:SHT11_End()
当接收两个8byte数据后部接收CRC校验码
************************************/
void SHT11_End()
{
    SHT11_DATA|=2;
    SHT11_SCK|=1;
    Delay_5us();
    SHT11_SCK&=0xfe;
    Delay_5us();
}
 
/*************************************
函数名称:void SHT11_Write_Register(uchar command ,uchar dat)
函数说明:向SHT11的状态寄存器设置功能
           commandREG_WRITE 0x06写寄存器
           dat 设置SHT11的功能 可以设置检测的数据位数
***************************************/
 
void SHT11_Write_Register(uchar command ,uchar dat)
{
    SHT11_Start();
    SHT11_Sendbyte(command);
    SHT11_Answer();
    SHT11_Sendbyte(dat);
    SHT11_Answer();
}
 
 
/***************************************
函数名称:uchar SHT11_Read_Register(uchar command)
函数说明:commandREG_READ  0x07//读寄存器
           返回值为状态寄存器的值
        6显示当前检测完一次数据后电源供电情况
           当位60时表明VDD>2.47V 当位61时表明VDD<2.47V即电量不足
        0表明当前的测量分辨率
        当位01时表明测量精度:8/湿度 12位温度
        当位00时表明测量精度:12位湿度 14位温度
        默认为0
*******************************************/
uchar SHT11_Read_Register(uchar command)
{
    uchar dat;
 
    SHT11_Start();
    SHT11_Sendbyte(command);
    SHT11_Answer();
    dat=SHT11_Receivebyte();
    SHT11_End();
    return(dat);
}
 
 
/***************************************
函数名称:SHT11_Measure(uchar command,uint time);
函数功能:设置SHT11检测功能,并返回相应的检测结果
函数说明:command形参用于设定温度检测还是湿度检测,
time形参用于设定检测过程中的等待时间,以确定检测结果的位数
11ms/55ms/210ms 分别对应8/12/14
****************************************/
uint SHT11_Measure(uchar command,uint time)
{
    uint dat=0;
    uchar data_high,data_low;
 
    SHT11_Start();
    SHT11_Sendbyte(command);
    SHT11_Answer();
    Delay_Ms(time);
    SHT11_Test_Finish();
    data_high=SHT11_Receivebyte();
    MCU_Answer();
    data_low=SHT11_Receivebyte();
    SHT11_End();
    dat=(dat|data_high);
    dat=(dat<<8)|data_low;
    return(dat);
}
/****************************************
函数名称:Convert_Tempeture(uint dat);
函数功能:将检测到的数据转化为相应的温度数据
函数说明:温度转换公式--T=d1+d2*SOt
         公式中的参数d1=-40,d2=0.01
         适用于14位测量精度
*****************************************/
float SHT11_Convert_Tempeture14bit(uint dat)
{
    float tempeture1;
    tempeture1=-40+0.01*dat;
    if(tempeture1>100.0)
    {
       flag_tempeture=1;
    }
    else if(tempeture1<0.0)
    {
       flag_tempeture=1;
    }
    else
    {
       flag_tempeture=0;
    }
    return(tempeture1);
}
 
/*****************************************
函数名称:SHT11_Convert_Humidity(uint dat,float temp)
函数功能:将检测到的数据转化为相应的湿度数据
函数说明:相对湿度转换公式-----RHline=C1+C2*SOrh+C3*SOrh*SOrh(检测数据的线性化 SOrh为单片机接收到的数据)
                      -----RHtrue=(tempeture-25)*(t1+t2*SOrh)+RHline
         公式中的参数:C1=-4,C2=0,0405,C3=-0.0000028
                    t1=0.01,t2=0.00008
           适用于12位测量精度
******************************************/
float SHT11_Convert_Humidity12bit(uint dat,float temp)
{
    float RHline,RHtrue;
    RHline=-4+(0.0405-0.0000028*dat)*dat;
    RHtrue=(temp-25)*(0.01+0.00008*dat)+RHline;
    if(RHtrue<10.0)
    {
       flag_humidity=1;
    }
    else
    {
       flag_humidity=0;
    }
    return(RHtrue);
}
2.2  触摸屏的选型及设计
本温湿度测试仪的人机接口界面采用北京迪文科技有限公司的DMG32240C035_01W型串口显示触摸屏。
HMI接口采用北京迪文科技的3.5“串口触摸屏,型号为DMG32240W35T,它具有视角大、亮度高、使用方便、价格便宜的优点。
迪文科技的串口触摸屏,内部集成了TFT的驱动,将GUI通过串口命令的形式提供给开发人员,其具有的基本功能如下:
点、线、填充等基本绘图功能,支持曲线实时缩放;
内置GBKBIG5等多种字库、字体的多种文本显示方式;
支持数字变量自动换算和指定格式转换;
无需人工干预的触控界面自动转换;
无需人工干预的GBK触摸屏拼音输入法;
内置256M Flash65K真彩显示屏;
支持RTC(支持农历);
可通过SD卡,自动更新图片、字库;
 
这样大大降低了开发人员开发人机界面的开发难度,使开发人员从繁琐的TFT的底层开发中解脱出来,可以专注于人机交互的实现;使开发人员在开发使用过程中仅需要通过串口调用相应的命令,即可完成高质量的人机界面设计,大大提高了开发效率。
由于MSP430G2211IN14/MSP430G2231IN14本身并没有串口,所以只能供通过定时器模拟串口的形式与触摸屏通信。定时器模拟串口程序采用LaunchPad提供的例子程序:“Timer A UART 9600baud”。需要注意的是:DMG32240C035_01W型串口显示触摸屏默认的串口通信波特率是57600bps,而MSP430G2211IN14通过定时器模拟的串口的波特率速率为9600bps,为此需通过迪文公司的PC设置程序将触摸屏默认的串口通信波特率设为9600bps
MSP430G2211IN14控制触摸屏的控制流程如下:

 

 
 
 
 
 
 
 
 
 
 


MSP430G2211IN14触摸屏进行通信控制的源程序如下:
 
 
/****************************************
发送结束帧0xcc0x330xc30x3c
****************************************/
 void HMI_Frame_End(void)
 {
    Uart2_Tx_Byte(0xcc);
    Uart2_Tx_Byte(0x33);
    Uart2_Tx_Byte(0xc3);
    Uart2_Tx_Byte(0x3c);
 }
 
 
/****************************************
HMI握手指令
****************************************/
void   HMI_HandShake(void)
{
    Uart2_Tx_Byte(0xAA);
   Uart2_Tx_Byte(0x00);
   HMI_Frame_End();
}
 
 
 
/****************************************
 设置HMI参数
****************************************/
void   HMI_ParaSet(uchar bode_rate,uchar parameter)
{
   /*CMD_E0[7] = bode_rate;
   CMD_E0[8] = parameter;
   Uart2_Send_Str(CMD_E0);
   */
 
    Uart2_Tx_Byte(0xAA);
    Uart2_Tx_Byte(0xe0);
    Uart2_Tx_Word(0x55aa);
    Uart2_Tx_Word(0x5aa5);
    Uart2_Tx_Byte(0x00);
    Uart2_Tx_Byte(bode_rate);
    Uart2_Tx_Byte(parameter);
    HMI_Frame_End();
}
 
/****************************************
设置文本显示的前景、背景颜色
****************************************/
void HMI_SetTxtColor(uint front,uint back)
{
   Uart2_Tx_Byte(0xAA);
   Uart2_Tx_Byte(0x40);
   Uart2_Tx_Word(front);
   Uart2_Tx_Word(back);
   HMI_Frame_End();
}
 
/****************************************
xy坐标显示str_scale字体的字符串
****************************************/
void HMI_Printfs(uint x,uint y,uchar str_scale,uchar*  str)
{
   Uart2_Tx_Byte(0xAA);
   Uart2_Tx_Byte(str_scale);
   Uart2_Tx_Word(x);
   Uart2_Tx_Word(y);
   while( (*str)!='\0')
   {
    Uart2_Tx_Byte(*str);
     str++;
   }
   HMI_Frame_End();
 
}
 
 
 
/****************************************
强制进行屏幕刷新
****************************************/
/*
void HMI_Reflash(void)
{
   //Uart2_Send_Str (CMD_D0);
 
   Uart2_Tx_Byte(0xAA);
   Uart2_Tx_Byte(0xD0);
   HMI_Frame_End();
}
*/
 
/****************************************
剪切图标显示
pic_id:Flash中图片索引IO
uint xs,ys:剪切区域在原图片左上角坐标
uint xe,ye:剪切区域在原图片右下角角坐标
uint x, y, 剪切区域在当前屏幕显示位置的左上角坐标
uchar cut_style:剪切类型:透明/不透明剪切,自动/不自动恢复背景
****************************************/
void   HMI_CutIcon(uchar pic_id,uint xs,uint ys,uint xe,uint ye,uint x,uint y)
{
    Uart2_Tx_Byte(0xAA);
   Uart2_Tx_Byte(HMI_CUT);
    Uart2_Tx_Byte(pic_id);
   Uart2_Tx_Word(xs);
    Uart2_Tx_Word(ys);
    Uart2_Tx_Word(xe);
    Uart2_Tx_Word(ye);
    Uart2_Tx_Word(x);
    Uart2_Tx_Word(y);
    HMI_Frame_End();
}
 
 
/****************************************
图标旋转显示
pic_id:Flash中图片索引IO
uint xs,ys:剪切区域在原图片左上角坐标
uint xe,ye:剪切区域在原图片右下角角坐标
uint xc, yc:剪切区域在当前屏幕显示位置的左上角坐标
uchar mode:显示模式:透明/不透明剪切
uint angle:   图标旋转角度。0--719,单位:0.5°
uint xc1,yc1:剪切下来的图标在当前拼命显示位置的旋转中心坐标
****************************************/
/*void HMI_IconGyrate(uint pic_id,uint xs,uint ys,uint xe,uint ye,uint xc,uint yc,uchar mode,\
       uint angle,uint xc1,uint yc1)
{
    Uart2_Tx_Byte(0xAA);
    Uart2_Tx_Byte(0x9e);
   Uart2_Tx_Byte(mode);
    Uart2_Tx_Word(pic_id);
   Uart2_Tx_Word(xs);
    Uart2_Tx_Word(ys);
    Uart2_Tx_Word(xe);
    Uart2_Tx_Word(ye);
    Uart2_Tx_Word(xc);
    Uart2_Tx_Word(yc);
    Uart2_Tx_Word(angle);
    Uart2_Tx_Word(xc1);
    Uart2_Tx_Word(yc1);
    HMI_Frame_End();
}
*/
 
/****************************************
picture didplay
****************************************/
void   HMI_PicDisp(uchar pic_id)
{
    Uart2_Tx_Byte(0xAA);
    Uart2_Tx_Byte(0x70);
    Uart2_Tx_Byte(pic_id);
    HMI_Frame_End();
}
 
DMG32240C035_01W型串口显示触摸屏工作时的工作画面如下:
3. 总结
在使用LaunchPad+CCS5.1进行开发的过程中感觉,CCS5.1 for MSP430的开发环境较好,上手较快,编译器生产的代码紧凑,调试方便。
 (源程序见附件)
MSP430G2210.rar