MSP430G2553定时器闪烁灯程序
msp430Led按键控制灯亮程序

1.Led灯控制程序#include "msp430g2553.h"void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD; //关闭看门狗//P1DIR = 0x41;//P1OUT = 0x41; //程序点亮led1//P1DIR |=BIT0+BIT6;//P1OUT |=BIT0+BIT6; //程序点亮led2P1DIR |=BIT0;P1OUT |=BIT0;P1DIR |=BIT6;P1OUT &=~BIT6;while(1){P1OUT ^=BIT0;P1OUT ^=BIT6;__delay_cycles(1000000);} //led交替亮,持续1s2.Led按键控制灯亮#include "msp430g2553.h"void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;//关闭看门狗P1DIR &=~BIT3;P1DIR |=BIT0;P1IES |=BIT3;P1IE |=BIT3;_EINT();_BIS_SR(LPM0_bits+GIE);}#pragma vector=PORT1_VECTOR__interrupt void PORT1_ISR(void){int i;char pushkey;pushkey=P1IFG&BIT3;//第三位中断标志位for(i=0;i<1000;i++)//短暂延时软件去抖if((P1IN&pushkey)==pushkey){P1IFG=0;//中断标志清零return;}if(P1IFG&BIT3)//判断按键是否按下{P1OUT^=BIT0;}P1IFG=0;return;}3.矩阵键盘和数码管程序#include <msp430g2553.h>#include"Key&Display.h"//unsigned char Receive(void);void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;Init_4lines_Mode();//初始化4线工作模式Send_Command(CH452_RESET);//CH452芯片内部复位Send_Command(KeyDisplay_ON);//允许显示驱动并启动键盘扫描//开中断,P2.0接CH452的DOUT引脚,当有键按下时,DOUT上产生由高到低的脉冲// P2SEL &= ~(BIT6+BIT7);P2IE|=BIT0;P2IES|=BIT0;P2IFG&=~BIT0;_EINT();while(1){}}//中断处理函数#pragma vector = PORT2_VECTOR//中断处理程序,接收到DOUT脉冲信号时,运行之__interrupt void Port2(void){unsigned char Keyvalue;Send_Command(CH452_GET_KEY);//单片机向CH452发送读取按键代码命令Keyvalue=Key_Read();// Keyvalue=Receive();switch(Keyvalue){case 0x40://按键K0按下{Send_Command( NDis1); //第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis00);//第0位数码管显示0break;}case 0x41://按键K1按下{Send_Command( NDis1); //第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis01);//第0位数码管显示1break;}case 0x42://按键K2按下{Send_Command( NDis1); //第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis02);//第0位数码管显示2break;}case 0x43://按键K3按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis03);//第0位数码管显示3break;}case 0x48://按键K4按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis04);//第0位数码管显示4break;}case 0x49://按键K5按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis05);//第0位数码管显示5break;}case 0x4A://按键K6按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis06);//第0位数码管显示6break;}case 0x4B://按键K7按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis07);//第0位数码管显示7break;}case 0x50://按键K8按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis08);//第0位数码管显示8break;}case 0x51://按键K9按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis09);//第0位数码管显示9break;}case 0x52://按键K10按下{Send_Command(Dis00);//第0个数码管显示字符"0"Send_Command(Dis11);//第1个数码管显示字符"1"break;}case 0x53://按键K11按下{Send_Command(Dis01);//第0个数码管显示字符"1"Send_Command(Dis11);//第1个数码管显示字符"1"break;}case 0x58://按键K12按下{Send_Command(Dis02);//第0个数码管显示字符"2"Send_Command(Dis11);//第1个数码管显示字符"1"break;}case 0x59://按键K13按下{Send_Command(Dis03);//第0个数码管显示字符"3"Send_Command(Dis11);//第1个数码管显示字符"1"break;}case 0x5A://按键K14按下{Send_Command(Dis04);//第0个数码管显示字符"4"Send_Command(Dis11);//第1个数码管显示字符"1"break;}case 0x5B://按键K15按下{Send_Command(Dis05);//第0个数码管显示字符"5"Send_Command(Dis11);//第1个数码管显示字符"1"break;}default:break;}P2IFG&=~BIT0;}4.红灯0.2秒闪一次,绿灯0.8秒闪一次#include <msp430g2553.h>void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDT BCSCTL1 &=~XTS; //配置时钟BCSCTL3 |=LFXT1S_2;IFG1 &=OFIFG;P1DIR |=BIT0+BIT6; // P1.0,P1.6 output P1OUT &=~BIT0; // P1.0,P1.6置0 P1OUT &=~BIT6;TACCR0 = 12000-1; //1秒定时,产生中断TACCR1 = 2400; //频率0.2*12000,定时0.2秒TACCR2 = 9600; //定时0.8秒TACTL = TASSEL_1 + MC_1+TAIE; // ACLK, 增计数模式TACCTL1 |=CCIE; // TACCR1中断使能TACCTL2 |=CCIE; // TACCR1中断使能_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}// Timer_A3 Interrupt Vector (TA0IV) handler#pragma vector=TIMER0_A1_VECTOR__interrupt void Timer_A(void){switch( TA0IV ){case 2: P1OUT ^= BIT0; // 捕获/比较寄存器TACCR1break;case 4: P1OUT ^= BIT6;break; // 捕获/比较寄存器TACCR2case 10: break; // 未使用,计数达到TACCRO时执行中断,即1秒执行一次}}5.PMW波控制led灯亮度#include "msp430g2553.h"void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;P1DIR |=BIT6; //方向寄存器P1SEL |=BIT6; //功能寄存器TACTL=TASSEL_2+MC_1+ID_0; //定时器A控制寄存器选择增计数模式TACCTL1 |=OUTMOD_3; //捕获/比较控制寄存器TACCR0=1000-1;TACCR1=10;_BIS_SR(CPUOFF);}。
MSP430霓虹灯

