几个msp430单片机的重点例程

合集下载

MSP430单片机及设计实例

MSP430单片机及设计实例

基于MSP430单片机的医疗设备控制系统
总结词
高可靠性、实时性、安全性
详细描述
MSP430单片机在医疗设备控制系统中具有高可靠性和实时性,能够满足医疗设备对安全性的高要求 。通过与各类传感器和执行器配合,实现对医疗设备的精确控制,如输液泵、监护仪等。系统可提高 医疗设备的自动化水平,减轻医护人员的工作负担。
通过PWM信号控制电机驱动器,实现电机的调速和方向控制。
速度与位置控制
通过编码器检测电机的实际速度和位置,实现闭环控制。
基于MSP430单片机的无线通信系统设计
无线通信模块选择
选择合适的无线通信模块,如Wi-Fi、蓝牙、Zigbee等。
MCU与无线通信模块接口
通过串口或SPI接口实现数据传输和控制。
数据传输与接收
实现数据的发送和接收,并进行必要的处理和显示。
05
MSP430单片机应用实例
基于MSP430单片机的智能家居控制系统
总结词
低功耗、高效能、易于扩展
详细描述
MSP430单片机以其低功耗和高性能在智能家居控制系统中得到广泛应用。通过与传感器、执行器等外围设备连 接,实现对家居环境的智能监控和控制,如温度、湿度、光照等。系统可扩展性强,可接入各种智能设备,为用 户提供便捷的生活体验。
基于MSP430单片机的工业自动化控制系统
总结词
抗干扰能力强、适应性强、易于维护
详细描述
MSP430单片机在工业自动化控制系统中表现出抗干扰能力强、适应性强和易于维护等 优点。广泛应用于各种工业控制领域,如电机控制、过程控制等。系统可提高生产效率,
降低能耗,为企业带来经济效益。
THANKS
感谢观看
MSP430单片机的编程语言

MSP430单片机入门例程

MSP430单片机入门例程

MSP430单片机入门例程MSP430单片机是一款低功耗、高性能的16位单片机,广泛应用于各种嵌入式系统。

下面是一个简单的MSP430单片机入门例程,可以让大家初步了解MSP430单片机的基本使用方法。

所需材料:1、MSP430单片机开发板2、MSP430单片机编译器3、MSP430单片机调试器4、电脑和相关软件步骤:1、安装MSP430单片机编译器首先需要安装MSP430单片机的编译器,该编译器可以将C语言代码编译成MSP430单片机可以执行的机器码。

在安装编译器时,需要选择与您的单片机型号匹配的编译器。

2、编写程序下面是一个简单的MSP430单片机程序,可以让LED灯闪烁:c本文include <msp430.h>int main(void)本文P1DIR |= 0x01; //设置P1.0为输出while(1){P1OUT ^= 0x01; //反转P1.0的状态,LED闪烁__delay_cycles(); //延时一段时间,控制闪烁频率}本文上述程序中,首先定义了P1DIR寄存器,将P1.0设置为输出。

然后进入一个无限循环,在循环中反转P1.0的状态,使LED闪烁。

使用__delay_cycles()函数实现延时,控制LED闪烁频率。

3、编译程序使用MSP430单片机编译器将程序编译成机器码,生成可执行文件。

在编译时,需要注意选择正确的编译器选项和单片机型号。

4、调试程序使用MSP430单片机调试器将可执行文件下载到单片机中,并使用调试器进行调试。

在调试时,可以观察单片机的输出口状态和LED灯的闪烁情况,确保程序正常运行。

随着嵌入式系统的发展,MSP430单片机作为一种低功耗、高性能的微控制器,在各种应用领域中得到了广泛的应用。

为了更好地理解和应用MSP430单片机,我在学习过程中积累了一些经验,现在分享给大家。

MSP430单片机是一种超低功耗的微控制器,由德州仪器(Texas Instruments)推出。

MSP430单片机基础实验手册

MSP430单片机基础实验手册

1、MSP430单片机基础实验1.1、IO口实验实验目的:学会MSP430单片机IO口的常规操作。

实验原理开发板上的3个LED灯和IO口的对应关系如下:POWER——P1.7 ISO14443A——P1.6 ISO15693——P1.4根据原理图分析,只需要将对应IO输出为低电平即可使其对应三极管导通,达到点亮对应LED的目的。

关键代码分析#include <msp430.h>volatile unsigned int i; // volatile to prevent optimizationint main(void){WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timerP1DIR |= 0x80; // Set P1.7 to output directionfor (;;){P1OUT ^= 0x80; // Toggle P1.7 using exclusive-ORi = 50000; // Delaydo (i--);while (i != 0);}}对应工程详见:\感知RF2实验光盘2013\RFID技术实验\1-MSP430单片机基础实验\io实验结果POWER对应的LED灯闪烁。

作业1、对其他连个灯进行对应操作;2、流水灯显示编程控制。

1.2、定时器实验实验目的:学会MSP430单片机定时器常规配置及中断操作。

实验原理采用定时器TA溢出中断对LED灯进行取反操作。

关键代码分析#include <msp430.h>int main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDTP1DIR |= 0x80; // P1.0 outputTACCTL0 = CCIE; // TACCR0 interrupt enabledTACCR0 = 50000;TACTL = TASSEL_2 + MC_2; // SMCLK, contmode__bis_SR_register(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}// Timer A0 interrupt service routine#pragma vector=TIMERA0_VECTOR__interrupt void Timer_A (void){P1OUT ^= 0x80; // Toggle P1.7TACCR0 += 50000; // Add Offset to TACCR0}对应工程详见\感知RF2实验光盘2013\RFID技术实验\1-MSP430单片机基础实验\timer实验结果LED灯快速闪烁,改变TACCR0值,闪烁时间间隔改变。

msp430实用程序汇总

msp430实用程序汇总

