MSP430考试复习代码2
MSP430-复习

第一章MSP430(Mixed Signal Processor混合信号处理器)的特点:优点:1、超低功耗2、强大的处理能力3、高性能模拟技术及丰富的片上外围模块4、系统工作稳定5、方便高效的开发环境缺点:所有总线都在内部,无功能扩展端RAM:随机存储器(可读写),掉电后数据丢失。
ROM:程序存储器(只可读)。
PROM:一次性可编程存储器(只读)。
EPROM:紫外线擦除的可编程存储器(字节写入整片擦除)。
EEPPROM:电擦除可编程存储器(字节写入,字节擦除)。
FLASH:电擦除可编程存储器(字节写入,段擦除/页擦除)。
第二章CPU的编程资源:16位的ALU(算术逻辑运算单元)、16个寄存器、一个指令控制单元。
16个寄存器:程序计数器PC:以字为单位系统堆栈指针SP:压堆栈(PUSH)过程取堆栈(POP)过程状态寄存器SR:类型名称含义状态标志C:进位标志当运算结果产生进位时C置位,否则C复位Z:零标志当运算结果为零时Z置位,否则Z复位N:负标志当运算结果为负时N置位,否则N复位V:溢出标志当运算结果超出有符号数范围时V置位,溢出情况如下:正数+正数=负数负数+负数=正数正数--负数=负数负数--正数=正数控制标志GIE:通用中断允许位控制可屏蔽中断GIE置位CPU可响应可屏蔽中断GIE复位CPU不响应可屏蔽中断CPUOff 置位CPUOff位可是CPU进入闭关模式,可用所有允许的中常数发生寄存器CG1和CG2 :使用常数发生寄存器产生常数的优点:1、不需要特殊的指令2、对6种最常用的常数不需要额外的字操作数3、缩短指令周期:不经过MDB(数据存储器)就能直接访问寻址模式:指在执行一条指令过程中,如何找到操作数地址的方法(指令的操作数包含源操作数和目的操作数)。
访问整个地址空间的不同寻址模式由As(寻址位,源操作数的寻址模式)和Ad(寻址位,目标作数的寻址模式)模式位的内容确定:源操作数可以使用全部的7种寻址方式,而目的操作数只能使用其中4种寻址方式,它们可以访问整个地址空间。
最新高效的Msp430数字滤波器代码精编版

2020年高效的M s p430数字滤波器代码精编版高效的Msp430数字滤波器代码摘要Msp430用其高效的乘法器可以很容易的实现数字滤波。
乘法器可以将FIR滤波系数转换成可以被任何应用程序使用的装配代码。
何纳计算方法和CSD格式被用于完成高速乘法器操作。
在所有频率下,msp430乘法器的滤波性能由其增益来评估。
在cpu周期,代码长度,低通,高通,带通,带止的频率响应,凹形滤波条件下msp430乘法器的滤波性能由Appendix A所示。
目录1 简介 (2)2 Fir滤波器代码合成器 (2)3 参考 (4)Appendix A Fir滤波器举例 (5)Appendix B文件列表 (10)图形列表A-1低通FIR滤波器响应 (5)A-2高通FIR滤波器响应 (6)A-3带通FIR滤波器响应 (7)A-4带止FIR滤波器响应 (8)A-5凹形FIR滤波器响应 (9)1 简介FIR滤波器,与其固有的稳定和相位线性的特征而被大家熟知。
有时候是数字滤波理想的选择。
由于滤波器系数是浮点型数字,需要用整理机器规范成与其最接近的整形。
比如msp430的微型控制器。
另外,在考虑到CPU周期的情况下,缺少硬件乘法器的滤波会变得很贵。
何纳计算法考虑到了上诉两种情况。
何纳计算法可以进行整形—浮点型的乘法,这样就消除了滤波器系数的整形化。
只用移位和增命令进行乘法,提高了CPU周期下的效率。
工具能够下载到由FIR系数转化成的代码文件。
另外,在扫描滤波器校验数据时会产生C的包裹文件和数据文件。
2 FIR数字滤波器代码合成器FIR数字滤波器代码合成器FIR_filter_codegen.exe 是一个将document. Input和FIR数字滤波系数,滤波长度,位分辨率关联起来的工具。
2.1 输入参数当工具运行时,一个互动的命令窗口打开,要求输入预先讨论的输入参数。
滤波代码的生成完全由这些参数决定。
错误的参数设置会导致生成错误的代码。
msp430单片机12864二级菜单

