430上机实验.docx

上传人:b****7 文档编号:9632093 上传时间:2023-02-05 格式:DOCX 页数:61 大小:29.02KB
下载 相关 举报
430上机实验.docx_第1页
第1页 / 共61页
430上机实验.docx_第2页
第2页 / 共61页
430上机实验.docx_第3页
第3页 / 共61页
430上机实验.docx_第4页
第4页 / 共61页
430上机实验.docx_第5页
第5页 / 共61页
点击查看更多>>
下载资源
资源描述

430上机实验.docx

《430上机实验.docx》由会员分享,可在线阅读,更多相关《430上机实验.docx(61页珍藏版)》请在冰豆网上搜索。

430上机实验.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1