一、基础实验【10个】1、入门试验:LED闪烁(1个)2、时钟实验:设置MCLK、ACLK、SMCLK(1个)3、低功耗实验:设置低功耗模式(1个)4、IO端口试验:IO端口寄存器设置(1个)5、定时器:看门狗定时器、TimerA寄存器设置(2个)6、比较器:比较器A寄存器(1个)7、Flash:flash读写(1个)8、异步通信:异步通信寄存器设置(1个)9、ADC:ADC12寄存器设置(1个)二、开发板模块简单程序【56个】1、LED流水灯实验(红、黄、绿)(1)LED1:检测开发板(2)LED2:普通IO控制闪烁(3)LED3:PWM信号控制闪烁2、蜂鸣器实验(1)蜂鸣器1:单频音(步进变音调)(2)蜂鸣器2:奏乐(祝你平安)3、数码管实验(1)数码管1(显示123456)(2)数码管2(动态显示0~F)(3)数码管3(流动光圈)(4)数码管4(来回光标)4、4×1独立按键实验(1)4×1键盘1:扫描数码管显示(2)4×1键盘2:中断数码管显示(3)4×1键盘3:控制LED(4)4×1键盘4:控制蜂鸣器5、4×4矩阵键盘实验(1)4×4键盘1:行列扫描数码管显示(2)4×4键盘2:行列扫描1602液晶显示(3)4×4键盘3:控制LED蜂鸣器6、1602液晶实验(1)1602液晶1:动态字符显示(2)1602液晶2:静态字符显示(3)1602液晶3:内部时钟显示7、3.3V-5V电平转换实验(1)电平转换1:输出5V方波(2)电平转换2:输出不同占空比的方波(3)电平转换3:MCLK,SMCLK,ACLK8、RS232接口实验(1)RS232接口1:MCU发送数据PC机显示(2)RS232接口2:按键控制MCU发送数据PC机显示(3)RS232接口3:PC机发送数据MCU液晶显示(4)RS232接口4:MCU回发接收到的PC机数据(5)RS232接口5:RS232控制蜂鸣器9、RS485接口实验(1)RS485接口1:发送程序(2)RS485接口2:接收程序10、USB接口实验(1)USB接口1:简单连接测试(2)USB接口2:USB接收数据(3)USB接口3:USB发送数据11、PS2接口实验(1)PS2接口1:PS2控制1602显示(2)PS2接口2:PS2控制数码管显示(3)PS2接口3:PS2控制LED和蜂鸣器12、12-Bit高精度温度传感器实验(1)温度传感器1:DS18B20在数码管显示(2)温度传感器2:DS18B20在液晶显示13、RTC实时时钟实验(1)实时时钟1:DS1302测试(2)实时时钟2:DS1302电子钟14、2k Bit EEPROM实验(1)EEPROM1:AT24C02测试(2)EEPROM2:读出数据通过串口在PC机显示15、12-Bit模数转换器(ADC)接口实验(1)模数转换器1:ADC在数码管显示(2)模数转换器2:ADC在1602液晶在显示(3)模数转换器3:ADC通过串口在PC机显示16、8-Bit数模转换器(DAC)实验(1)数模转换器1:DAC控制LED(2)数模转换器2:DAC输出电压,ADC采样转换并在液晶上显示17、12864液晶实验(与12864液晶配套)(1)12864液晶并口1:字符显示(2)12864液晶并口2:汉字显示(3)12864液晶并口3:图形显示(4)12864液晶并口4:综合演示(5)12864液晶串口5:字符显示(6)12864液晶串口6:汉字显示(7)12864液晶串口7:图形显示(8)12864液晶串口8:综合演示18、射频模块CC1000实验(1)射频模块1:发送数据(2)射频模块2:接收数据19、ucos移植注:17、18程序随模块赠送三、开发板综合程序【30】1、键盘综合实验(1)4×4键盘+蜂鸣器+LED+数码管显示(2)4×4键盘+蜂鸣器+LED+1602液晶显示(3)4×4键盘+蜂鸣器+LED+PC机显示(4)PS2键盘+UART+PC机显示(5)PS2键盘+USB+PC机显示2、接口综合实验(1)USB UART(2)UART USB(3)RS232 RS485(4)RS485 RS2323、温度时间综合实验(1)DS18B20 + DS1302 + 数码管(2)DS18B20 + DS1302 + USB(3)DS18B20 + DS1302 + UART(4)DS18B20 + DS1302 + 16024、AD DA综合实验(1)ADC + 1602(2)ADC + UART(3)ADC + USB(4)DAC + LED + KEY(5)DAC + UART(6)DAC + USB(7)ADC + UART + DS1302(8)ADC + DAC + 1602 + KEY(9)ADC + DAC + UART + KEY5、其他综合实验(1)AT24C02高级应用(搜索,擦除,读出全部)(2)DS1302高级应用(内部RAM存取数据)6、12864液晶综合实验(1)汉字库(2)图形库7、3.2寸TFT触摸屏实验(1)静态图片(2)动画/*************************************************** 程序功能:BoardConfig.h 头文件---------------------------------------------------***************************************************/ typedef unsigned char uchar;typedef unsigned int uint;//控制位的宏定义#define Ctrl_Out P3DIR |= BIT3 + BIT6 + BIT7;#define Ctrl_0 P3OUT &= ~(BIT3 + BIT6 + BIT7)#define SRCLK_1 P3OUT |= BIT7#define SRCLK_0 P3OUT &= ~BIT7#define SER_1 P3OUT |= BIT6#define SER_0 P3OUT &= ~BIT6#define RCLK_1 P3OUT |= BIT3#define RCLK_0 P3OUT &= ~BIT3//板上资源配置函数void BoardConfig(uchar cmd){uchar i;Ctrl_Out;Ctrl_0;for(i = 0; i < 8; i++){SRCLK_0;if(cmd & 0x80) SER_1;else SER_0;SRCLK_1;cmd <<= 1;}RCLK_1;_NOP();RCLK_0;}/*************************************************** 程序功能:控制8个LED闪烁,用于测试下载功能是否正常---------------------------------------------------测试说明:观察LED闪烁***************************************************/ #include <msp430x14x.h>#include "BoardConfig.h"/****************主函数****************/void main(void){WDTCTL = WDTPW + WDTHOLD; //关闭看门狗BoardConfig(0xf0); //关闭数码管和电平转换,打开流水灯CCTL0 = CCIE; //使能CCR0中断CCR0 = 2047; //设定周期0.5STACTL = TASSEL_1 + ID_3 + MC_1; //定时器A的时钟源选择ACLK,增计数模式P2DIR = 0xff; //设置P2口方向为输出P2OUT = 0xff;_EINT(); //使能全局中断LPM3; //CPU进入LPM3模式}/*******************************************函数名称:Timer_A功能:定时器A的中断服务函数参数:无返回值:无********************************************/#pragma vector = TIMERA0_VECTOR__interrupt void Timer_A (void){P2OUT ^= 0xff; //P2口输出取反}程序功能:实现流水灯以三种流动方式和四种流动速度的不同组合而进行点亮"流动"------------------------------------------------测试说明:观察流水灯流动顺序和速度的变化************************************************/#include <msp430x14x.h>#include "BoardConfig.h"uint i = 0,j = 0,dir = 0;uint flag = 0,speed = 0; //flag--灯光流动方式,speed--灯光流动速度/****************主函数****************/void main(void){WDTCTL = WDTPW + WDTHOLD; //关闭看门狗BoardConfig(0xf0);CCTL0 = CCIE; //使能CCR0中断CCR0 = 50000;TACTL = TASSEL_2 + ID_3 + MC_1; //定时器A的时钟源选择SMCLK,增计数模式P2DIR = 0xff; //设置P2口方向为输出P2OUT = 0xff;_EINT(); //使能全局中断LPM0; //CPU进入LPM0模式}/*******************************************函数名称:Timer_A功能:定时器A的中断服务函数,在这里通过标志控制流水灯的流动方向和流动速度参数:无返回值:无********************************************/#pragma vector = TIMERA0_VECTOR__interrupt void Timer_A (void){if(flag == 0){P2OUT = ~(0x80>>(i++)); //灯的点亮顺序D8 -> D1}else if(flag == 1){P2OUT = ~(0x01<<(i++)); //灯的点亮顺序D1 -> D8}else{if(dir) //灯的点亮顺序D8 -> D1,D1 -> D8,循环绕圈{P2OUT = ~(0x80>>(i++));}else{P2OUT = ~(0x01<<(i++));}}if(i == 8){i = 0;dir = ~dir;}j++;if(j == 40){i = 0;j = 0;flag++;if(flag == 4) flag = 0;switch(speed){case 0:TACTL &=~ (ID0 + ID1);TACTL |= ID_3;break;case 1:TACTL &=~ (ID0 + ID1);TACTL |= ID_2;break;case 2:TACTL &=~ (ID0 + ID1);TACTL |= ID_1;break;case 3:TACTL &=~ (ID0 + ID1);TACTL |= ID_0;break;default:break;}if(flag != 3) speed++;if(speed == 4) speed = 0;}}/******************************************************* 程序功能:用从P2.3和P2.4输出的PWM波形驱动LED闪烁P2.3口输出方波的占空比为75%P2.4口输出方波的占空比为25%-------------------------------------------------------测试说明:观察LED的亮灭的时间长短*******************************************************/ #include <msp430x14x.h>#include "BoardConfig.h"void main(void){WDTCTL = WDTPW + WDTHOLD; // 关狗BoardConfig(0xb0); // 关闭数码管和电平转换,打开流水灯P2DIR = 0xff; // P2端口设置为输出P2OUT = 0xff; // 关闭其他LEDP2SEL |= BIT3 + BIT4; // P2.3和P2.4连接内部模块CCR0 = 4096-1; // PWM周期为1SCCTL1 = OUTMOD_7; // CCR1 reset/setCCR1 = 3072; // CCR1 PWM duty cycleCCTL2 = OUTMOD_7; // CCR2 reset/setCCR2 = 1024; // CCR2 PWM duty cycleTACTL = TASSEL_1 + ID_3 + MC_1; // ACLK/8, up mode_BIS_SR(LPM3_bits); // Enter LPM3}//****************************************************************************** // MSP-FET430P140 Demo - Basic Clock, Output Buffered SMCLK, ACLK and MCLK//// Description: Output buffered MCLK, SMCLK and ACLK.// ACLK = LFXT1 = 32768, MCLK = DCO Max, SMCLK = XT2// //* XTAL's REQUIRED - NOT INSTALLED ON FET *//// //* Min Vcc required varies with MCLK frequency - refer to datasheet *////// MSP430F149// -----------------// /|\| XIN|-// | | | 32k// --|RST XOUT|-// | |// | XT2IN|-// | | XTAL (455k - 8Mhz)// |RST XT2OUT|-// | |// | P5.4|-->MCLK = DCO Max// | P5.5|-->SMCLK = XT2// | P5.6|-->ACLK = 32kHz//// M. Buccini// Texas Instruments Inc.// Feb 2005// Built with IAR Embedded Workbench Version: 3.21A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"void main(void){BoardConfig(0xb8);WDTCTL = WDTPW +WDTHOLD; // Stop Watchdog Timer DCOCTL = DCO0 + DCO1 + DCO2; // Max DCOBCSCTL1 = RSEL0 + RSEL1 + RSEL2; // XT2on, max RSELBCSCTL2 |= SELS; // SMCLK = XT2P5DIR |= 0x70; // P5.6,5,4 outputsP5SEL |= 0x70; // P5.6,5,5 optionswhile(1){}}//****************************************************************************** // MSP-FET430P140 Demo - Basic Clock, LPM3 Using WDT ISR, 32kHz ACLK//// Description: This program operates MSP430 normally in LPM3, pulsing P3.4// at 4 second intervals. WDT ISR used to wake-up system. All I/O configured// as low outputs to eliminate floating inputs. Current consumption does// increase when LED is powered on P3.4. Demo for measuring LPM3 current.// ACLK= LFXT1/4= 32768/4, MCLK= SMCLK= default DCO// //* External watch crystal on XIN XOUT is required for ACLK *//////// MSP430F149// ---------------// /|\| XIN|-// | | | 32kHz// --|RST XOUT|-// | |// | P3.5|-->LED//// Dasheng// LiTian Electronic Inc.// Feb 2008// Built with IAR Embedded Workbench Version: 3.42A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"void main(void){BoardConfig(0xb8);BCSCTL1 |= DIVA_2; // ACLK/4WDTCTL = WDT_ADL Y_1000; // WDT 1s/4 interval timerIE1 |= WDTIE; // Enable WDT interruptP1DIR = 0xFF; // All P1.x outputsP1OUT = 0; // All P1.x resetP2DIR = 0xFF; // All P2.x outputsP2OUT = 0; // All P2.x resetP3DIR = 0xFF; // All P3.x outputsP3OUT = 0x30; // All P3.x resetP4DIR = 0xFF; // All P4.x outputsP4OUT = 0; // All P4.x resetP5DIR = 0xFF; // All P5.x outputsP5OUT = 0; // All P5.x resetP6DIR = 0xFF; // All P6.x outputsP6OUT = 0x80; // All P6.x resetwhile(1){uint i;_BIS_SR(LPM3_bits + GIE); // Enter LPM3P3OUT &= ~BIT5; // Set P3.5 LED onfor (i = 18000; i>0; i--); // DelayP3OUT |= BIT5; // Clear P3.5 LED off}}#pragma vector=WDT_VECTOR__interrupt void watchdog_timer (void){_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR)}//******************************************************************************* // MSP-FET430P140 Demo - Software Toggle P3.4//// Description: Toggle P3.4 by xor'ing P3.4 inside of a software loop.// ACLK= n/a, MCLK= SMCLK= default DCO ~800k//// MSP430F149// -----------------// --|RST XOUT|-// | |// | P3.4|-->LED//// Dasheng// LiTian Electronic Inc.// Feb 2008// Built with IAR Embedded Workbench Version: 3.42A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"void main(void){BoardConfig(0xb8);WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timerP3DIR |= BIT4; // Set P3.4 to output directionfor (;;){volatile unsigned int i;P3OUT ^= BIT4; // Toggle P3.4 using exclusive-ORi = 50000; // Delaydo (i--);while (i != 0);}}//****************************************************************************** // MSP-FET430P140 Demo - WDT, Toggle P3.4, Interval Overflow ISR, DCO SMCLK//// Description: Toggle P3.4 using software timed by the WDT ISR. Toggle rate// is approximately 30ms based on default ~ 800khz DCO/SMCLK clock source// used in this example for the WDT.// ACLK= n/a, MCLK= SMCLK= default DCO~ 800k//// MSP430F149// -----------------// /|\| XIN|-// | | |// | P3.4|-->LED//// Dasheng// LiTian Electronic Inc.// Feb 2008// Built with IAR Embedded Workbench Version: 3.42A//****************************************************************************** #include <msp430x14x.h>#include "BoardConfig.h"void main(void){BoardConfig(0xbf); //关闭数码管、流水灯和电平转换WDTCTL = WDT_MDLY_32; // Set Watchdog Timer interval to ~30ms IE1 |= WDTIE; // Enable WDT interruptP3DIR |= BIT4; // Set P3.4 to output direction_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}// Watchdog Timer interrupt service routine#pragma vector=WDT_VECTOR__interrupt void watchdog_timer(void){P3OUT ^= BIT4; // Toggle P3.4 using exclusive-OR}//****************************************************************************** // MSP-FET430P140 Demo - WDT, Toggle P3.4, Interval Overflow ISR, 32kHz ACLK//// Description: Toggle P3.4 using software timed by WDT ISR. Toggle rate is// exactly 250ms based on 32kHz ACLK WDT clock source. In this example the// WDT is configured to divide 32768 watch-crystal(2^15) by 2^13 with an ISR// triggered @ 4Hz.// ACLK= LFXT1= 32768, MCLK= SMCLK= DCO~ 800kHz// //* External watch crystal installed on XIN XOUT is required for ACLK *////// MSP430F149// -----------------// /|\| XIN|-// | | | 32kHz// --|RST XOUT|-// | |// | P3.4|-->LED// LiTian Electronic Inc.// Feb 2008// Built with IAR Embedded Workbench Version: 3.42A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"void main(void){BoardConfig(0xb8);WDTCTL = WDT_ADL Y_250; // WDT 250ms, ACLK, interval timer IE1 |= WDTIE; // Enable WDT interruptP3DIR |= BIT4; // Set P3.4 to output direction_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/interrupt}// Watchdog Timer interrupt service routine#pragma vector=WDT_VECTOR__interrupt void watchdog_timer(void){P3OUT ^= BIT4; // Toggle P3.4 using exclusive-OR}//****************************************************************************** // MSP-FET430P140 Demo - Timer_A, Toggle P3.4, CCR0 Cont. Mode ISR, DCO SMCLK//// Description: Toggle P3.4 using software and TA_0 ISR. Toggles every// 50000 SMCLK cycles. SMCLK provides clock source for TACLK.// During the TA_0 ISR, P3.4 is toggled and 50000 clock cycles are added to// CCR0. TA_0 ISR is triggered every 50000 cycles. CPU is normally off and// used only during TA_ISR.// ACLK = n/a, MCLK = SMCLK = TACLK = default DCO ~800kHz//// MSP430F149// ---------------// /|\| XIN|-// | | |// --|RST XOUT|-// | |// | P3.4|-->LED//// Dasheng// Built with IAR Embedded Workbench Version: 3.42A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDTBoardConfig(0xb8); //关闭数码管、流水灯和电平转换P3DIR |= BIT4; // P3.4 outputCCTL0 = CCIE; // CCR0 interrupt enabledCCR0 = 50000;TACTL = TASSEL_2 + MC_2; // SMCLK, contmode_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}// Timer A0 interrupt service routine#pragma vector=TIMERA0_VECTOR__interrupt void Timer_A (void){P3OUT ^= BIT4; // Toggle P3.4CCR0 += 50000; // Add Offset to CCR0}//****************************************************************************** // MSP-FET430P140 Demo - Timer_A, Toggle P3.4, CCR0 Up Mode ISR, DCO SMCLK//// Description: Toggle P3.4 using software and TA_0 ISR. Timer_A is// configured for up mode, thus the timer overflows when TAR counts// to CCR0. In this example, CCR0 is loaded with 20000.// ACLK = n/a, MCLK = SMCLK = TACLK = default DCO ~800kHz//// MSP430F149// ---------------// /|\| XIN|-// | | |// --|RST XOUT|-// | |// | P3.4|-->LED//// Dasheng// LiTian Electronic Inc.// Built with IAR Embedded Workbench Version: 3.42A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDTBoardConfig(0xb8);P3DIR |= BIT4; // P3.4 outputCCTL0 = CCIE; // CCR0 interrupt enabledCCR0 = 20000;TACTL = TASSEL_2 + MC_1; // SMCLK, upmode_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}// Timer A0 interrupt service routine#pragma vector=TIMERA0_VECTOR__interrupt void Timer_A (void){P3OUT ^= BIT4; // Toggle P3.4}// MSP-FET430P140 Demo - Timer_A, Toggle P3.4, Overflow ISR, DCO SMCLK//// Description: Toggle P3.4 using software and Timer_A overflow ISR.// In this example an ISR triggers when TA overflows. Inside the TA// overflow ISR P3.4 is toggled. Toggle rate is approximatlely 12Hz.// Proper use of the TAIV interrupt vector generator is demonstrated.// ACLK = n/a, MCLK = SMCLK = TACLK = default DCO ~800kHz//// MSP430F149// ---------------// /|\| XIN|-// | | |// --|RST XOUT|-// | |// | P3.4|-->LED//// Dasheng// LiTian Electronic Inc.// Feb 2008// Built with IAR Embedded Workbench Version: 3.42A#include <msp430x14x.h>#include "BoardConfig.h"void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDTBoardConfig(0xb8);P3DIR |= BIT4; // P3.4 outputTACTL = TASSEL_2 + MC_2 + TAIE; // SMCLK, contmode, interrupt_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}// Timer_A3 Interrupt Vector (TAIV) handler#pragma vector=TIMERA1_VECTOR__interrupt void Timer_A(void){switch( TAIV ){case 2: break; // CCR1 not usedcase 4: break; // CCR2 not usedcase 10: P3OUT ^= BIT4; // overflowbreak;}}//****************************************************************************** // MSP-FET430P140 Demo - Timer_A, Toggle P3.4, Overflow ISR, 32kHz ACLK//// Description: Toggle P3.4 using software and the Timer_A overflow ISR.// In this example an ISR triggers when TA overflows. Inside the ISR P3.4// is toggled. Toggle rate is exactly 0.5Hz. Proper use of the TAIV interrupt// vector generator is demonstrated.// ACLK = TACLK = 32768Hz, MCLK = SMCLK = default DCO ~800kHz// //* An external watch crystal on XIN XOUT is required for ACLK *////// MSP430F149// ---------------// /|\| XIN|-// | | | 32kHz// --|RST XOUT|-// | |// | P3.4|-->LED//// Dasheng// Feb 2008// Built with IAR Embedded Workbench Version: 3.42A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDTBoardConfig(0xb8);P3DIR |= BIT4; // P3.4 outputTACTL = TASSEL_1 + MC_2 + TAIE; // ACLK, contmode, interrupt_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt}// Timer_A3 Interrupt Vector (TAIV) handler#pragma vector=TIMERA1_VECTOR__interrupt void Timer_A(void){switch( TAIV ){case 2: break; // CCR1 not usedcase 4: break; // CCR2 not usedcase 10: P3OUT ^= BIT4; // overflowbreak;}}#include <msp430x14x.h>#include "BoardConfig.h"void main(void){WDTCTL = WDTHOLD + WDTPW; // 关看门狗BoardConfig(0xb0); //开流水灯,关数码管和电平转换CACTL1 = CARSEL + CAREF0 + CAON ; // Vcc/4 = - cmpCACTL2 = P2CA0; // 使用CA0P2DIR = 0xff;P2OUT = 0xff;while(1){if((CACTL2 | 0xfe) ==0xff){ // 比较电压是否超过0.25VccP2OUT &= ~BIT4;CACTL1 &= 0xfe; // CAIFG = 0}else{P2OUT |= BIT4;}}}// MSP-FET430P140 Demo - Flash In-System Programming, Copy SegA to SegB//// Description: This program first erases flash seg A, then it increments all// values in seg A, then it erases seg B, then copies seg A to seg B.// Assumed MCLK 550kHz - 900kHz.// //* Set Breakpoint on NOP in the Mainloop to avoid Stressing Flash *////// MSP430F149// -----------------// /|\| XIN|-// | | |// --|RST XOUT|-// | |//// M. Mitchell// Texas Instruments Inc.// Feb 2005// Built with IAR Embedded Workbench Version: 3.21A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"uchar value; // 8-bit value to write to segment Auchar DataBuffer[128];// Function prototypesvoid write_SegA (uchar value);void copy_A2B (void);{BoardConfig(0xb8);WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timerFCTL2 = FWKEY + FSSEL0 + FN0; // MCLK/2 for Flash Timing Generator value = 0; // Initialize valuewhile(1) // Repeat forever{write_SegA(value++); // Write segment A, increment valuecopy_A2B(); // Copy segment A to B_NOP(); // SET BREAKPOINT HERE}}void write_SegA (uchar value){uchar *Flash_ptr; // Flash pointeruint i;Flash_ptr = (uchar *) 0x1080; // Initialize Flash pointerFCTL1 = FWKEY + ERASE; // Set Erase bitFCTL3 = FWKEY; // Clear Lock bit*Flash_ptr = 0; // Dummy write to erase Flash segmentFCTL1 = FWKEY + WRT; // Set WRT bit for write operationfor (i=0; i<128; i++){*Flash_ptr++ = value; // Write value to flash}FCTL1 = FWKEY; // Clear WRT bitFCTL3 = FWKEY + LOCK; // Set LOCK bit}void copy_A2B (void){uchar *Flash_ptrA; // Segment A pointeruchar *Flash_ptrB; // Segment B pointeruint i;Flash_ptrA = (uchar *) 0x1080; // Initialize Flash segment A pointerFlash_ptrB = (uchar *) 0x1000; // Initialize Flash segment B pointerFCTL1 = FWKEY + ERASE; // Set Erase bitFCTL3 = FWKEY; // Clear Lock bit*Flash_ptrB = 0; // Dummy write to erase Flash segment B FCTL1 = FWKEY + WRT; // Set WRT bit for write operationfor (i=0; i<128; i++){DataBuffer[i] = *Flash_ptrA++;*Flash_ptrB++ = DataBuffer[i]; // Copy value segment A to segment B}FCTL1 = FWKEY; // Clear WRT bitFCTL3 = FWKEY + LOCK; // Set LOCK bit}// MSP-FET430P140 Demo - USART0, Ultra-Low Pwr UART 2400 Echo ISR, 32kHz ACLK //// Description: Echo a received character, RX ISR used. In the Mainloop UART0// is made ready to receive one character with interrupt active. The Mainloop// waits in LPM3. The UART0 ISR forces the Mainloop to exit LPM3 after// receiving one character which echo's back the received character.// ACLK = UCLK0 = LFXT1 = 32768, MCLK = SMCLK = DCO~ 800k// Baud rate divider with 32768hz XTAL @2400 = 32768Hz/2400 = 13.65 (000Dh)// //* An external watch crystal is required on XIN XOUT for ACLK *////// MSP430F149// -----------------// /|\| XIN|-// | | | 32kHz// --|RST XOUT|-// | |// | P3.4|----------->// | | 2400 - 8N1// | P3.5|<-----------////// M. Buccini// Texas Instruments Inc.// Feb 2005// Built with IAR Embedded Workbench Version: 3.21A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"void main(void){BoardConfig(0xb8);WDTCTL = WDTPW + WDTHOLD; // Stop WDTP3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXDME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXDUCTL0 |= CHAR; // 8-bit characterUTCTL0 |= SSEL0; // UCLK = ACLKUBR00 = 0x0D; // 32k/2400 - 13.65UBR10 = 0x00; //UMCTL0 = 0x6B; // ModulationUCTL0 &= ~SWRST; // Initialize USART state machineIE1 |= URXIE0; // Enable USART0 RX interrupt// Mainloopfor (;;){_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/interruptwhile (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?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)}//****************************************************************************** // MSP-FET430P140 Demo - USART0, Ultra-Low Pwr UART 9600 Echo ISR, 32kHz ACLK //// Description: Echo a received character, RX ISR used. In the Mainloop UART0// is made ready to receive one character with interrupt active. The Mainloop// waits in LPM3. The UART0 ISR forces the Mainloop to exit LPM3 after// receiving one character which echo's back the received character.// ACLK = UCLK0 = LFXT1 = 32768, MCLK = SMCLK = DCO~ 800k// Baud rate divider with 32768hz XTAL @9600 = 32768Hz/9600 = 3.41 (0003h 4Ah )// //* An external watch crystal is required on XIN XOUT for ACLK *////// MSP430F149// -----------------// /|\| XIN|-// | | | 32kHz// --|RST XOUT|-// | |// | P3.4|----------->// | | 9600 - 8N1// | P3.5|<-----------////// M. Buccini// Texas Instruments Inc.// Feb 2005// Built with IAR Embedded Workbench Version: 3.21A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"void main(void){BoardConfig(0xb8);WDTCTL = WDTPW + WDTHOLD; // Stop WDTP3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXDME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXDUCTL0 |= CHAR; // 8-bit characterUTCTL0 |= SSEL0; // UCLK = ACLKUBR00 = 0x03; // 32k/9600 - 3.41UBR10 = 0x00; //UMCTL0 = 0x4A; // ModulationUCTL0 &= ~SWRST; // Initialize USART state machineIE1 |= URXIE0; // Enable USART0 RX interrupt// Mainloopfor (;;){_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/interruptwhile (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?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)}//****************************************************************************** // MSP-FET430P140 Demo - USART0, UART 19200 Echo ISR, XT2 HF XTAL ACLK//// Description: Echo a received character, RX ISR used. Normal mode is LPM0,// USART0 RX interrupt triggers TX Echo. Though not required, MCLK = XT2.// ACLK = n/a, MCLK = SMCLK = UCLK0 = XT2 = 8MHz// Baud rate divider with 8Mhz XTAL @19200 = 8MHz/19200 = 416.66 ~ 417 (01A0h)// //* An external 8MHz XTAL on X2IN X2OUT is required for XT2CLK *//// //* Min Vcc required varies with MCLK frequency - refer to datasheet *//////// MSP430F149// -----------------// /|\| XT2IN|-// | | | 8Mhz// --|RST XT2OUT|-// | |// | P3.4|------------>// | | 19200 - 8N1// | P3.5|<------------////// M. Buccini// Texas Instruments Inc.// Feb 2005// Built with IAR Embedded Workbench Version: 3.21A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"void main(void){volatile unsigned int i;BoardConfig(0xb8);P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXDWDTCTL = WDTPW + WDTHOLD; // Stop WDTBCSCTL1 &= ~XT2OFF; // XT2ondo{IFG1 &= ~OFIFG; // Clear OSCFault flagfor (i = 0xFF; i > 0; i--); // Time for flag to set}while ((IFG1 & OFIFG)); // OSCFault flag still set?BCSCTL2 |= SELM_2 + SELS; // MCLK = SMCLK = XT2 (safe)ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD UCTL0 |= CHAR; // 8-bit characterUTCTL0 |= SSEL1; // UCLK = SMCLKUBR00 = 0xA0; // 8Mhz/19200 ~ 417UBR10 = 0x01; //UMCTL0 = 0x00; // no modulationUCTL0 &= ~SWRST; // Initialize USART state machine IE1 |= URXIE0; // Enable USART0 RX interrupt_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}#pragma vector=UART0RX_VECTOR__interrupt void usart0_rx (void){while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready? TXBUF0 = RXBUF0; // RXBUF0 to TXBUF0}// MSP-FET430P140 Demo - USART0, UART 115200 Echo ISR, XT2 HF XTAL ACLK //// Description: Echo a received character, RX ISR used. Normal mode is LPM0,// USART0 RX interrupt triggers TX Echo. Though not required, MCLK= XT2.// ACLK = n/a, MCLK = SMCLK = UCLK0 = XT2 = 8MHz// Baud rate divider with 8Mhz XTAL = 8000000/115200 = 0069 (0045h)// //* An external 8MHz XTAL on X2IN X2OUT is required for XT2CLK *//// //* Min Vcc required varies with MCLK frequency - refer to datasheet *//////// MSP430F149// -----------------// /|\| XT2IN|-// | | | 8Mhz// --|RST XT2OUT|-// | |// | P3.4|------------>// | | 115200 - 8N1// | P3.5|<------------////。