#include <msp430x14x.h>#define uchar unsigned char#define uint unsigned int#define LCD_data P5DIR=0XFF //数据口输出#define LCD_CMDOUT P3DIR|=0xe0 //P3口的高三位设置为输出#define LCD_RS_LOW P3OUT &= ~BIT7 //RS=0#define LCD_RS_HIGH P3OUT |=BIT7 //RS=1#define LCD_RW_LOW P3OUT &= ~BIT6 //RW=0#define LCD_RW_HIGH P3OUT |=BIT6 //RW=1#define LCD_EN_LOW P3OUT &= ~BIT5 //EN=0#define LCD_EN_HIGH P3OUT |=BIT5 //EN=1uchar k=0,flag=0,flag1=0;uchar dis1_[] = {"系统初始化. "};uchar dis2_[] = {"系统初始化.. "};uchar dis3_[] = {"系统初始化... "};uchar dis4_[] = {" 按选择键开始! "};uchar dis1[] = {"手1:手机设定"}; //一级菜单1uchar dis2[] = {"机2:管理器"}; //一级菜单2uchar dis3[] = {"菜3:通话"}; //一级菜单3uchar dis4[] = {"单4:信息功能"}; //一级菜单5uchar dis5[] = {"手5:文件管理"}; //一级菜单7uchar dis6[] = {"机6:通讯录"}; //一级菜单8uchar dis7[] = {"菜"}; //一级菜单8uchar dis8[] = {"单"}; //一级菜单8uchar dis1_1[] = {"手1:时间和日期"}; //一级菜单1下的子菜单1 uchar dis2_1[] = {"机2:语言"}; //一级菜单1下的子菜单2 uchar dis3_1[] = {"设3:语音控制"}; //一级菜单1下的子菜单3 uchar dis4_1[] = {"定4:关闭无线电"}; //一级菜单1下的子菜单4uchar dis1_2[] = {"管1:闹铃"}; //一级菜单2下的子菜单1 uchar dis2_2[] = {"理2:视频电话"}; //一级菜单2下的子菜单2 uchar dis3_2[] = {"器3:日历"}; //一级菜单2下的子菜单3 uchar dis4_2[] = {" 4:任务"}; //一级菜单2下的子菜单4uchar dis1_3[] = {"通1:全部"}; //一级菜单3下的子菜单1 uchar dis2_3[] = {"话2:已接来电"}; //一级菜单3下的子菜单2 uchar dis3_3[] = {" 3:未接来电"}; //一级菜单3下的子菜单3 uchar dis4_3[] = {" 4:已拨电话"}; //一级菜单3下的子菜单4uchar dis1_4[] = {"信1:编写新信息"}; //一级菜单4下的子菜单1uchar dis2_4[] = {"息2:收件箱"}; //一级菜单4下的子菜单2uchar dis3_4[] = {"功3:电子邮件"}; //一级菜单4下的子菜单3uchar dis4_4[] = {"能4:草稿箱"}; //一级菜单4下的子菜单4uchar dis1_5[] = {"文1:相册"}; //一级菜单5下的子菜单1uchar dis2_5[] = {"件2:音乐"}; //一级菜单5下的子菜单2uchar dis3_5[] = {"管3:视频"}; //一级菜单5下的子菜单3uchar dis4_5[] = {"理4:图片"}; //一级菜单5下的子菜单4uchar dis1_6[] = {"通1:快速拨号"}; //一级菜单6下的子菜单1uchar dis2_6[] = {"讯2: 我的名片"}; //一级菜单6下的子菜单2uchar dis3_6[] = {"录3: 组群"}; //一级菜单6下的子菜单3uchar dis4_6[] = {" 4:特定号码"}; //一级菜单6下的子菜单4void delay_1ms(uint x){uint i,j;for(j=0;j<x;j++)for(i=0;i<113;i++);}void write_cmd(uchar cmd)//写指令数据到LCD :RS=L,RW=L,E=高脉冲,D0-D7=指令码{LCD_RS_LOW ;LCD_RW_LOW ;LCD_EN_LOW ;P5OUT = cmd;delay_1ms(1);LCD_EN_HIGH;delay_1ms(1);LCD_EN_LOW;}void write_dat(uchar dat)//写显示数据到LCD :RS=H,RW=L,E=高脉冲,D0-D7=数据。
msp430指令集

