430上机实验.docx
- 文档编号:9632093
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:61
- 大小:29.02KB
430上机实验.docx
《430上机实验.docx》由会员分享,可在线阅读,更多相关《430上机实验.docx(61页珍藏版)》请在冰豆网上搜索。
430上机实验
//例1:
利用定时器A溢出中断实现定时。
ACLK=32KHZ,MCLK=SMCLK=DCOCLK=800k,定时器A工作在连续计数模式,在P3.1端口输出频率为6Hz的方波
#include
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//停止看门狗
TACTL=TASSEL_2+TACLR+MC_2+TAIE;
//定时器A时钟源为SMCLK,计数器清零,连续计数模式,溢出中断允许。
P3DIR=0x02;//P3.1端口设置为输出
_EINT();
for(;;)
{
_BIS_SR(CPUOFF);
_NOP();
}
}
#pragmavector=TIMERA1_VECTOR
__interruptvoidTIMER_A(void)
{
switch(TAIV)
{
case2:
break;
case4:
break;
case10:
P3OUT^=0x02;//定时器A溢出,P3.1取反
break;
}
}
例2:
定时器A增计数模式举例。
ACLK=32KHZ,MCLK=SMCLK=DCOCLK=800k,定时器A工作在增计数模式,利用CCR0中断在P3.1端口输出20Hz的方波。
#include
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)
{
P3OUT^=0x02;//P3.1取反
}
例3:
定时器A连续计数模式举例。
ACLK=32kHZ,MCLK=SMCLK=DCOCLK=800k,定时器A工作在连续计数模式,利用CCR0中断在P3.1端口输出10Hz的方波,同时利用定时器A溢出中断在P3.2端口输出6Hz的方波。
#include
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//停止看门狗
P3DIR|=0x06;//P3.1、P3.2设置为输出。
CCTL0=CCIE;//CCR0中断允许
CCR0=20000;
TACTL=TASSEL_2+TACLR+MC_2+TAIE;
//定时器A时钟源为SMCLK,计数器清零,连续计数模式,溢出中断允许。
_BIS_SR(LPM0_bits+GIE);
}
#pragmavector=TIMERA0_VECTOR
__interruptvoidTimer_A(void)
{
P3OUT^=0x02;//P3.1取反
CCR0+=20000;//CCR0置入计数值
}
#pragmavector=TIMERA1_VECTOR
__interruptvoidTimer_A1(void)
{
switch(TAIV)
{
case2:
break;
case4:
break;
case10:
P3OUT^=0x04;//P3.2取反
break;
}
}
例4:
定时器A增减计数模式举例。
ACLK=32kHZ,MCLK=SMCLK=DCOCLK=800k,定时器A工作在增减计数模式,
利用CCR0中断在P3.1端口输出20Hz的方波,同时利用定时器A溢出中断在P3.2端口输出40Hz的方波
#include
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(LPM0_bits+GIE);
}
#pragmavector=TIMERA0_VECTOR
__interruptvoidTimer_A(void)
{
P3OUT^=0x02;//P3.1取反
P3OUT^=0X04;
}
#pragmavector=TIMERA1_VECTOR
__interruptvoidTimer_A(void)
{
switch(TAIV)
{
case2:
break;
case4:
break;
case10:
P3OUT^=0x04;//P3.2取反
break;
}
}
例5:
捕获/比较模块之捕获模式举例。
ACLK=32KHZ,MCLK=SMCLK=DCOCLK=800k,经8分频后作为定时器A的时钟源,定时器A工作在连续计数模式。
由软件循环产生方波信号,信号同时接入P1.1(CCI0A)和P1.2(CCI1A),由CCR1获取信号周期,CCR0确定信号占空比
#include
unsignedintlastCCR0,lastCCR1
unsignedintj;//测得信号周期为j*(1/100K)
unsignedintk;//测得信号占空比为:
k/j
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+CCIS_1+SCS+CAP+CCIE;//上升沿,异步,捕获,捕获中断允许
j=0;
k=0;
lastCCR0=0;
lastCCR1=0;
P1DIR=0x00;
P1SEL=0xff;
P3DIR=0xFF;
P3OUT=0x00;
_EINT();
for(;;)
{
for(i=0;i<10000;i++)
_NOP();
P3OUT^=0x02;//产生捕获信号源
}
}
#pragmavector=TIMERA1_VECTOR//定时器中断捕获
__interruptvoidTIMER_A(void)
{
switch(TAIV)
{
case2:
P3OUT^=0x04;
j=CCR1-lastCCR1;//两次上升沿间隔
lastCCR1=CCR1;
break;
case4:
break;
case10:
break;
}
}
#pragmavector=TIMERA0_VECTOR//CCR0捕获产生中断
__interruptvoidTIMER_cc(void)
{
//如果输入信号为低电平,则表明是下降沿产生的捕获,前一次捕获的是上升沿,这一次捕获和上一次捕获之差即为高电平的时间。
if(SCCI0==0)
{
k=CCR0-lastCCR0;//上下升沿间隔
lastCCR0=CCR0;
}
}
例6:
捕获/比较模块之比较模式举例。
ACLK=32KHZ,MCLK=SMCLK=DCOCLK=800k,经8分频后作为定时器A的时钟源。
由捕获/比较模块0产生10Hz的方波并由P3.3输出,由捕获/比较模块1输出20Hz的方波并由P3.2输出
#include
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;
TACTL=TASSEL_2+ID_3+MC_2+TACLR;
//MCLK,8分频,连续模式,计数器清零CCTL0=CCIE;//比较器模式
CCTL1=CCIE;//比较器模式
CCR0=5000;
CCR1=10000;
P3DIR=0xFF;
P3OUT=0x00;
_EINT();
for(;;);
}
#pragmavector=TIMERA1_VECTOR//定时器比较器中断CCR1=TAR
__interruptvoidTIMER_A(void)
{
switch(TAIV)
{
case2:
P3OUT^=0x04;//P3.2
CCR1+=10000;//改变比较条件
break;
case4:
break;
case10:
P3OUT^=0x02;//P3.1
break;
}
}
#pragmavector=TIMERA0_VECTOR//当TAR=CCR0产生中断
__interruptvoidTIMER_cc(void)
{
P3OUT^=0x08;//P3.34.9Hz
CCR0+=20000;//改变比较条件
}
例7:
定时器A输出单元实验。
ACLK=TACLK=LFXT1=32768,利用Timer_A输出周期为512/32768=15.625ms、占空比分别为75%和25%的PWM矩形波
#include
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//停止看门狗
TACTL=TASSEL0+TACLR;//ACLK,清除TAR
CCTL0=0x00;//默认值,比较器模式
CCTL1=0x00;//默认值,比较器模式
CCR0=512-1;//PWM周期
CCTL1=OUTMOD_7;
CCR1=384;//占空比384/512=0.75
CCTL2=OUTMOD_7;
CCR2=128;//占空比128/512=0.25
P1DIR|=0x04;//P1.2输出
P1SEL|=0x04;//P1.2TA1out
P2DIR|=0x01;//P2.0输出?
?
P2SEL|=0x01;//P2.0TA2out
TACTL|=MC0;//Timer_A增计数模式
for(;;)
{
_BIS_SR(LPM0_bits);//进入LPM0
_NOP();
}
}
例:
FLASH模块操作举例?
信息段A、B的擦除和写入操作。
先将内存中double型数组的数据和int型数据保存到信息段A中,在将其从信息段A拷贝到信息段B中
#include
doubledata[8];
intadd;
voidwrite_SegA(void);
voidcopy_A2B(void);
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//停止看门狗
FCTL2=FWKEY+FSSEL0+FN0;//初始化时钟
for(inti=0;i<8;i++)//初始化double型数组数据
{
data[i]=i;
}
add=8;//初始化unsignedint型数据
for(;;);
}
voidwrite_SegA(void)
{
double*Flash_data_ptr;//double型Flash指针
unsignedint*Flash_int_ptr;//unsigned型Flash指针
unsignedinti;
Flash_data_ptr=(double*)0x1080;
FCTL1=FWKEY+ERASE;//允许擦除
FCTL3=FWKEY;//解锁
*Flash_data_ptr=0;//空写,启动擦除
FCTL1=FWKEY+WRT;//允许写
for(i=0;i<8;i++);
*Flash_data_ptr++=data[i];
Flash_int_ptr=(unsignedint*)Flash_data_ptr;
*Flash_int_ptr=add;//写入unsignedint型指针
FCTL1=FWKEY;
FCTL3=FWKEY+LOCK;//锁定
}
voidCopy_A2B(void)
{
double*Flash_data_ptrA,*Flash_data_ptrB;
unsignedint*Flash_int_ptrA,*Flash_int_ptrB,i;
Flash_data_ptrA=(double*)0x1080;
Flash_data_ptrB=(double*)0x1000;
FCTL1=FWKEY+ERASE;//允许擦除
FCTL3=FWKEY;//解锁
*Flash_data_ptrB=0;//空写,启动擦除
FCTL1=FWKEY+WRT;//允许写
for(i=0;i<8;i++)
*Flash_data_ptrB++=*Flash_data_ptrA++;
Flash_int_ptrA=(unsignedint*)Flash_data_ptrA;
Flash_int_ptrB=(unsignedint*)Flash_data_ptrB;
*Flash_int_ptrB=*Flash_int_ptrA;
FCTL1=FWKEY;
FCTL3=FWKEY+LOCK;//锁定
}
例1MSP430F149串口0实验,
实现在接收中断中将收到的字符发送出去,USART模块时钟源为32768Hz的低频时钟ACLK,波特率为2400,8位数据位
#include
voidmain(void)
{
volatileunsignedinti;
WDTCTL=WDTPW+WDTHOLD;//停止看门狗
P3SEL|=0x30;//P3.4,5=USART0TXD/RXD
ME1|=UTXE0+URXE0;//使能USART0TXD/RXD
UCTL0|=CHAR;//8位数据位
UTCTL0|=SSEL0;//UCLK=ACLK
UBR00=0x0D;//32k/2400-13.65
UBR10=0x00;//
UMCTL0=0x6B;//波特率调整
UCTL0&=~SWRST;//初始化USART状态
IE1|=URXIE0;//使能USART0RX中断
_BIS_SR(LPM0_bits+GIE);//进入低功耗模式,开中断
}
#pragmavector=UART0RX_VECTOR//无法进入中断?
?
?
?
__interruptvoidusart0_rx(void)
{
while(!
(IFG1&UTXIFG0));//检测USART0接收缓存是否准备好
TXBUF0=RXBUF0;//RXBUF0→TXBUF0
}
例2MSP430F149串口0实现双向串口通信,
在接收中断接收一个长度为8的字符串,在整个字符串接收完成之后再将其通过串口发送出去。
UCLK0为1M的ACLK,波特率为9600,8位数据位。
#include
staticcharstring1[8];
chari,j=0;
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//停止看门狗
P3SEL=0x30;//P3.3,4=USART0TXD/RXD
ME1|=UTXE0+URXE0;//使能USART0TXD/RXD
UCTL0|=CHAR;//8位数据位,SWRST=1
UTCTL0|=SSEL0;//UCLK=ACLK
UBR00=0x03;//9600from1Mhz
UBR10=0x00;//
UMCTL0=0x4A;//波特率调整
UCTL0&=~SWRST;//初始化USART状态
IE1|=URXIE0+UTXIE0;//使能USART0RX/TX中断
IFG1&=~UTXIFG0;//清除POR造成的UTXIFG0置位
_BIS_SR(LPM0_bits+GIE);//进入低功耗模式,开中断
}
//UART0TXISR
#pragmavector=UART0TX_VECTOR
__interruptvoidusart0_tx(void)
{
if(i TXBUF0=string1[i++]; } //UART0RXISR #pragmavector=UART0RX_VECTOR __interruptvoidusart0_rx(void) { string1[j++]=RXBUF0; if(j>sizeof(string1)-1) { i=0; j=0; TXBUF0=string1[i++]; } } 例1利用比较器A的中断, 实现当输入P2.3的电压高于0.5Vcc时,使P1.2置位,当P2.3的电压低于0.5Vcc时,使P1.2复位。 #include"MSP430x14x.h" voidmain(void) { WDTCTL=WDTPW+WDTHOLD;//停止看门狗 P2SEL|=0x08;//P2.3设置为比较器输入CA1 P1DIR|=0x04;//P1.2设置为输出 P1OUT&=~0x04;//P1.2输出低电平 CACTL1=CARSEL+CAEX+CAREF1+CAON;//0.5Vcc加到正端,打开比较器 CACTL2=P2CA1;//P2.3加到比较器负端。 while (1) { if((CAOUT&CACTL2)<>CAOUT)//检查比较器输出,若为0则P1.2输出高 P1OUT|=0x40;//电平,否则输出低电平 else P1OUT&=~0x80; } } MSP430intrinscis.h /**************************************************/ #ifndef__INTRINSICS_H #define__INTRINSICS_H #ifndef_SYSTEM_BUILD #pragmasystem_include #endif #pragmalanguage=save #pragmalanguage=extended /* *Thereturnvalueof"__get_interrupt_state". */ typedefunsignedshortistate_t; #ifdef__cplusplus extern"C" { #endif __intrinsicvoid__no_operation(void); __intrinsicvoid__enable_interrupt(void); __intrinsicvoid__disable_interrupt(void); __intrinsicistate_t__get_interrupt_state(void); __intrinsicvoid__set_interrupt_state(istate_t); __intrinsicvoid__op_code(unsignedshort); __intrinsicunsignedshort__swap_bytes(unsignedshort); __intrinsicvoid__bic_SR_register(unsignedshort); __intrinsicvoid__bis_SR_register(unsignedshort); __intrinsicunsignedshort__get_SR_register(void); __intrinsicvoid__bic_SR_register_on_exit(unsignedshort); __intrinsicvoid__bis_SR_register_on_exit(unsignedshort); __intrinsicunsignedshort__get_SR_register_on_exit(void); __intrinsicunsignedshort__bcd_add_short(unsignedshort, unsignedshort); __intrinsicunsignedlong__bcd_add_long(unsignedlong, unsignedlong); __intrinsicunsignedlonglong__bcd_add_long_long(unsignedlonglong, unsignedlonglong); /* *Supportforefficientswitch: es.E.g.switch(__even_in_range(x,10)) * *Notethatthevaluemustbeevenandintherangefrom0to *__bound,inclusive.Nocodewillbegenerated
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 430 上机 实验