MSP430单片机的应用实例

MSP430单片机的应用实例

MSP430单片机的应用实例阚世俊B首先来了解什么是单片机,什么是msp30 单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。

概括的讲:一块芯片就成了一台计算机。

它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。

同时,学习使用单片机了解计算机原理与结构的最佳选择。

可以说,二十世纪跨越了三个“电”的时代,即电气时代、电子时代和现已进入的电脑时代。

不过,这种电脑,通常是指个人计算机,简称PC机。

它由主机、键盘、显示器等组成(如图1所示)。

还有一类计算机,大多数人却不怎么熟悉。

这种计算机就是把智能赋予各种机械的单片机(亦称微控制器,如图2所示)。

顾名思义,这种计算机的最小系统只用了一片集成电路,即可进行简单运算和控制。

因为它体积小,通常都藏在被控机械的“肚子”里。

它在整个装置中,起着有如人类头脑的作用,它出了毛病,整个装置就瘫痪了。

现在,这种单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。

各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词——“智能型”,如智能型洗衣机等。

现在有些工厂的技术人员或其它业余电子开发者搞出来的某些产品,不是电路太复杂,就是功能太简单且极易被仿制。

究其原因,可能就卡在产品未使用单片机或其它可编程逻辑器件上。

目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。

导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录象机、摄象机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。