RETI
RRA(.B) RRC(.B) SUB(.B) SUBC(.B) SWPB
dst dst src,dst src,dst dst
SXT
dst
XOR(.B)
src,dst
this is MSP430 Instructions.
Operation
src + dst → dst src + dst + C → dst src .and. dst → dst .not.src .and. dst → dst src .or. dst → dst src .and. dst Call subroutine in lower 64 KB dst - src src + dst + C → dst (decimally) Jump to label if carry bit is set Jump to label if zero bit is set Jump to label if (N .XOR. V) = 0 Jump to label if (N .XOR. V) = 1 Jump to label unconditionally Jump to label if negative bit is set Jump to label if carry bit is reset Jump to label if zero bit is reset src → dst SP - 2 → SP, src → SP TOS → SR, SP + 2 → SP TOS → PC,SP + 2 → SP MSB → MSB →....LSB → C C → MSB →.......LSB → C dst + .not.src + 1 → dst dst + .not.src + C → dst bit 15...bit 8 ↔ bit 7...bit 0 Register mode: bit 7 → bit 8...bit 19 Other modes: bit 7 → bit 8...bit 15 src .xor. dst → dst
MSP430寄存器列表二,初学430必会知识

MSP430寄存器列表二作者 wynne 日期 2006-5-10 20:39:001推荐/************************************************************* 特殊功能寄存器地址和控制位************************************************************//*中断使能1*/#define IE1_ 0x0000sfrb IE1 = IE1_;#define WDTIE 0x01 /*看门狗中断使能*/#define OFIE 0x02 /*外部晶振故障中断使能*/#define NMIIE 0x10 /*非屏蔽中断使能*/#define ACCVIE 0x20 /*可屏蔽中断使能/flash写中断错误*/ #define URXIE0 0x40 /*串口0接收中断使能*/#define UTXIE0 0x80 /*串口0发送中断使能*//*中断标志1*/#define IFG1_ 0x0002sfrb IFG1 = IFG1_;#define WDTIFG 0x01 /*看门狗中断标志*/#define OFIFG 0x02 /*外部晶振故障中断标志*/#define NMIIFG 0x10 /*非屏蔽中断标志*/#define URXIFG0 0x40 /*串口0接收中断标志*/#define UTXIFG0 0x80 /*串口0发送中断标志*//* 中断模式使能1 */#define ME1_ 0x0004sfrb ME1 = ME1_;#define URXE0 0x40 /* 串口0接收中断模式使能 */#define USPIE0 0x40 /* 同步中断模式使能 */#define UTXE0 0x80 /* 串口0发送中断模式使能 *//* 中断使能2 */#define IE2_ 0x0001sfrb IE2 = IE2_;#define URXIE1 0x10 /* 串口1接收中断使能 */#define UTXIE1 0x20 /* 串口1发送中断使能 *//* 中断标志2 */#define IFG2_ 0x0003sfrb IFG2 = IFG2_;#define URXIFG1 0x10 /* 串口1接收中断标志 */#define UTXIFG1 0x20 /* 串口1发送中断标志 *//* 中断模式使能2 */#define ME2_ 0x0005sfrb ME2 = ME2_;#define URXE1 0x10 /* 串口1接收中断模式使能 */#define USPIE1 0x10 /* 同步中断模式使能 */#define UTXE1 0x20 /* 串口1发送中断模式使能 *//************************************************************* 看门狗定时器的寄存器定义************************************************************/#define WDTCTL_ 0x0120sfrw WDTCTL = WDTCTL_;#define WDTIS0 0x0001 /*选择WDTCNT的四个输出端之一*/#define WDTIS1 0x0002 /*选择WDTCNT的四个输出端之一*/#define WDTSSEL 0x0004 /*选择WDTCNT的时钟源*/#define WDTCNTCL 0x0008 /*清除WDTCNT端: 为1时从0开始计数*/#define WDTTMSEL 0x0010 /*选择模式 0: 看门狗模式; 1: 定时器模式*/#define WDTNMI 0x0020 /*选择NMI/RST 引脚功能 0:为 RST; 1:为NMI*/#define WDTNMIES 0x0040 /*WDTNMI=1时.选择触发延 0:为上升延 1:为下降延*/#define WDTHOLD 0x0080 /*停止看门狗定时器工作 0:启动;1:停止*/#define WDTPW 0x5A00 /* 写密码:高八位*//* SMCLK= 1MHz定时器模式 */#define WDT_MDLY_32 WDTPW+WDTTMSEL+WDTCNTCL /* TSMCLK*2POWER15=32ms 复位状态 */ #define WDT_MDLY_8 WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0 /* TSMCLK*2POWER13=8.192ms " */ #define WDT_MDLY_0_5 WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1 /* TSMCLK*2POWER9=0.512ms " */#define WDT_MDLY_0_064 WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0 /* TSMCLK*2POWER6=0.512ms " *//* ACLK=32.768KHz 定时器模式*/#define WDT_ADLY_1000 WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL /* TACLK*2POWER15=1000ms " */#define WDT_ADLY_250 WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0 /* TACLK*2POWER13=250ms " */#define WDT_ADLY_16 WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1 /* TACLK*2POWER9=16ms " */#define WDT_ADLY_1_9 WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0 /* TACLK*2POWER6=1.9ms " *//* SMCLK=1MHz看门狗模式 */#define WDT_MRST_32 WDTPW+WDTCNTCL /* TSMCLK*2POWER15=32ms 复位状态 */ #define WDT_MRST_8 WDTPW+WDTCNTCL+WDTIS0 /* TSMCLK*2POWER13=8.192ms " */#define WDT_MRST_0_5 WDTPW+WDTCNTCL+WDTIS1 /* TSMCLK*2POWER9=0.512ms " */#define WDT_MRST_0_064 WDTPW+WDTCNTCL+WDTIS1+WDTIS0 /* TSMCLK*2POWER6=0.512ms " *//* ACLK=32KHz看门狗模式 */#define WDT_ARST_1000 WDTPW+WDTCNTCL+WDTSSEL /* TACLK*2POWER15=1000ms " */#define WDT_ARST_250 WDTPW+WDTCNTCL+WDTSSEL+WDTIS0 /* TACLK*2POWER13=250ms " */#define WDT_ARST_16 WDTPW+WDTCNTCL+WDTSSEL+WDTIS1 /* TACLK*2POWER9=16ms " */#define WDT_ARST_1_9 WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0 /* TACLK*2POWER6=1.9ms " *//************************************************************ 硬件乘法器的寄存器定义************************************************************/#define MPY_ 0x0130 /* 无符号乘法 */sfrw MPY = MPY_;#define MPYS_ 0x0132 /* 有符号乘法*/sfrw MPYS = MPYS_;#define MAC_ 0x0134 /* 无符号乘加 */sfrw MAC = MAC_;#define MACS_ 0x0136 /* 有符号乘加 */sfrw MACS = MACS_;#define OP2_ 0x0138 /* 第二乘数 */sfrw OP2 = OP2_;#define RESLO_ 0x013A /* 低6位结果寄存器 */ sfrw RESLO = RESLO_;#define RESHI_ 0x013C /* 高6位结果寄存器 */ sfrw RESHI = RESHI_;#define SUMEXT_ 0x013E /*结果扩展寄存器 */const sfrw SUMEXT = SUMEXT_;/************************************************************ * DIGITAL I/O Port1/2 寄存器定义有中断功能************************************************************/#define P1IN_ 0x0020 /* P1 输入寄存器 */const sfrb P1IN = P1IN_;#define P1OUT_ 0x0021 /* P1 输出寄存器 */sfrb P1OUT = P1OUT_;#define P1DIR_ 0x0022 /* P1 方向选择寄存器 */ sfrb P1DIR = P1DIR_;#define P1IFG_ 0x0023 /* P1 中断标志寄存器*/sfrb P1IFG = P1IFG_;#define P1IES_ 0x0024 /* P1 中断边沿选择寄存器*/ sfrb P1IES = P1IES_;#define P1IE_ 0x0025 /* P1 中断使能寄存器 */ sfrb P1IE = P1IE_;#define P1SEL_ 0x0026 /* P1 功能选择寄存器*/sfrb P1SEL = P1SEL_;#define P2IN_ 0x0028 /* P2 输入寄存器 */const sfrb P2IN = P2IN_;#define P2OUT_ 0x0029 /* P2 输出寄存器 */sfrb P2OUT = P2OUT_;#define P2DIR_ 0x002A /* P2 方向选择寄存器 */sfrb P2DIR = P2DIR_;#define P2IFG_ 0x002B /* P2 中断标志寄存器 */sfrb P2IFG = P2IFG_;#define P2IES_ 0x002C /* P2 中断边沿选择寄存器 */ sfrb P2IES = P2IES_;#define P2IE_ 0x002D /* P2 中断使能寄存器 */sfrb P2IE = P2IE_;#define P2SEL_ 0x002E /* P2 功能选择寄存器 */sfrb P2SEL = P2SEL_;/************************************************************* DIGITAL I/O Port3/4寄存器定义无中断功能************************************************************/#define P3IN_ 0x0018 /* P3 输入寄存器 */const sfrb P3IN = P3IN_;#define P3OUT_ 0x0019 /* P3 输出寄存器 */sfrb P3OUT = P3OUT_;#define P3DIR_ 0x001A /* P3 方向选择寄存器 */sfrb P3DIR = P3DIR_;#define P3SEL_ 0x001B /* P3 功能选择寄存器*/sfrb P3SEL = P3SEL_;#define P4IN_ 0x001C /* P4 输入寄存器 */const sfrb P4IN = P4IN_;#define P4OUT_ 0x001D /* P4 输出寄存器 */sfrb P4OUT = P4OUT_;#define P4DIR_ 0x001E /* P4 方向选择寄存器 */sfrb P4DIR = P4DIR_;#define P4SEL_ 0x001F /* P4 功能选择寄存器 */sfrb P4SEL = P4SEL_;/************************************************************* DIGITAL I/O Port5/6 I/O口寄存器定义PORT5和6 无中断功能************************************************************/#define P5IN_ 0x0030 /* P5 输入寄存器 */const sfrb P5IN = P5IN_;#define P5OUT_ 0x0031 /* P5 输出寄存器*/sfrb P5OUT = P5OUT_;#define P5DIR_ 0x0032 /* P5 方向选择寄存器*/sfrb P5DIR = P5DIR_;#define P5SEL_ 0x0033 /* P5 功能选择寄存器*/sfrb P5SEL = P5SEL_;#define P6IN_ 0x0034 /* P6 输入寄存器 */ const sfrb P6IN = P6IN_;#define P6OUT_ 0x0035 /* P6 输出寄存器*/sfrb P6OUT = P6OUT_;#define P6DIR_ 0x0036 /* P6 方向选择寄存器*/ sfrb P6DIR = P6DIR_;#define P6SEL_ 0x0037 /* P6 功能选择寄存器*/ sfrb P6SEL = P6SEL_;。
MSP430考试复习内容.doc