case 4:
break; case 10: break; } }
比较模块
CCR0在比较模式中,用于设定定时器的周期。 当CCR1/2发现TAR的值与TACCR0或它们自己的TACCRx相等时, 便自动改变输出IO口TAx的输出电平,从而生成波形。 改变的规则由OUTMODx决定。
Timer_A比较模块的8种输出模式
4)看门狗定时器写入错误的安全键值
5)Flash存储器写入错误的安全键值
2.单片机复位后的初始状态是什么?
1)I/O引脚切换成输入模式
2)I/O标志位清除 3)其他外围模块及寄存器实现初始化
4)状态寄存器复位
5)CPU从内存的0FFFE地址开始执行代码
典型复位电路
典型的复位电路有一下3种: (1)在RST/NMI管脚上接100K欧的上拉电阻。 (2)在(1)的基础上再接0.1uf的电容,电容的一端接地,可以使复位更加可 靠。 (3)在(2)的基础上,再在电阻上并接一个型号为IN4008的二极管,可以可 靠的实现系统断电后立即上电。
这8种规则配合主定时器TAR的3种模式(连续计数、增计数、 增减计数),可以生成各种波形。主要有以下四种波形: 1.单稳态波形
2.普通PWM。占空比可调范围0~100% 3.带死区控制的双路对称PWM。 4.3路50%占空比方波,相位可调。
1.单稳态波形
模式1和模式5用于生成单稳态脉冲。主定时器(计数器)设 置为增计数模式,使用OUT控制位预先置0/置1后,就可以得 到正/负单稳态脉冲,脉宽由TACCRx决定。
捕获/比较模块CCRx
1.捕获模块capture。 2.比较模块comparator。 3.捕获/比较共用了TACCRx寄存器,故不能同时使用。 CAP寄存器位用于选择捕获/比较工作模式: CAP=0 比较 CAP=1 捕获
54MSP430 G2553 5(低功耗模式及看门狗)