更不用说自动控制领域的机器人、智能仪表、医疗器械了。

因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。

MSP430系列单片机是美国德州仪器(TI)1996年开始推向市场的一种16位超低功耗的混合信号处理器(Mixed Signal Processor)。

MSP430系列十六位超低功耗单片机教学实验系统实验教程

MSP430系列十六位超低功耗单片机教学实验系统实验教程
另外,MSP430 系列单片机采用矢量中断,支持十多个中断源,并可以任意嵌套。用中断请求将 CPU 唤醒只要 6us,通过合理编程,既以降低系统功耗,又可以对外部事件请求作出快速响应。
在这里.需要对低功耗问题作一些说明。 首先,对一个处理器而言,活动模式时的功耗必须与其性能一起来考察、衡量,忽略性能来看功耗是 片面的。在计算机体系结构中,是用 W/MIPS(瓦特/百万指令每秒)来衡量处理器的功耗与性能关系的, 这种标称方法是合理的。MSP430 系列单片机在活动模式时耗电 250uA/MIPS,这个指标是很高的(传统 的 Mcs51 单片机约为 10~20mA/MIPS)。 其次,作为一个应用系统,功耗是整个系统的功耗,而不 仅仅是处理器的功耗。比如,在一个有多个输入信号的应用系统中,处理器输入端口的漏电流对系统的耗 电影响就较大了。MSP430 单片机输入端口的漏电流最大为 50nA,远低于其他系列单片机(一般为 l~10uA)。 另外,处理器的功耗还要看它内部功能模块是否可以关闭.以及模块活动情况下的耗电.比如低电压 监测电路的耗电等。还要注意,有些单片机的某些参数指标中.虽然典型值可能很小,但最大值和典型值 相差数十倍,而设计时要考虑到最坏情况,就应该关心参数标称的最大值,而不是典型值。总体而言, MSP430 系列单片机堪称目前世界上功耗最低的单片机,其应用系统可以做到用一枚电池使用 10 年。
MSP430 系列单片机有独特的时钟系统设计,包括两个不同的时钟系统:基本时钟系统和锁频环(FLL 和 FLL+)时钟系统或 DCO 数字振荡器时钟系统。由时钟系统产生 CPU 和各功能模块所需的时钟,并且这 些时钟可以在指令的控制下打开或关闭,从而实现对总体功耗的控制。由于系统运行时使用的功能模块不 同,即采用不同的工作模式,芯片的功耗有明显的差异。在系统中共有种活动模式(AM)和 5 种低功耗模式 (LPM0~LPM4)。