Timer_A从0增计数到TAxCCRO之后减计数到0,循环往复
19、捕获/比较模块
7个可配置的捕获/比较寄存器
捕获模式:
捕获模式被用于捕获事件发生的时间。捕获输入CCIxA和CCIxB可连接外部引脚或内部信 号,这需通过CCIS控制位进行配罝。可通过CM控制位将捕获输入信号触发沿配罝为上升 沿触发、下降沿触发或两者都触发。
17、看门狗定时器具有看门狗模式、定时计数模式;
18、定时器A(Timer_A)共有4种工作模式:
停止模式、增计数模式、连续计数模式和增/减计数模式
Timer.A工作模式
描述
停止模式
Timer A停止
增计数模式
Timer A从0到TAxCCRO重复计数
连续计数模式
Timer_A从()至ij OFFFFh重复计数
5、SR寄存器中每一位定义都要知道,特别是4个和工作方式相关的位,及GIE位
状态寄存器
•V:溢出位O
.SC3G1:系统时钟发生器控制位1
•SCGO:系统曰寸钟发生器控制位O
•OseOffx晶振关闭位。
进位位
6、屮断的基本概念(如屮断定义、屮断源、屮断优先级、断点和屮断现场);
MSP430单片机包含3类屮断源:系统复位屮断源、不可屏蔽屮断源和可屏蔽屮断源。
1、一个发光二极管(LED)亮6秒,停止10秒后,重复。LED选择P4.4、P4.5、P4.6控 制的三个LED屮的一个。
1ACLK:辅助时钟。ACLK主要用于低速外设。
2MCLK:主时钟。MCLK专门供CPU使川,MCLK配置得越高,CPU的执行速度就越 快,功耗就越高。一旦关W MCLK, CPU也将停止工作,因此在超低功耗系统中)ij以通过 间歇启用MCLK的方法降低系统功耗。
电子大赛MSP430培训资料