54MSP430 G2553 5低功耗模式1,TI msp430单片机是一个特别强调超低功耗的单片机系列。
对于低功耗的实现,丰富的中断和合理的时钟系统是必须的,另外相对独立的外设,可以不在CPU的干预下独立地工作,这样减小了CPU的工作时间,也大幅降低了系统功耗。
2,msp430能够用中断迅速把CPU从低功耗模式中唤醒,唤醒时间小于1us。
这就保证了系统的低功耗。
让CPU工作在脉冲状态,最大限度地让CPU处于休眠状态,只有在一些需要CPU干预的操作或计算时,才把CPU 唤醒。
另外,把一些无关的外围模块也都关闭,使一些需要的模块尽量单独工作,从而可以把CPU休眠。
合理地利用中断,在需要的时间唤醒cpu。
3,msp430应用系统价格和电流消耗等因素会影响CPU与外围模块对时钟的需求,所以系统使用不同的时钟信号:ACLK, MCLK, SMCLK。
用户通过程序可以选择低频或高频,这样可以根据实际需要来选择合适的系统时钟频率,这3种不同的频率的时钟输出给出不同的模块,从而更合理地利用系统的电源,实现整个系统的超低功耗。
4,单片机的工作模式有:活动模式是(AM),低功耗模式0(LPM0)~低功耗模式4(LPM4)。
不同的低功耗模式禁止不同的模块,适应不同的需求。
5,各种低功耗模式的配置有控制位:SCG1,SCG2,OscOff, CPUOff 由软件来配置。
而各种低功耗模式又可通过中断的方式会到活动模式。
在CCS的编译系统中,已经做好了各种低功耗模式的宏定义,在软件中直接调用就可以了,宏定义如下:#ifdef __ASM_HEADER__#define LPM1 (SCG0+CPUOFF)#define LPM2 (SCG1+CPUOFF)#define LPM3 (SCG1+SCG0+CPUOFF)#define LPM4 (SCG1+SCG0+OSCOFF+CPUOFF)#else#define LPM0_bits (CPUOFF)#define LPM1_bits (SCG0+CPUOFF)#define LPM2_bits (SCG1+CPUOFF)#define LPM3_bits (SCG1+SCG0+CPUOFF)#define LPM4_bits (SCG1+SCG0+OSCOFF+CPUOFF)#include "in430.h"#define LPM0 _bis_SR_register(LPM0_bits)#define LPM0_EXIT _bic_SR_register_on_exit(LPM0_bits)#define LPM1 _bis_SR_register(LPM1_bits)#define LPM1_EXIT _bic_SR_register_on_exit(LPM1_bits)#define LPM2 _bis_SR_register(LPM2_bits)#define LPM2_EXIT _bic_SR_register_on_exit(LPM2_bits)#define LPM3 _bis_SR_register(LPM3_bits)#define LPM3_EXIT _bic_SR_register_on_exit(LPM3_bits)#define LPM4 _bis_SR_register(LPM4_bits)#define LPM4_EXIT _bic_SR_register_on_exit(LPM4_bits)#endif6,具体的例子就不再举了,就是在CPU不需要工作的时候进入低功耗模式,在需要工作的时候,通过中断唤醒。
msp430按键控制LED最基本程序