【免费下载】MSP430单片机的应用实例

【免费下载】MSP430单片机的应用实例

MSP430单片机的应用实例阚世俊B12050229首先来了解什么是单片机,什么是msp30 单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。

概括的讲:一块芯片就成了一台计算机。

它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。

同时,学习使用单片机了解计算机原理与结构的最佳选择。

可以说,二十世纪跨越了三个“电”的时代,即电气时代、电子时代和现已进入的电脑时代。

不过,这种电脑,通常是指个人计算机,简称PC机。

它由主机、键盘、显示器等组成(如图1所示)。

还有一类计算机,大多数人却不怎么熟悉。

这种计算机就是把智能赋予各种机械的单片机(亦称微控制器,如图2所示)。

顾名思义,这种计算机的最小系统只用了一片集成电路,即可进行简单运算和控制。

因为它体积小,通常都藏在被控机械的“肚子”里。

它在整个装置中,起着有如人类头脑的作用,它出了毛病,整个装置就瘫痪了。

现在,这种单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。

各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词——“智能型”,如智能型洗衣机等。

现在有些工厂的技术人员或其它业余电子开发者搞出来的某些产品,不是电路太复杂,就是功能太简单且极易被仿制。

究其原因,可能就卡在产品未使用单片机或其它可编程逻辑器件上。

