中国石油大学胜利学院MSP430期末考试题库

更新时间:2023-11-19 04:07:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

MSP430实验一

1. 熟悉开发环境,掌握USB下载软件的方法。 2. 用汇编语言实现:

P2.0-P2.7依次点亮(参考开发板原理图)

要求先软件仿真调试程序,无误后再下载到开发板运行 3. 用C语言实现上述功能,其它要求同上。 汇编语言参考程序清单:

#include ;包含msp430.h文件 ; NAME main ;模块名称定义 ;PUBLIC main ;

ORG 0FFFEh ;中断向量表复位向量地址

DC16 init ;存放用户程序入口地址,复位后开始执行 RSEG DATA16_C ;在ROM中存放LED显示值 LEDdata DB 01h,02h,04h,08h,10h,20h,40h,80h RSEG CSTACK ;定义堆栈段 RSEG CODE定义代码段

init: MOV #SFE(CSTACK), SP ;初始化堆栈指针 main: NOP ; main program

MOV.W #WDTPW+WDTHOLD,&WDTCTL ;关闭看门狗定时器 MOV.b #0, &P2SEL ;设置P1为基本I/O MOV.b #0FFh, &P2DIR ;设置P1为输出端口 MOV.b #0, &P2OUT ;使8个LED全灭 again: MOV #LEDdata,R4 ;取输出表格首地址 MOV #8, R5 ;循环控制次数

next: MOV.b @R4+, &P2OUT ;取表中的某一种状态输出 CALL #delay ;延时

DEC R5 ;判断8种状态是否输出完 JNZ next ;否,继续

JMP again ;重新从表头开始 delay: PUSH SR ;延时 mov #20,R7

WAIT1: MOV #0FFFFh,R6 ; A123: DEC R6 JNZ A123 dec R7 JNZ WAIT1 POP SR RET END ;

1

C 语言参考程序:

#include \ void delay(); int main( void )

{ unsigned char LEDdata[ ]={1, 2, 4,8,0x10,0x20,0x40,0x80}; unsigned int i;

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 P2SEL=0; //设置P1为基本I/O P2DIR=0xFF; //设置P1为输出端口 P2OUT=0; //使8个LED全灭 while(1) //无限循环 {

for ( i=0; i<8; i++) //8个LED依次点亮 { P2OUT=LEDdata[i]; // delay(); //调用延时子程 } }; }

void delay()

{ unsigned int i; //定义函数变量 for (i=0;i<0xffff;i++); //延时 }

2

MSP430实验2

P1.0作为中断输入端,下降沿触发,当有中断请求时取反P2.0状态。P1.0的硬件接线参考原理图。

1、用汇编语言实现(参考程序如下) #include \NAME main PUBLIC main ORG 0FFFEh

DC16 init ;set reset vector to 'init' label

ORG 0FFE0h+PORT1_VECTOR ;中断向量表首地址+端口1中断偏址 DC16 intP1 ;set port1 vector to ‘intP1’ label RSEG CSTACK ;定义堆栈段 RSEG CODE ;代码段

init: MOV #SFE(CSTACK), SP ;初始化SP main: NOP

MOV.w #WDTPW+WDTHOLD, &WDTCTL ; 关闭看门狗 BIC.b #BIT0, &P1IE ;关闭P1.0中断允许

BIC.b #BIT0, &P2SEL ;设置P2.0为基本I/O功能 BIS.b #BIT0, &P2DIR ;设置P2.0为输出 BIC.b #BIT0, &P2OUT ;置P2.0输出初值为0 BIC b #BIT0, &P1SEL ;置P1.0作为基本I/O端口 BIC.b #BIT0, &P1DIR ;置P1.0为输入

BIS.b #BIT0, &P1IES ;置P1.0下降沿作中断源 BIC.b #BIT0, &P1IFG ;清P1.0中断标志 BIS.b #BIT0, &P1IE ;打开P1.0中断允许 EINT ;允许可屏蔽中断GIE=1 JMP $ ;主程循环

intP1: BIT.b #BIT0, &P1IFG ;判断是否是P1IFG.0中断标志 JZ exit ;不是则跳转

XOR.b #BIT0, &P2OUT ;对P2.0取反 BIC.b #BIT0, &P1IFG ;清P1.0中断标志 exit: RETI END

2.用C语言实现(参考程序如下) #include \int main( void )

{ WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 _DINT(); //禁止可屏蔽中断GIE=0

3

P1IE |=~BIT0; // 关闭P1.0中断允许

P2SEL|=~BIT0; //设置P2.0为基本I/O功能 P2DIR|=BIT0; //设置P2.0为输出

P2OUT &=~BIT0; //置P2.0输出初值为0 P1SEL&=~BIT0; //置P1.0作为基本I/O端口 P1DIR=0XFE; //置P1.0为输入

P1IES&=~BIT0; //置P1.0下降沿作中断源 P1IFG=0X00; //清P1.0中断标志 P1IE|=BIT0; //打开P1.0中断允许 _EINT(); //允许可屏蔽中断GIE=1 while(1) { }; //主程循环 }

#pragma vector=PORT1_VECTOR //置P1中断向量 __interrupt void port_int(void) //中断子程

{ if (P1IFG==BIT0) //判断是否是P1IFG.0中断标志 {

P2OUT ^=BIT0; //对P2.0取反

P1IFG &=~BIT0; //清P1.0中断标志 } }

修改程序,使P1.0为上升沿触发中断,观察程序运行的差异。

串行口实验

#include

void main(void) {

//关电平转换

WDTCTL = WDTPW + WDTHOLD; // Stop WDT

P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD UCTL0 |= CHAR; // 8-bit character UTCTL0 |= SSEL0; // UCLK = ACLK UBR00 = 0x0D; // 32k/2400 - 13.65 UBR10 = 0x00; //

UMCTL0 = 0x6B; // Modulation

UCTL0 &= ~SWRST; // Initialize USART state machine IE1 |= URXIE0; // Enable USART0 RX interrupt

// Mainloop for (;;) {

_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/interrupt while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?

4

TXBUF0 = RXBUF0; // RXBUF0 to TXBUF0 } }

// UART0 RX ISR will for exit from LPM3 in Mainloop #pragma vector=UART0RX_VECTOR __interrupt void usart0_rx (void) {

_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR) }

实验3

系统时钟部分:

5

本文来源:https://www.bwwdw.com/article/ryxv.html

Top