电子大赛MSP430培训资料2014-07根据学生基础较差情况和培训时间较短的情况综合考虑,采用实用主义的做法,用多少,讲多少,以下的资料,贯穿这个思想。
实验材料,选用MSP430LaunchPad板,软件选用CCSv5(软件的使用:自学)。
一、I/O口MSP430LaunchPad板上所用的CPU为MSP430G2553,20引脚,如下图:有P1和P2两个8脚的口(P2.6和P2.7与晶振合用),为双向I/O口。
对这些口的使用,实际是对这些口的寄存器的使用,故必须知道管理这些口的寄存器有哪些?从上表可看出,实际上还有上拉电阻的寄存器(PxREN)以及P1SEL2。
开始学习阶段,先涉及3个寄存器,即PxDIR、PxOUT和PxIN。
实例1:(选用软件自带的例程MSP430G2xx3_1.c)实验目的:掌握I/O口输出的方法。
实验现象:通电后P1.0口所接的红色LED灯闪亮。
//************************************************************************* // MSP430G2xx3 Demo - Software Toggle P1.0//// Description; Toggle P1.0 by xor'ing P1.0 inside of a software loop.// ACLK = n/a, MCLK = SMCLK = default DCO//// MSP430G2xx3// -----------------// /|\| XIN|-// | | |// --|RST XOUT|-// | |// | P1.0|-->LED//// D. Dang// Texas Instruments, Inc// December 2010// Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10//***********************************************************************#include<msp430.h>int main(void){WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timerP1DIR |= 0x01; // Set P1.0 to output directionfor (;;){volatile unsigned int i;P1OUT ^= 0x01; // Toggle P1.0 using exclusive-ORi = 50000; // Delaydo (i--);while (i != 0);}}//***********************************************************************思考题:修改程序,使之实现P1.0和P1.6所接的两个LED灯交替闪亮,并修改时间常数。
MSP430指令集