目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。

导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录象机、摄象机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。

更不用说自动控制领域的机器人、智能仪表、医疗器械了。

因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。

MSP430单片机入门基础例程1

MSP430单片机入门基础例程1

作者:DC 微控技术论坛原创 MSP430单片机入门基础例程若想了解MSP430单片机常用模块应用原理,请下载<<MSP430F常用模块应用原理>>/datasheet/msp430/msp430base/MSP430register_guide.pdf由于IO应用原理比较简单,所以我主要以MC430F14开发板的实例来讲解。

新手用户可以参与其应用思路。

计划推出几个有价值的参考例程:[1]直接IO按键检测处理程序(非低功耗方式)[2]IO口中断演示程序[3]利用IO中断方式实现按键检测程序(低功耗方式)实验制作如下图,新手用户轻松地在MC430F14开发板上实现。

例程[1]://MSP430F14-直接IO口按键检处理程序/*************************************************************************///以下是结合MC430F14开发板来实现的按键检处理程序实验.//分别使用了采个三个按键接到MSP430的通用IO口,按任意一个按键可以使板上的LED反转.//例程中,按键采用不断查询方式,以得到键值.并没有使用到低功耗.此程序结构比较适合//用在非手持设备或非电池供电的设计中.此程序结构比较通用,级用户可参与或套用修改. //应用目标板: MC430F14开发板/*************************************************************************/#include <msp430x14x.h>//初级用户要习惯采用宏定义,以方便的编写和修改#define keyio 0xf8 //定义按键IO口,Px0-Px2 IO口.#define key_1 0xfe //定义返回键值1#define key_2 0xfd //定义返回键值2#define key_3 0xfb //定义返回键值3//声明子程序unsigned char key_chcek(void);void display_update(unsigned char dta);void key_process_0(void);void key_process_1(void);void key_process_2(void);//*************************************************************************//将单片机初始化程序放在main()前面是方便查看单片机的初始化状态情况.void MCU_int(void){//默认MCLK主时钟频率为DCO=~800KP1OUT |= BIT1; //设置LED,上电为灭.电路可以查看MC430F14电路图.P1DIR |= BIT1; //P1.1设置为输出.//MSP430单片机IO口上电默认方向为输入,所以接按键的IO无需再设为输入.}//************************************************************************* void main (void){ unsigned char key_value; //定义键值全局变是WDTCTL = WDTPW + WDTHOLD; //关狗MCU_int(); //初始化单片机while(1) //主程序主循环{key_value=key_chcek(); //检测,有键按下并松开,返回一个键值.switch (key_value) //对键值进行处理.采switch语法结构查询{case key_1: key_process_0(); //调用键处理程序1break;case key_2: key_process_1(); //调用键处理程序2break;case key_3: key_process_2(); //调用键处理程序2break;default: ; //调用键处理程序4break;}display_update(key_value); //如果有需要可以在这里加上显示更新程序.key_value=0x00; //最后清除键值.将继续主循环.}}//*************************************************************************//按键检测程序//返回值: 无符号字符型键值unsigned char key_chcek(void){unsigned int i;unsigned char timp,active;active=0;while(!active){while(0xff ==( P2IN | keyio)); //一直等待有键按下timp = P2IN | 0xf8; //若有键接下了,则读入IO状态.for(i=0;i<7000;i++); //延时,是为了去按键抖动.if (timp ==(P2IN | 0xf8)) //经延时后,还是那键吗?{ active = 1; //是,则按键有效.while(0xff !=( P2IN | keyio)); //一直等待按键松开}else{ //去按键抖动后读入的键值与之前不同.则先效. active = 0; //再循环检测.}}return timp; //返回一个键值.}//************************************************************************* void key_process_0(void) //值处理,用户可以自己修改...{P1OUT ^= BIT1;}//*************************************************************************void key_process_1(void) //值处理,用户可以自己修改...{P1OUT ^= BIT1;}//************************************************************************* void key_process_2(void) //值处理,用户可以自己修改...{P1OUT ^= BIT1;}//************************************************************************* void display_update(unsigned char dta){; //用户可以根据需要来放置显示程序,如LCD,LED,Digital-LED....//灵活应用,}//************************************************************************* 例程[2]://MSP430F14-IO口中断演示程序/*************************************************************************/ //以下是结合MC430F14开发板来实现的按键检处理程序实验.//设置P2.0为中断口,通过对IO的下边沿触发,使其中断,并将板上的D2 LED取反. //应用目标板: MC430F14开发板/*************************************************************************/ #include <msp430x14x.h>void main(void){WDTCTL = WDTPW + WDTHOLD; // 停止看门狗P1DIR |= BIT1; // 设P1.1为输出P2IE |= BIT0; // P2.0中断使能P2IES |= BIT0; // P2.0 IO口边沿中断触发模式,下边沿有效 P2IFG &= ~BIT0; // P2.0 清IO中断标志位_EINT(); //开总中断允许LPM4; //进入低功耗模式4,此时单片机功耗最低.}//************************************************************************* // P2口中断服务程序#pragma vector=PORT2_VECTOR__interrupt void Port_2(void){P1OUT ^= BIT1; // P1.1取反P2IFG &= ~0x01; // P2.0清除相应中断标志位}//************************************************************************* //使IO中断时新手们要了解以下几点://1- MSP430的IO中,只有P1,P2才有IO中断功能.//2- P1,P2每组IO是多源中断源,P1IG0-P1IG7或P2IG0-P2IG7是共一个中断源的,用户可以//通过查房方式来得到是那个IO产生了中断.//3- 改变P1IES或P2IES中的位可能会引起相应中断标志位置位,与引脚电平有关.// PxIES.x PxIN.x PxIFG.x// 0->1 0 不变// 0->1 1 可能置位// 1->0 0 可能置位// 1->0 1 不变//所以,改变P1IES或P2IES后,根据需要清除相关的PxIG.x位.//4- PxIFG.x所有中断标志位在置位后是需要人为清除的.硬件不会自动清除该标位.DC,2007-01-27 02:47:12例程[3]://MSP430F14-利用IO中断方式实现按键检测程序/*************************************************************************///以下是结合MC430F14开发板来实现的按键检处理程序实验.//分别使用了采个三个按键接到MSP430的通用IO口,按任意一个按键可以使板上的LED反转.//例程中,单片机一直处于最低功耗状态,用户可以通过按下按键后唤醒单片机.单片机唤醒//后再进行去抖动动作.同时执行键处理程序.处理完后再次进入LPM4低功耗模式.//在本程序中用户可以灵活地修改程序来实现你相关的功能.//本程序适用在手持设备或电池供电的设计中.此程序结构比较通用,级用户可参与或套用修改.//应用目标板: MC430F14开发板/*************************************************************************/#include <msp430x14x.h>#define key1 0x01#define key2 0x02#define key3 0x04#define delay_small 200#define key_1 0xfe //定义返回键值1#define key_2 0xfd //定义返回键值2#define key_3 0xfb //定义返回键值3void key_process_0(void);void key_process_1(void);void key_process_2(void);void key_check (void);unsigned char key_value; //定义键值全局变是//************************************************************************* void main(void){WDTCTL = WDTPW + WDTHOLD; // 停止看门狗P1OUT |= BIT1; //关LEDP1DIR |= BIT1; // 设置P1.1为输出//以下设置是采用不同的编写方式,新手可以参考使用P2IE |= BIT0+BIT1+BIT2; // P2.0-P2.2 IO口中断使能P2IES |= 0x07; // P2.0-P2.2 IO口边沿触发中断方式设置 P2IFG &= ~(key1+key2+key3); // P2.0-P2.2 IO口中断标志位清除_EINT(); //中断允许// 或直接写成 _BIS_SR(LPM4_bits + GIE);LPM4; // 进入低功耗LPM4,此时单片机功耗最低while(1){P2IE &= ~(BIT0+BIT1+BIT2); // P2.0-P2.2 IO口关闭中断允许P2IFG &= ~0x07; // P2.0-P2.2 IO口中断标志位清除key_check ();switch (key_value) //对键值进行处理.采switch语法结构查询 {case key_1: key_process_0(); //调用键处理程序1break;case key_2: key_process_1(); //调用键处理程序2break;case key_3: key_process_2(); //调用键处理程序2break;default: break;}key_value=0x00; //键值清除P2IE |= BIT0+BIT1+BIT2; // P2.0-P2.2 IO口中断使能P2IFG &= ~0x07; // P2.0-P2.2 IO口中断标志位清除LPM4;}}//************************************************************************* //P2中断服务程序#pragma vector=PORT2_VECTOR__interrupt void Port_2(void){switch (P2IFG){case 0x01: key_value=0xfe;break;case 0x02: key_value=0xfd;break;case 0x04: key_value=0xfb;break;default: P2IFG &= ~0x07; // P2.0-P2.2 IO口中断标志位清除break;}P2IFG &= ~0x07; // P2.0-P2.2 IO口中断标志位清除LPM4_EXIT;}//************************************************************************* void key_process_0(void) //值处理,用户可以自己修改...{P1OUT ^= BIT1;}//************************************************************************* void key_process_1(void) //值处理,用户可以自己修改...{P1OUT ^= BIT1;}//************************************************************************* void key_process_2(void) //值处理,用户可以自己修改...{P1OUT ^= BIT1;}//************************************************************************** void key_check (void){ unsigned int i;for(i=0;i<delay_small;i++); //延时去抖动if(0xff !=(P2IN & 0xf8)) //是否有键存在?{while(0xff !=( P2IN | 0xf8)); //一直等待按键松开}elsekey_value = 0x00; //延时去抖动无键按下,则清除键变量.}//**************************************************************************//如果在按键电路中加RC滤波电路,实现按键去抖动的效果会更显著此.DC,2007-01-30 00:37:31已更新!jdgxcu,2007-02-04 22:03:10顶,对初学很实用,不知怎么加入RC去抖DC,2007-02-04 22:39:45按键与IO之间加一个RC电路:IO口与按键之前加一个电阻,在IO口那端并一个电容下地。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

