Msp430设计报告 数据记录仪Word文档下载推荐.docx
《Msp430设计报告 数据记录仪Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Msp430设计报告 数据记录仪Word文档下载推荐.docx(19页珍藏版)》请在冰点文库上搜索。
八段显示组合段码字节组合格式为h、e、f、c、d、g、b、a,顺序为D7-----D0。
显示代码:
0——7BH;
1——12H;
2——4FH;
3——1FH;
4——36H;
5——3DH;
6——7DH;
7——1BH;
8——7FH;
9——3FH;
③FLASH存储器
1、MSP430FLASH共有特点:
1.8~3.6V工作电压,2.7~3.6V编程电压、擦除/编程次数可达100000次、数据保持时间从10年到100年不等、60KB空间编程时间<
5秒、保密熔丝烧断后不可恢复,不可通过JTAG进行访问、FLASH编程/擦除由内部硬件控制,无需软件干预、支持自编程,实现系统升级或记录系统运行数据。
2、MSP430F449FLASH分块:
60KBFLASH(0FFFFh-01100h)
*一般用于存储程序指令
*分为120段,每段512Byte
*每段分8块,每块64Byte
256BInformationFLASH(010FFh-01000h)
*一般用于记录用户数据
*分为两段,每段128Byte
*每段分1块,每块64Byte
Segment0~n可独立擦除或一次擦除
SegmentA、B可独立擦除或随Segment0~n擦除
3、MSP430单片机FLASH模块相关寄存器
FCTL1(0128h):
*FxKEY(安全键值):
读取时为96h,写入时为5Ah
*BLKWRT(段编程位):
设1为段写入,设0不使用段写入
*WRT(编程位):
设1编程,设0不编程,强制编程使ACCVIFG置位
*MERAS(主内存擦除位):
设1主存全擦除,设0不擦除
*ERASE(擦除位):
设1擦除一段,设0不擦除
FCTL2(012Ah)
*FSSELx(时钟选择):
3
(2):
SMCLK;
1:
MCLK;
0:
ACLK
*FNx(分频系数):
不分频率;
N:
N+1次分频
FCTL3(012Ch)
*EMEX(立即停止):
设1:
立即停止FLASH操作,设0:
无作用
*LOCK(锁定位):
FLASH只读,设0:
FLASH可读写
*WAIT(段编程等待标志位):
段编程操作已成功,0:
段编程操作正在进行
*ACCVIFG(非法访问标志位):
1:
有非法访问,0:
无非法访问
*KEYV(安全键值错误标志位):
安全键值有写错(触发PUC)0:
安全键值没有写错
*BUSY(时序控制器忙标志位):
时序控制器正忙,0:
时序控制器不忙
3、各模块简介
①温度数据采集模块
本模块主要由温度传感器组成,主要是进行模拟信号采集。
MSP430内嵌的温度传感器实际上就是一个输出电压随环境温度而变化的温度二极管,表1是它的一些基本电气特性。
按照TI公司提供的资料,这个温度二极管输出的电压和对应的温度近似成简单的线性关系。
所测温度可由的公式
(1)求出:
(1)
其中,T:
测量到温度,单位℃;
VST:
ADC模块的通道10测量到的电压,单位mV;
V0℃:
0℃时传感器的输出的电压,单位mV;
TCSENSOR:
传感器的传感电压,即输出电压随温度的变化情况,单位mV/℃。
数值上等于温度每升高1℃,增加的输出电压。
对于12位的ADC模块,VST可以通过下面的A/D转换公式求得:
(2)
其中,ADC12CH10:
通道10所测得的温度传感器的12位A/D值;
VR+:
正参考电压,可以取内部参考VREF+、AVcc或者外部参考VeREF+,单位mV;
VR-:
负参考电压,单位mV。
通常取VR-=AVss,在这种情况下,求VST的公式进一步简化为:
(3)
由
(1)式和(3)式可见,把A/D转换所得的结果VST经过简单转换就可得到对应的温度。
参数
测试条件
最小值
典型值
最大值
单位
V0℃
Vcc=2.2V/3V
986-5%
986
986+5%
mV
TCSENSOR
Vcc=2.2V/3V,TA=0℃
3.55-3%
3.55
3.55+3%
mV/℃
tSENSOR
30
μs
表1:
MSP430微控制器温度传感器电气特性表
②键盘模块
本模块主要完成键盘输入任务,键盘输入采样初始时间数据,用于记录各采样时间点。
键盘的每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。
矩阵的行线和列线分别通过两并行接口和CPU通信。
键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。
键盘处理程序的任务是:
确定有无键按下,判断哪一个键按下,键的功能是什么,还要消除按键在闭合或断开时的抖动。
两个并行口中,一个输出扫描码,使按键逐行动态接地;
另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件,查出该键的功能。
键盘的8个口分别与430单片机的P1和P2口的第四位相连,且P1口输入,P2口输出,二者结合,采用行扫描法确定按键。
③LCD显示模块
本模块主要用于显示温度的数值(这里温度的值为摄氏温度值)。
由ADC12模块读取的摄氏温度写入到预置的LCD_buf中,将其转为BCD数之后通过TABLE转换为LCD显示代码进行显示。
这里LCD显示器用段码LCD显示器型号为LSD048,它的一些性能参数可参看上面的LCD介绍。
④存储模块
本模块主要用于存储温度采集数据及输入的初始时间数据,实现数据记录,以方便在在读取时给出温度数据及相应的采样时间。
存储采用FLASH存储器,其具有掉电后数据不丢失、数据存储速度快、电可擦除、容量大、在线可编程、性价比高等优点,因此被广泛应用于单片机系统中,它的一些基本的寄存器操作可参看上面的FLASH存储器简介。
⑤电源复位模块
本模块主要通过对单片机系统断电及上电操作实现复位。
⑥MSP430模块
本模块是整个系统的核心部分,各模块通过此模块联系在一起,它主要任务是响应各种操作,对资源进行合理分配,通过合理调用各种资源完成任务。
三、系统实现
1、硬件设计
由于温度传感器可用MSP430内嵌的温度传感器,键盘,LCD显示器,FLASH存储器都集成在试验箱的板子上,因此本实验不用进行其他的硬件连接,直接使用板子上的硬件资源就可以满足要求。
2、软件设计
本设计的软件部分由多个模块组成:
主程序、ADC转换程序、LCD显示程序、键盘输入程序、FLASH存储程序、数据读取程序。
下面将对这些模块的功能一一讲解。
主程序:
主程序首先调用一些子程序来完成单片机初始化、显示器初始化、FLASH存储器初始化、ADC转换初始化,然后打开中断,最后进入休眠状态,等待中断,中断后执行中断函数,对温度数据进行处理。
主函数是软件设计的主体,通过主函数的运行实现系统的功能要求。
ADC转换程序:
由voidinit_ADC12(void)、voidstart_ADC12()、voidformat_Data()及中断函数组成,voidinit_ADC12(void)是ADC初始化函数,voidstart_ADC12()是启动ADC转换函数,voidformat_Data()是把ADC转换的温度值转换为摄氏温度值,并存入到LCD的lcd_Buf,以方便LCD显示。
具体来说此模块的功能是采集模拟温度值,再进行模数转换,再把温度值表示出来。
LCD显示程序:
由voidinit_LCD(void)、voidlcd_Display()和voidlcd_SetRP()函数组成,voidinit_LCD(void)为LCD初始化函数,用于初始化LCD,voidlcd_Display()是数据显示函数,用于显示lcd_Buf中的数据,voidlcd_SetRP()是小数点设置函数,用于设置小数点的位置。
此模块的功能是显示放入lcd_Buf中的数据的十进制值。
键盘输入程序:
该子程序实现了从键盘输入时间数据,并用FLASH存储器记录该时间数据,以便温度数据读出时知道各点的采样时刻。
FLASH存储程序:
这段子程序主要实现初始化FLASH存储器,设置存储器的初始地址,并把温度数据依次存入到FLASH存储器中。
数据读取程序:
该子程序的功能是从FLASH存储器中读取存入的采样数据,并用LCD把数据用十进制数显示出来。
四、系统测试
1、测试方法
在硬件设计及软件编译通过的基础上,把软件程序代码拷到单片机板子上,运行程序,单步执行程序,测试系统是否能对温度数据进行采集、转换、显示、存储及读取,若都能完成,则系统满足设计的要求,实验成功,若一些功能不能满足,则对硬件或软件进行合理调整,直到满足设计要求。
实验中由于采样时间间隔较短,可以在不同环境下进行采样,获得相差较大的采样值。
2、问题分析
在系统测试过程中,出现各种错误是很正常的,如编译通不过,板子没有反应,出现错误数据,不能达到设计要求。
出现这些问题时,应该在熟悉设计原理和板子接口图的基础上,对程序进行分步分析,明白它们的执行过程及产生结果,然后对照实际结果进行分析,找出原因。
在实验中,小问题是经常被忽略的,如程序编译的语法,程序书写格式,这些都应该引起我们的重视。
五、工程代码
/***************************************************
*文件名称:
*main.c
*文件说明:
*对MSP430片内温度传感器进行采样,输出温度到LCD
*程序使用单通道单次转换,温度显示的格式是华氏温度,
*带两位小数并将温度数据存入FLASH存储器中,进行读取。
***************************************************/
#defineMSP430F449_H0
#include<
msp430x44x.h>
#include"
flash.c"
#include"
adc12.c"
voidmain(void)
{
unsignedinttmpv;
char*s;
unsignedinta;
WDTCTL=WDTHOLD+WDTPW;
//停止看门狗
init_LCD();
//初始化LCD
init_ADC12();
//初始化ADC12
init_Flash(void);
//Flash初始化
_EINT();
//使能中断
while(a=0;
a<
8;
a++)
{
start_ADC12();
//启动ADC12
while(adc_Flag==0);
//等待转换完称
lcd_Display();
//显示数据到LCD
lcd_SetRP();
//显示小数点
tmpv=0;
while(tmpv<
0x5ffff)tmpv++;
//延时
}
s=(char*)0x1000;
while(a=0,a<
8,a++)//显示采集的数据
read_Flash(s,lcd_Buf,int,8);
lcd_Display();
}
/*************************************************************
adc12.c
adc12操作
*
*************************************************************/
#ifndefMSP430F449_H
#endif
#ifndefLCD_IN_USE
lcd.c"
#defineREFVOL2.5//vcc参考设为2.5
unsignedcharadc_Flag;
char*p=0x1000;
/************************************************************
*初始化ADC12
************************************************************/
voidinit_ADC12(void)
ADC12CTL0=ADC12ON+REFON+REF2_5V+SHT0_6;
//设置ADC12的内部参考电压2.5伏
ADC12CTL1=SHP;
//设置使用采样时钟
ADC12MCTL0=INCH_10+SREF_1;
//选择通道A10,即片内温度传感器输出
ADC12IE|=0x01;
//使能中断
ADC12CTL0|=ENC;
//使能转换
/***********************************************************
*启动ADC12
voidstart_ADC12()
ADC12CTL0|=ADC12SC;
adc_Flag=0;
*把数据编程要显示的格式,然后写到lcd_Buf中去
***********************************************************/
voidformat_Data()
intresult;
unsignedchartmp;
result=ADC12MEM0;
result=(int)(((REFVOL*result)/4096-0.986)/0.0000355);
//得到对应的温度值*10,以包括小数两位
for(tmp=0;
tmp<
7;
tmp++)
lcd_Buf[tmp]=result%10;
//把结果转换成十进制,并存放在LCD缓冲区中
result=result/10;
//
erase_Flash(p);
write_Flash(p,lcd_Buf,8);
//数据存入Flash中
*中断向量
#pragmavector=ADC_VECTOR
__interruptvoidADC_Interrupt(void)
format_Data();
//格式化数据并显示到LCD
adc_Flag=1;
//指示有数据要显示
/*****************************************************
*
lcd.c
LCD模块
*****************************************************/
#defineLCD_IN_USE8
#defineRADIX_POINT0x08
/******************************************************
数据定义
constunsignedcharNUM_LCD[16]={
0x7B,0x12,0x4f,0x1f,0x36,//'
0'
~'
4'
0x3d,0x7d,0x13,0x7f,0x3f,//'
5'
~'
9'
0x73,0x7c,0x69,0x5e,0x6f,//'
6'
E'
0x65};
//F"
unsignedcharlcd_Buf[LCD_IN_USE];
//自定义显示缓冲区,用于
//外部设定要显示的数据
/*******************************************************
*模块初始化
*******************************************************/
voidinit_LCD(void)
chartmpv;
BTCTL|=0x10;
//setLCD时钟
P3DIR=0xff;
//输出模式
P5SEL=0xfc;
//置为外围模块
LCDCTL=LCDON+LCD4MUX+LCDP1;
//4Mux模式
for(tmpv=0;
tmpv<
tmpv++)
LCDMEM[tmpv]=0x00;
//clearLCD
LCDMEM[7]=0x02;
//设置LCDMEM[7]
/****************************************************
*更新LCD缓冲区的内容,把数据显示到LCD
****************************************************/
voidlcd_Display()
{
for(tmpv=0;
LCD_IN_USE-1;
{
LCDMEM[tmpv]=NUM_LCD[lcd_Buf[tmpv]];
//更新LCDMEM中的内容
*设置小数点
voidlcd_SetRP()
LCDMEM[2]|=0x80;
//显示小数点
/**************************************************************
*文件名:
*flash.c
*对MSP430自带Flash进行操作
***************************************************************/
#defineFLASH_C0
#endif
*初始化Flash
**************************************************************/
voidinit_Flash(void)
FCTL2=FWKEY+FSSEL0+FN0;
//设置时钟频率为ACLK
*读Flash
*输入参数说明:
*addr:
读地址
*length:
要读取的字节数
*readBuf:
用以存储读取内容的缓存区地址
***************************************************************/
voidread_Flash(char*addr,char*readBuf,intlength)
unsignedintcnt;
while((FCTL3&
0x01)==0x0001);
//等待flash空闲
for(cnt=0;
cnt<
len;
cnt++)