msp430按键控制LED最基本程序按键篇经过一短时间的学习,下面,亲自动手编写一下程序吧。
程序的目的是:按下按键,控制LED的亮和灭。
短按键,则小灯亮1秒,然后灭; 长按键,小灯常亮。
首先,完成键盘的扫描程序。
第一点:如果是扫描,就要用到定时器。
我想设计定时器每隔IOms扫描一次按键。
定时器,我选用定时器A。
它的定时中断函数如下:函数名称:TimerA_ISR功能:定时器A 的中断服务函数参数:无返回值:无********************************************/ #pragma vector = TIMERAO_VECTOR __interrupt void TimerA_ISR(void) {GetKey() ;}上面这个定时中断函数的意思就是:每当定时时间到了以后,就调用GetKey() 函数一次。
GetKey() 函数就是扫描键盘按键的函数了。
在GetKey() 函数中,会根据按键类型(长按/ 短按)返回不同的数值。
根据返回的数值,做小灯亮法的操作。
那么,返回的这个值,我们需要保存在一个变量中,在这里定义一个变量ucharFlagLcd ; 来保存返回值。
这个变量在全局变量中定义,以保证它的作用域。
那么定时函数就变为#pragma vector = TIMERAO_VECTOR__interrupt void TimerA_ISR(void){FlagLcd =GetKey() ;}定时器中断的时间间隔,我在主函数中定义。
这样写:CCTLO = CCIE; // 使能CCR冲断CCRO = 4O; // 设定周期O.O1STACTL = TASSEL_1 + ID_3 + MC_1; //定时器A的时钟源选择ACLK增计数模式这样,定时器这块就算完工了。
那么,下面进行按键扫描程序。
按键的定义是这样的,根据我板子的按键原理图如下Pl +PlAPl 了这是一个矩阵键盘。
OPT3001 MSP430G2553完整程序