几个msp430单片机的重点例程#include "msp430x14x.h"#include "ioport.h"//按键按下,则P1.0状态取反键盘检测void main(void){sys_init();port_init();while(1){while((P1IN&0xf0)==0xf0){}; // 等待有键按下delay(10000); //软件去抖if((P1IN&0xf0)!=0xf0){switch (P1IN&0xf0){case 0xe0:{ //S1键按下处理...P1OUT ^=BIT0;}break;case 0xd0:{ //S2键按下处理...P1OUT ^=BIT0;}break;case 0xb0:{ //S3键按下处理...P1OUT ^=BIT0;}break;case 0x70:{ //S4键按下处理...P1OUT ^=BIT0;}break;default:{P1OUT ^=BIT0;} break;}}}}//***************************************************************************** *//调试成功,自发自收,发0x55,波特率1200bps,格式为:起始位+d0+d1+d2+d3+d4+d5+d6+d7 共8位// Baud rate divider with 32768Hz = 32768Hz/1200 = ~27.31 32768/1200=27.31// ACLK =32768HZ//// MSP430F149// -----------------// /|\| XIN|-// | | |// --|RST XOUT|-// | |// | P3.4/UCA0TXD|------------>// | | 1200 - 8N1// | P3.5/UCA0RXD|<------------////***************************************************************************** *#include "msp430x14x.h"void main(void){ unsigned char revbuf;WDTCTL = WDTPW + WDTHOLD; // Stop WDTP3SEL = 0x30; // P3.4,5 = USCI_A0 TXD/RXDUTCTL0 |= SSEL0; // ACLKUBR00 = 0x1b; // 32768Hz 1200; (27.31)decimal = 1bh UBR10 = 0; // 32768Hz 1200UMCTL0 = 0x03; // Modulation UCBRSx = 1U0CTL |=CHAR+PENA+SPB; //发送字节U0ME |= UTXE0+URXE0;U0CTL &= ~SWRST; // **Initialize USCI state machine**IE1 |= URXIE0; // Enable USCI_A0 RX interruptU0TXBUF =0x55;while(1){__bis_SR_register(LPM0_bits + GIE); // Enter LPM0, interrupts enabledrevbuf=U0RXBUF;revbuf=U0RXBUF;}}void delay(unsigned char t) //150 us{unsigned char i,j;for(i=0;i<t;i++)for(j=0;j<30;j++){;}}// Echo back RXed character, confirm TX buffer is ready first#pragma vector=USART0RX_VECTOR__interrupt void USART0RX_ISR(void){while (!(IFG1&UTXIFG0)); // USCI_A0 TX buffer ready?U0TXBUF = U0RXBUF; // TX -> RXed characterdelay(80);}定时不十分准确,与DCO频率不精确有关,需要根据实际时钟频率计算,如果需要精确定时,可使用外接高稳定度的晶振#include "msp430x14x.h" //TAunsigned int const10ms=0 ;void PortInit(){P1DIR |=BIT0; // P1.0 LED}void timerA_Init() //定时1ms{TACTL=TASSEL_2+TACLR; //定时器A时钟源为SMCLK,并清TAR,关溢出中断TAIE=0TACCR0 =8000;// //计数值为8000个SMCLK周期(8M SMCLK时钟,若定时1ms,则TBCCR0初值为1000/(1/8)=8000)TACCTL0 &=~CCIE; //CCR0中断禁止}void main(void){WDTCTL=WDTPW+WDTHOLD; //关看门狗}//XT2调试成功: 450kHz ~ 8MHz,该程序未调试,仅供参考。

//************************************************************************* *****//// MSP430x149// -----------------// /|\| XIN|-// | | | 32KHz// --|RST XOUT|-// | |// | XT2IN|-// | | 8.00355MHz// | XT2OUT|-// | |// | P1.0|-->LED// | P5.4/MCLK|-->MCLK = XT2 HFXTAL////************************************************************************* *****#include <msp430x14x.h>unsigned char const10ms=0;void sys_Init(){ unsigned char i;WDTCTL = WDTPW+WDTHOLD; // Stop WDTBCSCTL1 &= ~XT2OFF; // Activate XT2 high freq xtaldo{IFG1 &= ~OFIFG; // Clear OSCFault flagfor (i = 0x47FF; i > 0; i--); // Time for flag to set}while ((IFG1 & OFIFG)); // OSCFault flag still set?BCSCTL2 |= SELM_2+SELS; // ***MCLK = XT2 HF XTAL (safe) ****SMCLK= XT2 HF XTAL******P1DIR |=BIT0;}void timerA_Init() //定时1ms{TACTL=TASSEL_2+TACLR; //定时器A时钟源为SMCLK,并清TAR,关溢出中断TAIE=0TACCR0 =8000;//298; //计数值为8000个SMCLK周期(8M SMCLK时钟,若定时1ms,则TBCCR0初值为1000/(1/8)=8000)TACCTL0 |=CCIE; //CCR0中断使能}#pragma vector = TIMERA0_VECTOR //ccr0中断服务__interrupt void ta0_isr(void){unsigned long x;const10ms++;if(const10ms==2) //2ms到则取反//(实际1分钟闪烁94次){ P1OUT ^= 0x01;const10ms=0;}TACCR0+=8000;}void main(void){volatile unsigned int i;sys_Init();timerA_Init();TACTL |=MC1; //连续模式_BIS_SR(CPUOFF+GIE);}此程序为位移测量程序,涉及到AD转换、按键、LCD显示器、产生PWM波形、定时器定时等内容。

