单片机及通信接口实验报告.docx
《单片机及通信接口实验报告.docx》由会员分享,可在线阅读,更多相关《单片机及通信接口实验报告.docx(33页珍藏版)》请在冰豆网上搜索。
单片机及通信接口实验报告
单片机及通信接口实验报告
通信09-3班
实验二MSP430基本时钟模块及低功耗结构
一、实验目的
掌握MSP430单片机基本时钟模块的原理及使用方法
二、实验原理
3.1MSP430X1XX系列时钟模块
从图中可以看出,它有3个时钟输入源:
(1)LFXT1CLK由低频时钟晶体产生的低频时钟源,由标准高频晶体或陶瓷谐振器产生的高频时钟源以及外接时钟信号源。
(2)XT2CLK由标准晶体或陶瓷谐振器产生,外接450KHz~8MHz时钟信号源。
(3)DCOCLK片内可以数字控制的RC振荡器。
基础时钟模块可以提供3种时钟信号:
(1)ACLK(辅助时钟)ACLK是LFXT1CLK信号经1,2,4,8分频后得到的。
分频系数可选,有参数DIVA控制。
ALCK可由软件选作各个外围模块的时钟信号。
(2)MCLK(系统主时钟)MCLK可由软件选择来自LFXT1CLK,XT2CLK,DCOCLK三者之一,然后经1,2,4,8分频得到。
分频系数由DIVM控制。
MCLK主要用
于CPU和系统。
(3)SMLK(子系统时钟)可由软件选择来自LFXT1CLK,XT2CLK,DCOCLK三者之一,然后经1,2,4,8分频得到。
分频系数由DIVS控制。
MCLK主要用于各外围模块。
3.2低速晶体振荡器
低速晶体振荡器在MSP430FLASH系列的每一个器件中都能找到。
一般是指
32768Hz的时钟晶体,同时将所需两个小电容也集成在内部。
这样可降低系统成本,同时降低系统功耗。
LFXT1振荡器在发生有效的PUC后开始工作,一次有效的PUC信号可以将SR寄存器(状态寄存器)的OscOff位复位,即允许LFXT1作。
LFXT1CLK信号没有用作SMCLK或MCLK信号,则可以用软件将OscOff位置以禁止LFXT1工作。
LFXT1的结构如下图所示:
F1XX系列的LFXT1振荡器
当使用32768Hz的晶体时只须连到相应的引脚,两个小电容已经集成在芯片内部。
应注意:
这时LFXT1工作在低频模式,XTS位应复位。
同时LFXT1振荡器也可以外接频率较高的高速晶体振荡器或陶瓷振荡器,以工作在高速模式;这时XTS位置位,同时两个引脚还要外接电容,电容大小根据晶体或振荡器的特性来选择。
3.3高速晶体振荡器
高速振荡器主要存在于F13X,F14X,F4XX等器件,一般称之为第二振荡器XT2,它产生时钟信号XT2CLK,它的工作特性与LFXT1振荡器工作在高频模式是类似。
下图是TX2振荡器的控制逻辑。
如果XT2CLK信号没用做MCLK、SMCLK时钟信号,则可以用XT2Off控制位关闭XT2;如果CPUOff=0,SELM=2,则XT2CLK用做MCLK时钟;如果SCG1=0且SELS=1,XT2CLK用做SMCLK时钟。
3.4DCO振荡器
XT2振荡器的控制逻辑
MSP430FLASH系列的两个外部振荡器产生的时钟信号都可以经1,2,4,8
分频后用作系统主时钟MCLK。
当振荡器失效时,DCO振荡器会自动被选做MCLK的时钟源;上电复位时,不对时钟模块进行任何设置,不加外部振荡器,DCO振荡器也会选做MCLK的时钟源,频率在800K左右。
DCO振荡器实质上是一个可数字控制的RC振荡器。
因为RC振荡器的频率会随着温度和工作电压的变化而变化,所以同一型号芯片产生的频率有所不同。
但同时DCO频率可通过DCO、MOD、Rsel等控制位用软件调节,这又增加了振荡器频率的稳定性。
三、实验设备
名称
指标
数量
微机
1台
JTAG下载器(带并口下载线)
1套
MSP430系统最小板
1个
万用表
1个
工具
1盒
四、实验内容
1用低频晶振产生辅助时钟ACLK并输出,用示波器观察输出波形并记录其波形和频率。
设MCLK=XT1,将ACLK由P2.0输出程序如下:
#include
voidmain(void)
{
unsignedinti;
WDTCTL=WDTPW+WDTHOLD;//停止看门狗
P2DIR|=0X01;//设置P2.0为输出
P2SEL|=0X01;//设置P2.0为MCLK输出
BCSCTL1&=~XTS;//设置XTS为有效低频输出
do{
IFG1&=~OFIFG;//清除振荡器失效标志
for(i=0xFF;i>0;i--);//稳定时间
}
}
2用高速晶体振荡器产生系统时钟MCLK并输出,用示波器观察输出波形并记录其波形和频率。
设MCLK=XT2,将MCLK由5.4输出程序如下:
#include
voidmain(void)
{
unsignedinti;
WDTCTL=WDTPW+WDTHOLD;//停止看门狗
P5DIR|=0X10;//设置P5.4为输出
P5SEL|=0X10;//设置P5.4为MCLK输出
BCSCTL1&=~XT2OFF;//设置XT2为有效
do{
IFG1&=~OFIFG;//清除振荡器失效标志
for(i=0xFF;i>0;i--);//稳定时间
}
while((IFG1&OFIFG)!
=0);//如果振荡器失效标志存在则继续循环。
BCSCTL2|=SELM1;//设置MCLK=XT2
for(;;);
}
3用高速晶体振荡器产生子系统时钟SMCLK并输出,用示波器观察输出波形并记录其波形和频率。
设SMCLK=XT2,将MCLK由5.5输出程序如下:
#include
voidmain(void)
{
unsignedinti;
WDTCTL=WDTPW+WDTHOLD;//停止看门狗
P5DIR|=0X11;//设置P5.5为输出
P5SEL|=0X11;//设置P5.5为SMCLK输出
BCSCTL1&=~XT2OFF;//设置XT2为有效
do{
IFG1&=~OFIFG;//清除振荡器失效标志
for(i=0xFF;i>0;i--);//稳定时间
}
while((IFG1&OFIFG)!
=0);//如果振荡器失效标志存在则继续循环。
BCSCTL2|=SELM1;//设置MCLK=XT2
for(;;);
}
4用DCO作为系统时钟MCLK并输出,用示波器观察输出波形并记录其波形和频率。
固定MOD.0~MOD.4为0100,Rsel.0~Rsel.2为010,观察DCO的改变对DCO振荡器产生频率的影响。
并填写下表:
DCO
000
001
010
011
100
101
110
111
频率(kHz)
5用DCO作为系统时钟MCLK并输出,用示波器观察输出波形并记录其波形和频
率。
固定DCO.0~DCO.2为010,Rsel.0~Rsel.2为010,观察MOD的改变对DCO振荡器产生频率的影响。
并填写下表:
MOD
0000
0001
0010
0011
0100
0101
0110
0111
频率(kHz)
MOD
1000
1001
1010
1011
1100
1101
1110
1111
频率(kHz)
6用DCO作为系统时钟MCLK并输出,用示波器观察输出波形并记录其波形和频
率。
固定DCO.0~DCO.2为010,MOD.0~MOD.3为0100,观察Rsel的改变对DCO振荡器产生频率的影响。
并填写下表:
Rsel
000
001
010
011
100
101
110
111
频率(kHz)
实验三MSP430端口和看门狗定时器实验
一、实验目的
1掌握MSP430I/O端口的原理和用法。
2掌握MSP430看门狗定时器的原理和用法。
二、试验原理
3.1、MSP430I/O端口的基本原理
1.端口P1和P2这些端口都具有中断能力,且每个端口的八个引脚共用一个中断向量。
P1DIR,P2DIRP1和P2端口输入/输出方向寄存器
P1IN,P2INP1和P2端口输入寄存器P1DIR,P2DIRP1和P2端口输出寄存器P1OUT,P2OUTP1和P2端口中断使能寄存器P1IES,P2IESP1和P2端口中断触发沿选择寄存器P1IFG,P2IFGP1和P2端口中断标志寄存器
P1SEL,P2SELP1和P2端口功能选择寄存器
2端口P3,P4,P5和P6
这些端口没有中断能力,其余功能与P1和P2一样,能实现输入/输出功能和外围模块功能。
每个端口有4个寄存器供用户使用。
用户可通过这4个寄存器对他们进行访问和控制。
PnDIRPn端口输入/输出方向寄存器PnINPn端口输入寄存器
PnOUTPn端口输出寄存器PnSELPn端口功能选择寄存器
3.2、MSP430看门狗定时器的基本原理
主要功能是:
当程序发生故障时能使受控系统重新启动。
如果WDT超过所规定的时间,即发生系统复位。
如果系统不需要看门狗功能,也可将他当定时器使用,当到达WDT所定时的时间定时器模式将产生中断请求时,能产生中断.
(1)看门狗模式
可通过WDTCTL寄存器中的TMSEL控制位设置TMLEL=1,工作在看门狗模式。
看门狗的原理:
看门狗定时器设置一定时时间,此时间是所有用户程序执行
完该程序的一个时间,设置好定时时间之后,所有用户程序必须在该时间内将看门狗计数器的值清零,使计数器重新计数;如果CPU执行程序正确,则看门狗计数器时钟能在规定的时间内被用户程序清零;而当CPU执行程序跑飞(PC值指
向用户程序之外),看门狗计数器得不到清零,发生溢出,导致CPU复位,CPU又会重新运行用户程序。
所以,使用时,以防止超过设定的定时时间,用户软件必须周期性地在WDTCTL的CNTCL位写1,使得看门狗计数器复位。
(2)定时器模式
设置TMSEL=1,WDT工作在定时器模式。
定时时间可用软件对WDTTCL寄存器的CNTCL置位进行初始化,WDT将按设定的周期产生中断请求,中断请求得到服务后,中断标志将自动清除。
(3)关闭看门狗模式
当系统不需要WDT时,设置HOLD=1,可关闭WDT,这时看门狗计数器停止工作,可节省功耗。
三、实验设备
名称
指标
数量
微机
1台
JTAG下载器(带并口下载线)
1套
MSP430系统最小板
1个
万用表
1个
工具
1盒
四、试验内容
1利用P3.1产生方波,并用P1.7接收P3.1产生的方波来产生中断。
中断内容为使P3.3闪烁
#include
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;
P3OUT=0x00;//P3引脚低电平
P3DIR|=0xff;//P3方向输出
P1OUT=0x00;
P1IES|=0x00;//上升沿触发
P1IFG=0x00;//因为P1IES设置会使中断标志置位,故清零。
P1IE|=0xff;//P1模块中断允许
_EINT();//系统中断允许
inti;
for(;;)
{
for(i=1;i<=32000;i++);
P3OUT^=0x02;//P3.1每隔8000个机器指令周期产生一次跳变
}
#pragmavector=PORT1_VECTOR
__interruptvoidP1_Interrupt(void)
{
if(P1IFG==0x80)//如果P1.7中断
{P1IFG=0x00;//中断标志清除
P3OUT^=0x08;}//P3.3输出变化
elseP1IFG=0x00;//非p1.7中断处理
}
2利用看门狗的定时器功能产生一方波,周期为0.5S,占空比为1:
1。
#include
Unsignedcharcount=0;
voidmain(void)
{
WDTCTL=WDT_MDLY_0_5;
IE1|=WDTIE;
P1DIR|=0x01;
_EINT();
for(;;)
{
_BIS_SR(CPUOff);
_NOP();
}
}
#pragmavector=WDT_VECTOR
__interruptvoidwatchdog_timer(void)
{
count++;
if(count==500)
{
P1OUT^=0x01;
count=0;
}
}
3利用看门狗的看门狗功能产生一方波。
分别使用ACLK和SMCLK作为看门狗的时钟。
#include
Unsignedcharcount=0;
voidmain(void)
{
WDTCTL=WDT_MRST_0_5;
IE1|=WDTIE;
P1DIR|=0x01;
_EINT();
for(;;)
{
_BIS_SR(CPUOff);
_NOP();
}
}
#pragmavector=WDT_VECTOR
__interruptvoidwatchdog_timer(void)
{
MOV#WDTPW+WDTHOLD,&WDTCTL//喂狗
count++;
if(count==500)
{
P1OUT^=0x01;
count=0;
}
}
实验四MSP43016位定时器A实验
一、实验目的
1掌握定时器A的定时器功能及4种工作模式
2掌握定时器A的捕获/比较模块功能
3掌握定时器A的输出单元和8种输出模式
二、实验原理
结构原理图4.1中,可以将Timer_A分解成:
计数器、捕获/比较寄存器及输出单元。
其中,计数器部分完成时钟源的选择与分频、模式控制及计数等功能;捕获/比较寄存器用于捕获事件发生或产生的时间间隔;输出单元用于产生用户需要的输出信号。
1Timer_A的寄存器
图4.1Timer_A的结构原理图
(1)TACTL控制寄存器
TACTL寄存器中含有全部的Timer_A控制位。
该寄存器在POR信号后全部复位,但在PUC信号后不受影响。
该寄存器众各位的定义如下:
15~10
9
8
7
6
5
4
3
2
1
0
未用
SSEL1
SSEL0
ID1
ID0
MC1
MC0
未用
CLR
TAIE
TAIFG
(2)TAR16位计数器内容
执行计数的单元,是计数器的主体。
可读可写,但要注意:
当计数时钟不是MCLK时,写入应该在计数器停止时写,因为它与CPU时钟不同步。
(3)CCTLX捕获/比较寄存器
X为捕获/比较模块序号,在寄存器中各位名称中的X也一样。
该寄存器在
POR信号后全部复位,但在PUC信号后不受影响。
该寄存器的各位定义如下:
1514
1312
11
10
9
8
765
4
3
2
1
0
CAPTMOD1~0
CCIS1~0
SCS
SCCI
CAP
OUTMODX
CCIEX
CCIX
OUT
COV
CCIFGX
(4)CCRX捕获/比较寄存器
在捕获/比较寄存器模块中,可读可写。
在捕获方式时,硬件自动将计数器TAR中的数据写入该寄存器。
在比较方式时,用户程序根据需要定时时间长短,配合定时器工作方式及定时器输入信号,写入该寄存器相应的数据。
(5)TAIV中断向量寄存器该寄存器用于确定中断请求的中断源。
各位定义如下:
15…5
4…1
0
0…0
中断向量
0
2定时器模式
Timer_A共有4种工作模式,由控制寄存器TACTL中MC0和MC1两位决定。
(1)停止模式
(2)增计数模式
(3)连续计数模式
(4)增/减计数模式
3捕获比较模块
用CCTLX中的CAPX选择捕获模式或比较模式,用CCMX1和CCMX0选择捕获条件。
捕获/比较模块的结构如图4.13所示。
图4.13捕获/比较模块的逻辑结构
(1)捕获模式
(2)比较模式
4输出单元每个捕获/比较模块都包含一个输出单元,用于产生输出信号。
每个输出单
元有8种工作模式,可产生基于EQUX的多种信号。
所有的输出模式如下:
输出模式0输出模式。
输出模式1置位模式。
输出模式2PWM翻转/复位模式。
输出模式3PWM置位/复位模式。
输出模式4翻转模式。
输出模式5复位模式。
输出模式6PWM翻转/复位模式。
输出模式7PWM复位/置位模式。
三、实验设备
名称
指标
数量
微机
1台
JTAG下载器(带并口下载线)
1套
MSP430系统最小板
1个
万用表
1个
工具
1盒
330欧姆电阻
DIP
若干
细导线
若干
四、试验内容
1用增计数模式产生一个周期为0.5S的方波
#include
Unsignedcharcount=0;
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//停止看门狗
P3DIR|=0x06;//P3.1设置为输出
CCTL0=CCIE;//CCR0中断允许
CCR0=20000;
TACTL=TASSEL_2+TACLR+MC_1;//定时器A时钟源为SMCLK,计数器清零,增计数模式
_BIS_SR(LPM0_bits+GIE);//EnterLPM0w/interrupt
}
#pragmavector=TIMERA0_VECTOR
__interruptvoidTimer_A(void)
{count++;
If(count==10){
P3OUT^=0x02;//P3.1取反
count=0;
}
}
2用连续计数模式同时产生两个周期分别为0.1S和1S的方波。
#include
unsignedintcount=0;
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//停止看门狗
P3DIR|=0x06;//P3.1、P3.2设置为输出。
CCTL0=CCIE;//CCR0中断允许
CCR0=40000;
TACTL=TASSEL_2+TACLR+MC_2+TAIE;//定时器A时钟源为SMCLK,计数器清零,连续计数模式,溢出中断允许。
_BIS_SR(LPM3_bits+GIE);
}
#pragmavector=TIMERA0_VECTOR
__interruptvoidTimer_A(void)
{
P3OUT^=0x02;//P3.1取反
}
#pragmavector=TIMERA1_VECTOR
__interruptvoidTimer_A(void)
{
switch(TAIV)
{
case2:
break;
case4:
break;
case10:
count++;
if(count==6)
{count=0;
P3OUT^=0x04;//P3.2取反
}
break;
}
3用增减计数模式产生一个周期为0.5S的对称方波。
#include
unsignedintcount=5;
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//停止看门狗
P3DIR|=0x06;//P3.1、P3.2设置为输出。
CCTL0=CCIE;//CCR0中断允许
CCR0=20000;
TACTL=TASSEL_2+TACLR+MC_3+TAIE;//定时器A时钟源为SMCLK,计数器清零,增减计数模式,溢出中断允许。
_BIS_SR(LPM3_bits+GIE);
}
#pragmavector=TIMERA1_VECTOR
__interruptvoidTimer_A(void)
{
switch(TAIV)
{
case2:
break;
case4:
break;
case10:
count++;
if(count==5){
count=0;
P3OUT^=0x04;//P3.2取反
}
break;
}
}
4使用P3.1产生一个周期小于0.1S的方波,并使用定时器A的捕获功能测量其频率。
#include
unsignedintlastCCR0,lastCCR1
unsignedintj=0;//测得信号周期为j*(1/100K)
unsignedintk=0;//测得信号占空比为:
k/j
unsignedintlastCCR0=0;
unsignedintlastCCR1=0;
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//停止看门狗
TACTL=TASSEL_2+ID_3+MC_2+TACLR;//MCLK,8分频,连续模式,计数器清空
CCTL0=CM_3+CCIS_0+SCS+CAP+CCIE;//上升沿和下降沿均捕获,异步捕获,捕获模式,捕获中断允许
CCTL1=CM_1+CCI