{
return 0;
}
else//否则初始化不成功
{
return 1;
}
}
//OPT3001寄存器配置
//12-15位RN[0,3]:0x1100,设置为Full-Scale Mode
OPT3001IIC_Init();//OPT3001端口初始化
OPT3001Config(); //配置OPT3001并且唤醒OPT3001
delay();
ManufacturerIDNum=GetOPT3001ManufacturerID();
delay();
DeviceIDNum=GetOPT3001DeviceID();
write1();
stop();//停止信号
}
//*********************************************************
//读出BMP085内部数据,连续两个
//*********************************************************
}
BCSCTL1 = CALBC1_1MHZ; // Set DCO
DCOCTL = CALDCO_1MHZ;
}
void Opt3001WriteRegister(unsigned char registerName, unsigned int value)
{
start(); //起始信号
write1byte(0x88); //发送设备地址+写信号
MSP430单片机系统时钟选择实验-改变LED灯闪烁频

//******************************************************************************
#include<msp430x13x.h>
void main(void)
// /|\| XIN|-
// | | |
// --|RST XOUT|-
// | |
// | P1.5|-->LED
//
//时间:2007年10月
//
//
//硬件电路:MSP430F135核心实验板-I型
Байду номын сангаас//硬件连接:
//
//调试器:MSP430FET全系列JTAG仿真器
{
WDTCTL = WDTPW + WDTHOLD;//停止看门狗
P1DIR |= 0x20;//设P1.5为输出口
// BCSCTL1= 0x80;//分频电阻选择为0(此时闪烁频率较慢)
// BCSCTL1= 0x87;//分频电阻选择为7(此时闪烁频率较快)
// BCSCTL2= 0xc0;//选择外部32768低频晶振作为MCLK(此时闪烁频率极慢)
// D13x Demo -在上一节基础上改变系统时钟,观察LED灯的闪烁频率
//
//描述:通过改变系统时钟,来改变闪烁频率;通过P1异或来取反P1.5;软件循环延时
// ACLK= n/a, MCLK= SMCLK= default DCO ~ 800k
//
// MSP430F13x
// -----------------
微机原理- 定时中断的设计与应用(使用MSP430的定时器控制LED灯)

微机原理实验实验四定时中断的设计与应用一、实验目的1. 了解 MSP430 系列定时器 Timer_A 模块结构和功能;2. 掌握定时器 Timer_A 的工作原理和寄存器配置方法;3. 熟练掌握定时器 Timer_A 不同工作模式下的典型应用;4. 熟练掌握端口 P1 和 P2 复用功能应用;5. 熟练掌握定时器 Timer_A 定时中断功能的设计和应用。
二、实验内容1.※●为TA0配置时钟源及工作模式,控制LED1指示灯的定时亮灭,中间间隔1秒钟。
要求:TA0定时器分别配置工作在增计数模式和增/减计数模式下,采用ACLK作为其计数参考时钟,并启用TA0CCR0计数中断实现硬件定时中断。
(1)流程图(以增计数模式为例)(2) 源代码/***增计数模式***/#include <msp430.h>void main(){WDTCTL = WDTPW + WDTHOLD; // 停止看门狗定时器P1DIR |= BIT0; //设置P1.0输出P1OUT&=~BIT0; //初始化P1.0TA0CCR0 = 32768; // 定义中断计数周期1s,时钟频率为32.768MHZ,32768 / 32768 = 1sTA0CCTL0 = CCIE; // TA0CCR0捕获/比较中断寄存器中断使能TA0CTL = TASSEL_1 + MC_1 + TACLR; // TASSEL_1,ACLK时钟源MC_1,增计数模式__bis_SR_register (LPM0_bits + GIE); // 进入LPM0低功耗模式,开启总中断}//定时器中断#pragma vector = TIMER0_A0_VECTOR__interrupt void Timer_A(void) // 定时器中断触发,P1输出口异或,电平翻转{P1OUT ^= 0x01;}/*******增减计数模式*******/#include <msp430.h>void main(){WDTCTL = WDTPW + WDTHOLD; // 停止看门狗定时器P1DIR |= BIT0; //设置P1.0输出P1OUT&=~BIT0; //初始化P1.0TA0CCR0 = 16384; // 定义中断计数周期1sTA0CCTL0 = CCIE; // TA0CCR0捕获/比较中断寄存器中断使能TA0CTL = TASSEL_1 + MC_3 + TACLR; // TASSEL_1,ACLK时钟源MC_1,增减计数模式__bis_SR_register (LPM0_bits + GIE); // 进入LPM0低功耗模式,开启总中断}//定时器中断#pragma vector = TIMER0_A0_VECTOR__interrupt void TIMER0_A0_ISR (void) // 定时器中断触发,P1输出口异或,电平翻转{P1OUT ^= 0x01;}(3)实验现象程序运行后,P1.1口LED每隔1s闪烁一次。
msp430定时器控制led闪烁

第四讲定时器控制LED闪烁一、定时器简介定时器,简单的说,就像单片机内的一个闹钟。
它以单片机的时钟作为计数基准,根据计数数值不同来改变定时时间,并可以设置使时间满足定时条件时进行一系列操作。
下面是msp430g2553的datasheet对其定时器的介绍:从这里开始,我们介绍的部件往往会涉及很多寄存器,初学者往往由于配置不全,不能得到想要的效果。
因此,学习这一部分,尽量参考用户手册和相关例程进行分析。
二、定时器A配置我们要实现使用定时器控制LED闪烁,需要使用定时器中断来控制。
定时器中断与外部中断的具体原理一样,都是从主程序中断,处理完中断服务函数再返回。
区别只在于触发条件,定时器中断的触发条件是定时器计数溢出(计数数值达到设定数值)。
这是用户手册对定时器A的介绍:16位定时/计数,4种计数模式,可选时钟源,2到3个捕获比较寄存器,异步输入输出锁存,定时中断寄存器。
16位定时/计数,是指计数数值范围是0-65535,与设置好的时钟源来组合成一定的定时时长。
如时钟周期为1us,那么要定时1ms,计数数值就需要设置为1000。
上图是定时模式的介绍,一般采用增计数模式即可,即每次定时从0计数到设置的数值。
定时器配置最重要的部分在于TACLR寄存器,其16位所代表的含义如下图,具体配置内容可从用户手册和头文件内查出,这里不做一一介绍,在例程中再进行讲解。
三、实践操作这里,由于我们的单片机默认时钟为DCO 1MHZ,16位定时器计数数值65536,所以最大定时时长为65.536ms。
在这里我们进行0.05s的定时,每隔0.05s触发一次中断函数,使LED亮0.05s,灭0.05s,并交替进行。
为了方便调试,我们先使用延时的方法使LED闪烁,确认单片机以及LED工作正常。
顺便复习一下对IO的操作。
下面就到定时器的核心配置了。
我们要设置定时器,核心部分当然是TACTL寄存器,它是定时器工作的关键,涉及到定时器所采用的时钟周期以及计数方式。