程序基于MSP430F247完成,调试成功,pwm模块程序可以参考msp430x24x_tb_10.C (多路PWM)#include "msp430x24x.h"#include "lcd.h"// 使用P1.4 、P1.5、P1.6、P1.7作为键盘口// 按键使用说明:S1: 步进+;S2:步进-;S4:确认后启动电机//#define STD 2000 //-20.00mm --- +20.00mm#define K1 -3.1904#define B1 8359.5#define K2 -5.2092#define B2 9858.5#define K3 -2.4068#define B3 1920.9unsigned int D = 5115;unsigned char dsign=0; //D的符号unsigned int currstd=1330; //当前位移,显示在第三行0x8cunsigned char currsign=0; //当前位移的符号unsigned int jddistance;unsigned int setstd=0x00; //设置值,显示在第四行0x9bunsigned char setdsign=0; //设置值的符号unsigned int setjddistance=2000; //设置的绝对位移unsigned long daccx,daccy=0; //采样值累加平均unsigned int const500ms=0 ; //500ms累加unsigned char motorstartup=0; //步进电机启动停止控制unsigned char fororback=0; //前进0或后退1 全局变量unsigned int motorspeed;unsigned char endflag=0; //定位unsigned char mode=0;void motor_Init(){CCR0 = 512-1; // PWM Period 64HZCCTL1 = OUTMOD_7; // CCR1 reset/setCCR1 = 400; // CCR1 PWM duty cycle 实验结果,由于与非门反相,脉宽越大电机越慢P2OUT &=~BIT2;}void motor_startup(){TACTL = TASSEL_1 + MC_1;}void motor_ctl(unsigned int speed,unsigned char dir){CCR1 = speed;if(dir==0) //电机正转:{ P1OUT &=~BIT0; //P1.0输出低}else //电机反转:{ P1OUT |=BIT0; //P1.0输出高}}void timerB_Init() //定时1ms{TBCTL=TBSSEL_2+TBCLR; //定时器A时钟源为SMCLK,并清TAR,关溢出中断TAIE=0TBCCR0 =16000; //298; //计数值为16000个SMCLK周期TBCCTL0 |=CCIE; //CCR0中断使能}void AD_INI(void) //ADS7818初始化{UCA0CTL1 |=UCSSEL1; //时钟源选择SMCLK,1MHZ DCOCLKUCA0CTL0 |=UCMST+UCSYNC+UCCKPL+UCMSB;//spi主机模式,spi通讯,时钟极性选为高电平无效,选择最高有效位先发UCA0BR1=0; //1000000/1=1000000UCA0BR0=2;UCA0MCTL=0;}unsigned int AD_TRANSF(void) //启动一次AD转换,返回12位AD 转换值{ unsigned int n;unsigned int rec_data16=0;UCA0CTL1 &=~UCSWRST; //进入SPI工作模式P3OUT|=BIT1;for(n=10;n>0;n--);P3OUT&=~BIT1;UCA0TXBUF=0; //主机首先发一帧,发1MHZ时钟while(!(UCA0RXIFG&IFG2)); //查询接收标志位IFG2&=~UCA0RXIFG;rec_data16=UCA0RXBUF; //将收到的高8位数据放入rec_data16 rec_data16<<=8; //最高位始终为0UCA0TXBUF=0; //发1MHZ时钟while(!(UCA0RXIFG&IFG2)); //查询接收标志位IFG2&=~UCA0RXIFG;rec_data16=rec_data16+UCA0RXBUF; //将收到的低8位数据放入rec_data16 rec_data16>>=3; //获取12位数据P3OUT|=BIT1;return (rec_data16);}unsigned int AD2_TRANSF(void) //启动一次AD转换,返回12位AD转换值{ unsigned int n;unsigned int rec_data16=0;UCA0CTL1 &=~UCSWRST; //进入SPI工作模式P2OUT|=BIT1;for(n=10;n>0;n--);P2OUT&=~BIT1;UCA0TXBUF=0; //主机首先发一帧,发1MHZ时钟while(!(UCA0RXIFG&IFG2)); //查询接收标志位IFG2&=~UCA0RXIFG;rec_data16=UCA0RXBUF; //将收到的高8位数据放入rec_data16 rec_data16<<=8; //最高位始终为0UCA0TXBUF=0; //发1MHZ时钟while(!(UCA0RXIFG&IFG2)); //查询接收标志位IFG2&=~UCA0RXIFG;rec_data16=rec_data16+UCA0RXBUF; //将收到的低8位数据放入rec_data16 rec_data16>>=3; //获取12位数据P2OUT|=BIT1;return (rec_data16);}#pragma vector = TIMERB0_VECTOR //1ms中断__interrupt void ta0_isr(void){float floatx;const500ms++;daccx+=AD_TRANSF(); //整形转长整形,以0.01mm为基本单位daccy+=AD2_TRANSF();if(const500ms%20==0){ daccx=daccx/20;daccy=daccy/20;if(daccx>daccy){dsign=0;D=(daccx-daccy)*10000/(daccx+daccy); }else if(daccx<daccy){dsign=1;D=(daccy-daccx)*10000/(daccx+daccy); }else {dsign=0,D=0;}daccx=0;daccy=0;/* 由D值得到currstd和currsign*//*首先按公式计算计算绝对位移*/floatx=D;if(dsign==0){if(D>=6400){jddistance=(D-B1)/K1;}else {jddistance=(D-B2)/K2;}}else{if(D>=4948){jddistance=(D+B3)/(-K3);}else{jddistance=(D+B2)/(-K2);}}/*由绝对位移确定currsign,currstd,以便显示*/if(jddistance>=2000){currsign=0;currstd=jddistance-2000;}else {currsign=1;currstd=2000-jddistance;}/*控制直流电机*/if(motorstartup!=0) //若电机开{if((((jddistance-setjddistance)<10)||((setjddistance-jddistance)<10))){// motor_ctl(500,0);// motor_ctl(500,1);P1SEL &=~0x04; //P1.2=0P1OUT |= 0x04;TACTL &= 0xcf;motorstartup=0x00;endflag=~endflag;P2OUT |=BIT2;}else{if(jddistance<=setjddistance){fororback=0x00;}else {fororback=~0x00;}if(((jddistance-setjddistance)<400)||((setjddistance-jddistance)<400)){if(fororback==0x00){motor speed=450;}else{motorspeed=420;}} //速度很慢else{if(fororback==0x00){motorspeed=400;} else{motorspeed=320;}} ////________motor_ctl(motorspeed,fororback);}}}if(const500ms==500) //100ms刷新显示{ diplyamp(mode);diplyamp2(dsign,D,0x94); //显示D值diplyamp1(currsign,currstd,0x8c); //显示当前位移diplyamp1(setdsign,setstd,0x9c); //显示设置位移const500ms=0;}TBCCR0+=16000;}void main(void){WDTCTL=WDTPW+WDTHOLD; //关看门狗BCSCTL1 =CALBC1_16MHZ; //设定DCO为16MHZDCOCTL =CALDCO_16MHZ;PortInit();AD_INI();LCDInit(); //初始化LCD屏Test(); //显示文本diplyamp(0); //显示位移测量仪diplyamp2(dsign,D,0x94); //显示D值diplyamp1(currsign,currstd,0x8c); //显示当前位移diplyamp1(setdsign,setstd,0x9c); //显示设置位移timerB_Init();motor_Init();TBCTL |=MC1; //开采样定时器TIMERB,基本时间1ms_BIS_SR(GIE);while(1){ while((P1IN&0xf0)==0xf0){if(endflag!=0x00){delay(30000);P2OUT &=~BIT2;endflag=~endflag;}}delay(30000); //去抖if((P1IN&0xf0)!=0xf0){switch (P1IN&0xf0){case 0xe0: // S1 设置目标位移,步进+{ if(mode==0x00){if(setdsign==0){setstd+=10; if(setstd>STD){setstd-=10;}setjddistance=setstd+2000; }else{setstd-=10; if(setstd==0){setdsign=0;}setjddistance=2000-setstd;}}else{P1SEL |= 0x04; //P1.2启用第2功能,产生PWM波motor_startup();motor_ctl(350,0);while((P1IN&0xf0)==0xe0); //等待按键释放P1SEL &=~0x04; //P1.2=0P1OUT |= 0x04;TACTL &= 0xcf;}}break;case 0xd0: //S2 设置目标位移,步进-{if(mode==0x00){if(setdsign==0){ if(setstd==0){setstd=10;setdsign=1;}else{setstd-=10;}setjddistance=setstd+2000; }else { setstd+=10; if(setstd>STD){setstd-=10;}setjddistance=2000-setstd;}}else{P1SEL |= 0x04; //P1.2=0motor_startup();motor_ctl(350,1);while((P1IN&0xf0)==0xd0);P1SEL &=~0x04; //P1.2=0P1OUT |= 0x04;TACTL &= 0xcf;}}break;case 0xb0: //S3{mode=~mode;if(mode!=0x00){P1SEL |= 0x04; //P1.2=0motor_startup();motor_ctl(500,0);}else{ P1SEL &=~0x04; //P1.2=0P1OUT |= 0x04;TACTL &= 0xcf; }}break;case 0x70: //S4 确认键按下后,电机准备启动{if(mode==0x00){if((((jddistance-setjddistance)<10)||((setjddistance-jddistance)<10))) { motorstartup=0x00; P1SEL &=~0x04; //P1.2=0P1OUT |= 0x04;}else {motorstartup=0xff;P1SEL |=0x04; //P1.2=1motor_startup();}}else{}}break;default:{ }break;}}}}。

相关文档
最新文档