【MSP430 LaunchPad设计心得】+温湿度测试仪
1. MSP-EXP430G2 LaunchPad简介
MSP-EXP430G2 LaunchPad 是一款易于使用且价格低廉的闪存编程器和调试工具,它提供了在 MSP430 超值系列器件上进行开发所需的一切内容。它提供了具有集成仿真功能的 14/20 引脚 DIP 插座目标板,可通过 Spy Bi-Wire(2 线 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 电缆。
- 附带的 MSP430G2211IN14和MSP430G2231IN14器件特性如下:
· MSP430G2211IN14内置2kB闪存、128B RAM、10 GPIO、1个16位定时器、WDT、BOR、Comparator A+模块;
· MSP430G2231IN14内置2kB 闪存、128B RAM、10 GPIO、1个16位定时器、WDT、BOR、1 个 USI (I2C/SPI) 以及 8 通道 10 位 ADC 。
· 附带的 MSP430G2231IN14器件采用预加载的样本程序。 - 现已推出可供免费下载的 IAR Kickstart 和 Code Composer Studio 版本 5.1 集成开发环境,它们包含汇编器、连接器、仿真器、源码级调试器和 C编译器。
- 符合 RoHS
打开包装后,内部包装如下:
通过USB电缆将其连接至PC后,MSP-EXP430G2
LaunchPad工作画面如下:
2. 基于MSP-EXP430G2 LaunchPad的温湿度控制仪
好了,现在开始基于MSP-EXP430G2 LaunchPad的可视化温湿度控制仪的设计。
2.1 温湿度传感器的选型及设计
温湿度传感器选用瑞士Sensirion公司的SHT11,SHT11是一款含有已校准数字输出的单芯片温湿度传感器。它采用先进的工业CMOS过程微加工技术,确保产品具有极高的可靠性及卓越的长期稳定性。它内部包含一个电容式聚合体测湿元件和一个能隙式测湿元件,并与一个14位ADC转换器和一个串行接口电路在同一芯片上实现无缝连接。每个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位时,所需的测量时间大约为20ms、80ms、320ms。当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的状态寄存器设置功能
command为REG_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)
函数说明:command为REG_READ 0x07//读寄存器
返回值为状态寄存器的值
位6显示当前检测完一次数据后电源供电情况
当位6为0时表明VDD>2.47V 当位6为1时表明VDD<2.47V即电量不足
位0表明当前的测量分辨率
当位0为1时表明测量精度:8位/湿度 12位温度
当位0为0时表明测量精度: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通过串口命令的形式提供给开发人员,其具有的基本功能如下:
点、线、填充等基本绘图功能,支持曲线实时缩放;
内置GBK、BIG5等多种字库、字体的多种文本显示方式;
支持数字变量自动换算和指定格式转换;
无需人工干预的触控界面自动转换;
无需人工干预的GBK触摸屏拼音输入法;
内置256M Flash,65K真彩显示屏;
支持RTC(支持农历);
可通过SD卡,自动更新图片、字库;
这样大大降低了开发人员开发人机界面的开发难度,使开发人员从繁琐的TFT的底层开发中解脱出来,可以专注于人机交互的实现;使开发人员在开发使用过程中仅需要通过串口调用相应的命令,即可完成高质量的人机界面设计,大大提高了开发效率。
由于MSP430G2211IN14/MSP430G2231IN14本身并没有串口,所以只能供通过定时器模拟串口的形式与触摸屏通信。定时器模拟串口程序采用LaunchPad提供的例子程序:“Timer A UART 9600baud”。需要注意的是:DMG32240C035_01W型串口显示触摸屏默认的串口通信波特率是57600bps,而MSP430G2211IN14通过定时器模拟的串口的波特率速率为9600bps,为此需通过迪文公司的PC设置程序将触摸屏默认的串口通信波特率设为9600bps。
MSP430G2211IN14控制触摸屏的控制流程如下:
![]() |
MSP430G2211IN14与触摸屏进行通信控制的源程序如下:
/****************************************
发送结束帧0xcc、0x33、0xc3、0x3c
****************************************/
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();
}
/****************************************
在x,y坐标显示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的开发环境较好,上手较快,编译器生产的代码紧凑,调试方便。
(源程序见附件)