1.数据传送指令MOV 源操作数移至目的操作数MOV.B scr,dst /MOV[.W] scr,dst CLR 清除目的操作数CLR.B dst /CLR[.W] dstPOP 字从堆栈弹出至目的操作数POP.B dst /POP[.W] dstPUSH 将字压进堆栈PUSH.B src /PUSH[.W] src SWPB 交换字节SWPB dstSXT 扩展符号SXT dst2.数据运算指令ADC 将进位位加至目的操作数ADC.B dst /ADC dst或ADC[.W] dst ADD 源操作数加至目的操作数ADD src,dst /ADD[.W] src,dst ADDC 原操作数和进位加至目的操作数ADDC.B src,dst /ADDC[.W] src,dst DADC 加上十进制的进位位DADC.B dst /DADC [.W] src,dst DADD 将十进制的进位位和源操作数加至目的操作数DADD.B src,dst /DADD[.W] src,dst INC 目的操作数加1 INC.B dst /INC[.W] dstINCD 目的操作数加2 INCD.B dst /INCD[.W] dstSUB 从目的操作数中减去源操作数SUB src,dst /SUB[.W] src,dst SUBC 从目的操作数中减去源操作数和借位/非进位SUBC src,dst /SUBC[.W] src,dst DEC 目的操作数减1 DEC.B dst /DEC[.W] dstDECD 目的操作数减2 DECD.B dst /DECD[.W] dstSBC 从目的操作数减去借位SBC.B dst /SBC[.W] dstCMP 比较源操作数和目的操作数CMP.B src,dst /CMP[.W] src,dst TST 测试目的操作数TST.B dst /TST[.W] dst3.逻辑运算和位操作类指令AND 源操作数和目的操作数与AND.B src,dst /AND[.W] src,dstBIC清除目的操作数的各位BIC.B src,dst /BIC [.W] src,dstBIS 设置目的操作数的各位BIS.B src,dst /BIS[.W] src,dstBIT 测试目的操作数的各位BIT.B src,dst /BIT[.W] src,dstXOR 源操作数和目的操作数异或XOR.B src,dst /XOR[.W] src,dstINV 目的操作数求反INV.B dst /INV[.W] dstRLA 算数左移RLA.B dst /RLA[.W] dstRLC 通过进位位左移RLC.B dst /RLC[.W] dstRRA 算数右移RRA.B dst /RRA[.W] dstRRC 通过进位位右移RRC.B dst /RRC[.W] dstCLRC 清除进位位CLRCCLRN 清除负位CLRNCLRZ 清除零位CLRZSETC 设置进位位SETCSETN 设置负位SETNSETZ 设置零位SETZDINT 禁止(一般)中断DINTEINT 使能(一般)中断EINT4.跳转与程序流程的控制类指令BR 转移至目的操作数BR dstCALL 调用子程序CALL dstJC/JHS JC 设置进位位时程序跳转JC 标号JHS 大于和等于时程序跳转JHS 标号JEQ/JZ JEQ 等于时程序跳转JEQ 标号JZ 为零时程序跳转JZ标号JGE 大于等于时程序跳转JGE 标号JL 小于时程序跳转JL 标号JMP 程序无条件跳转JMP 标号JN 为负时程序跳转JN标号JNC/JLO JNC 进位未设置时程序跳转JNC 标号JLO 小于时程序跳转JLO 标号JNE/JNZ JNE 不等时程序跳转JNE 标号JNZ 不为零时程序跳转JNZ 标号RET 从子程序返回RETRETI 从中断返回RETINOP 空操作NOP。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例1:利用定时器A溢出中断实现定时。
ACLK=32KHZ,MCLK=SMCLK=DCOCLK=800k,定时器A工作在连续计数模式,在P3.1端口输出频率为6Hz的方波。
#include <msp430x14x.h>void main(void){WDTCTL=WDTPW+WDTHOLD; //停止看门狗TACTL =TASSEL_2+TACLR+MC_2+TAIE; //定时器A时钟源为SMCLK,计数器清零,连续计数模式,溢出中断允许。
P3DIR=0x02; //P3.1端口设置为输出_EINT();for(;;){_BIS_SR(CPUOFF);_NOP();} }#pragma vector=TIMERA1_VECTOR__interrupt void TIMER_A(void){switch(TAIV){case 2: break;case 4: break;case 10: P3OUT^=0x02; //定时器A溢出,P3.1取反break;}}例2:定时器A增计数模式举例。
ACLK=32KHZ,MCLK=SMCLK=DCOCLK=800k,定时器A工作在增计数模式,利用CCR0中断在P3.1端口输出20Hz的方波。
#include <msp430x14x.h>void main(void){WDTCTL = WDTPW + WDTHOLD; // 停止看门狗P3DIR |= BIT1; // P3.1设置为输出CCTL0 = CCIE; // CCR0中断允许CCR0 = 20000;TACTL = TASSEL_2 + TACLR +MC_1; // 定时器A时钟源为SMCLK,计数器清零,增计数模式_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}#pragma vector=TIMERA0_VECTOR__interrupt void Timer_A (void){P3OUT ^= BIT1; // P3.1取反}例3:定时器A连续计数模式举例。
ACLK=32kHZ,MCLK=SMCLK=DCOCLK=800k,定时器A工作在连续计数模式,利用CCR0中断在P3.1端口输出10Hz的方波,同时利用定时器A溢出中断在P3.2端口输出6Hz的方波。
#include <msp430x14x.h>void main(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(LPM0_bits + GIE);}#pragma vector=TIMERA0_VECTOR__interrupt void Timer_A0 (void){P3OUT ^= 0x02; // P3.1取反CCR0 += 40000; //CCR0置入计数值}#pragma vector=TIMERA1_VECTOR__interrupt void Timer_A1(void){switch( TAIV ){case 2: break;case 4: break;case 10: P3OUT ^= 0x04; //P3.2取反break;}}例4:定时器A增减计数模式举例。
ACLK=32kHZ,MCLK=SMCLK=DCOCLK=800k,定时器A工作在增减计数模式,利用CCR0中断在P3.1端口输出20Hz的方波,同时利用定时器A溢出中断在P3.2端口输出40Hz的方波。
#include <msp430x14x.h>void main(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);}#pragma vector=TIMERA0_VECTOR__interrupt void Timer_A0 (void){P3OUT ^= 0x02; // P3.1取反P3OUT ^= 0X04;}#pragma vector=TIMERA1_VECTOR__interrupt void Timer_A1(void){switch( TAIV ){case 2: break;case 4: break;case 10: P3OUT ^= 0x04; //P3.2取反break;}}例5:捕获/比较模块之捕获模式举例。
ACLK=32KHZ,MCLK=SMCLK=DCOCLK=800k,经8分频后作为定时器A的时钟源,定时器A工作在连续计数模式。
由软件循环产生方波信号,信号同时接入P1.1(CCI0A)和P1.2(CCI1A) ,由CCR1获取信号周期,CCR0确定信号占空比。
#include <msp430x14x.h>unsigned int lastCCR0,lastCCR1unsigned int j; //测得信号周期为j*(1/100K)unsigned int k; //测得信号占空比为:k/jvoid main(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; lastCCR0 = 0;k = 0; lastCCR1 = 0;P1DIR=0x00; P1SEL=0xff;P3DIR=0xFF; P3OUT=0x00;_EINT();for(;;){for(i=0;i<10000;i++)_NOP();P3OUT^=0x02; //产生捕获信号源BIT1}}#pragma vector=TIMERA1_VECTOR //定时器中断捕获__interrupt void TIMER_A(void){switch(TAIV){case 2: P3OUT^=0x04; //BIT2j=CCR1-lastCCR1; //两次上升沿间隔lastCCR1 = CCR1; break;case 4: break;case 10: break;}}#pragma vector=TIMERA0_VECTOR //CCR0捕获产生中断__interrupt void TIMER_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 <msp430x14x.h>void main(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(;;);}#pragma vector=TIMERA1_VECTOR //定时器比较器中断CCR1=TAR__interrupt void TIMER_A(void){switch(TAIV){case 2:P3OUT ^= 0x04;CCR1 += 10000; // 改变比较条件break;case 4: break;case 10: P3OUT ^= 0x02;break;}}#pragma vector=TIMERA0_VECTOR //当TAR=CCR0产生中断__interrupt void TIMER_cc(void){P3OUT ^= 0x08;CCR0 += 20000; //改变比较条件}例7:定时器A输出单元实验。
ACLK = TACLK = LFXT1 = 32768, 利用Timer_A输出周期为512 /32768 = 15.625ms、占空比分别为75%和25%的PWM矩形波#include <msp430x44x.h>void main(void){WDTCTL = WDTPW +WDTHOLD; //停止看门狗TACTL = TASSEL0 + TACLR; // ACLK, 清除TARCCTL0=0x00; //默认值,比较器模式CCTL1=0x00; //默认值,比较器模式CCR0 = 512-1; // PWM周期CCTL1 = OUTMOD_7;CCR1 = 384; //占空比384/512=0.75CCTL2 = OUTMOD_7;CCR2 = 128; //占空比128/512=0.25P1DIR |= 0x04; // P1.2 输出P1SEL |= 0x04; // P1.2 TA1 outP2DIR |= 0x01; // P2.0 输出P2SEL |= 0x01; // P2.0 TA2 outTACTL |= MC0; // Timer_A 增计数模式for (;;){_BIS_SR(LPM3_bits); // 进入LPM3_NOP();}}例1:使用看门狗定时功能产生一个方波。
#include <msp430x14x.h>void main(void){WDTCTL = WDT_MDLY_32;IE1 |= WDTIE;P1DIR |=0x01;_EINT();for(;;){_BIS_SR(CPUOff);_NOP();}}#pragma vector = WDT_VECTOR__interrupt void watchdog_timer(void){P1OUT ^= 0x01;}例2: 看门狗模式#include <msp430x14x.h>void main(void){P3DIR=0XFF; //P3输出WDTCTL=WDT_MRST_32; //WDTPW+WDTCNTCL 看门狗32毫秒int i;for(i=0;i<5000;i++)_NOP();P3OUT ^=0X02; // P3.1灯亮或灭for(;;){WDTCTL =WDT_MRST_32;//喂狗,看门狗计数器清零即//WDTPW+WDTCNTCL;for(i=0;i<=5000;i++)_NOP();P3OUT ^=0x0c; // P3.2 p3.3灯亮或灭}}比较器例1 利用比较器A的中断,实现当输入P2.3的电压高于0.5Vcc时,使P1.2置位,当P2.3的电压低于0.5Vcc时,使P1.2复位。