MSP430用按键中断控制定时器产生持续 1s 的周期信号

发布者:乘风翻浪最新更新时间:2020-04-01 来源: eefocus关键字:MSP430  按键  中断控制  定时器  周期信号 手机看文章 扫描二维码
随时随地手机看文章

//////////////////////////////////////////////////////////////////////////////////////////////////////

// 2012 年吉林省大学生电子设计大赛 C题<<声源定位系统>> ----(声源部分)

// 要求: 有信号产生电路, 放大电路, 声音频率 800Hz 左右, 按一次键响声持续 1 秒.

//       声源模块体积不超过 4cm*4cm*4cm.

//====================================================================================================

// 比赛时用的是 555 定时器组成单稳态电路延时电路做的延时发生系统. 效果也行. 由于器件误差原因, 

// 频率很难调到 800Hz 稳定下来. (参考康华光 <电子技术基础-数字部分_第五版> 428页, 习题 8.4.4)

// 赛后改用了 TI 的 MSP430 Launchpad 重做了一个, 再加一个简单的放大电路, 程序如下. 

// 本来要用 PWM 功能来输出, 只是还不熟悉, 得慢慢摸索.

//////////////////////////////////////////////////////////////////////////////////////////////////////

#include  

#include

 

// 定义别名

typedef unsigned char INT8U; 

typedef unsigned int  INT16U; 

 

volatile INT16U i = 0;              // 中断中引用的变量 最好定义成 volatile 类型.

 

//////////////////////////////////////////////////////////////////////////////////////////////////////

// 主函数

void main(void) 

    WDTCTL = WDTPW + WDTHOLD;       // 关闭看门狗 

  

    //CCTL0 = CCIE;                 // 使能 CCR0 中断 

    CCR0  = 85; 

    TACTL = TASSEL_2 + ID_3 + MC_1; // 定时器A的时钟源选择 SMCLK,增计数模式 

    P1DIR |= (BIT0 | BIT6);         // P1 设置为输出

    P1OUT  = (BIT0 | BIT3);         // 开始时 LED1 亮, LED2 灭,  选择上拉方式

    P2DIR |= BIT2;                  // 设置 P2.2 口方向为输出 

    P2OUT &= ~BIT2;                 // P2.2 输出低电平, 使得初始状态蜂鸣器不响

    P1REN |= BIT3;                  // 使能 P13 口的上拉电阻

    P1IE  |= BIT3;                  // P1.3 中断允许

    //P1IES &= ~BIT3;               // 上升沿触发中断

    P1IES |= BIT3;                  // 下降沿触发中断, 可以对比下与上升沿的区别

    P1IFG  = 0x00;                  // 清除中断标志位

    _EINT();                        // 使能全局中断 

    LPM1;                           // CPU 进入 LPM1 模式 ,LPM0 亦可

    

    for (;;)

    {

        _NOP();                     // 进入死循环, 等待中断发生

    }

 

//////////////////////////////////////////////////////////////////////////////////////////////////////

// 定时器A的中断服务函数,在这里定时改变引脚状态

#pragma vector = TIMER0_A0_VECTOR 

__interrupt void Timer_A_Handler (void) 

{   

    P2OUT ^= BIT2;

    if (++i > 1600) {               // 1s 时间到, 则停止, 等待下次按键开始

        CCTL0 &= ~CCIE;             // 禁止 CCR0 中断, 等待下次按键重新开启 

        P2OUT &= ~BIT2;             // 1s 到后, P2.2 要输出低电平, 使得蜂鸣器不再响

        i = 0;                      // i 清零, 等待下次继续计数

    }

 

//////////////////////////////////////////////////////////////////////////////////////////////////////

// P1.3中断,下降沿触发

#pragma vector = PORT1_VECTOR

__interrupt void Port1_Handler(void)

{

    CCTL0 = CCIE;                   // 使能 CCR0 中断, 蜂鸣器开始 800Hz 的声响

    P2DIR |= BIT2;                  // 设置P2.2口方向为输出

    P1OUT ^= (BIT0 | BIT6);         // 表示按键改变取反 P1.0/6, 交替亮灭

    P1IFG &= ~BIT3;                 // 清除 P1.3 中断标志位

//////////////////////////////////////////////////////////////////////////////////////////////////////

// END OF FILE

/*****************************************************************************************************

Low-power mode 0 (LPM0)

– CPU is disabled

– ACLK and SMCLK remain active, MCLK is disabled

--------------------------------------------------------------------

Low-power mode 1 (LPM1)

– CPU is disabled

– ACLK and SMCLK remain active, MCLK is disabled

– DCO's dc generator is disabled if DCO not used in active mode

*****************************************************************************************************/


关键字:MSP430  按键  中断控制  定时器  周期信号 引用地址:MSP430用按键中断控制定时器产生持续 1s 的周期信号

上一篇:MSP430 F5529的按钮控制led灯亮灭程序代码
下一篇:430 IO上下拉电阻

推荐阅读最新更新时间:2024-11-21 04:36

浅谈MSP430F5529时钟
简介:记得某位网友曾经说过,学习任何一款单片机,首先要学的是它的时钟。的确如此,时钟是如此的重要,在不知道系统时钟的情况,感觉做什么事都是迷迷糊糊的。 之前学过51,它的时钟很简单,就一个外部晶振。然后学了430的G2553,它的时钟就有点麻烦了,时钟源多(两个外部晶振,一个内部超低功耗低频振荡器,一个内部调整低频参考振荡器),内部还有锁频环,而且出来的时钟还能被分频。原因是TI主打低功耗,必须得有各种频率来满足设计需要,毕竟,频率越低,功耗越低。 现在的,430的F5529,跟G2553比起来也就需要配置的时钟相关的寄存器是其3倍而已…还有个PMM(电源管理模块)的配置… 新增的PMM是干嘛的呢?还是那句话,TI主打
[单片机]
浅谈<font color='red'>MSP430</font>F5529时钟
MSP430定时器综合试验
1.实验目的 学会定时器使用。 2.实验要求 掌握定时器的定时控制编程。 3.实验内容 (1)编写键盘扫描程序。 (2)编写LED显示程序。 (3)用定时器控制8个LED循环显示程序(间隔时间1秒)。 (4)编写用键控制LED灯循环方向,按键可以随时切换。。 #include msp430x14x.h #include Config.h //开发板配置头文件,主要配置IO端口信息 uchar Flag=0; //标志位 uchar Time=0; //时间计数变量 uchar count=0; uchar key;
[单片机]
msp430程序升级方法
最近在搞430的FLASH的自定义法(利用串口)程序烧写,烧写完成后断电复位,reset按键就可以运行新的程序。但是和学长交流了一下,这种方法不够好,希望有一种软复位的方式。于是百度了一下,都是些对看门狗进行写入特殊值使得430的cpu复位。反正个人是没有采用。 因为在搞程序的烧写下载,所以看了一下430的BSL。看到里面有一段话,关于从C代码中启动BSL的方法。如下: 3.7.1 从一个外部应用中启动BSL 将程序计数器设定到内存为位置0x1000 来启动BSL。堆栈一直被复位,而RAM 被清空。应该注意的是,GIE 位未被禁用,所以如果不需要中断的话,这一步应该通过调用应用来完成,并且如果它们被使用的话,这一步应该从
[单片机]
SPWM波在单片机上的实现与调节(基于MSP430F5529)
SPWM波的定义和生成方法在这里就不多说了,本文主要说SPWM波在单片机上的实现,以及如何调节滤出后的正弦波的频率及幅度。 先弄清楚SPWM在单片机上如何产生,比如你要输出100HZ的SPWM正弦波,每个周期100个点,则定时器B的中断频率为100*100=10K,用于载波(定时器A)的PWM频率应 =10K(这里我建议载波为1M,因为定时器的配合问题会有+-1的误差,所以载波尽量的大则滤出的正弦波的波形越好)。 通过软件,你先得到100个点的正弦波采样值,你可以用定时器A来产生1MHZ的PWM,然后用定时器B,做定时器中断,10KHZ的频率,每次中断,就把一个采样值赋值给定时器A的输出通道:CCRx。然后不停的循环,每中
[单片机]
MSP430F5529——点亮LED1
代码 #include driverlib.h void main (void) { //Stop WDT WDT_A_hold(WDT_A_BASE); //PA.x output GPIO_setAsOutputPin( GPIO_PORT_P1, GPIO_PIN0 ); //Set all PA pins HI GPIO_setOutputHighOnPin( GPIO_PORT_P1, GPIO_PIN0 ); //Enter LPM4 w/interrupts enabled __bis_SR_register(LPM
[单片机]
MSP430 FLASH结构 InfoA(1080H-10FFh)和InfoB(1000H-10FFH)
Flash 存储器被分割成两部分: 主存储器和信息存储器, 两者在操作上没有什么 区别。两部分的区别在于段的大小和物理地址的不同 Flash 存储器被分割成两部分:主存储器和信息存储器,两者在操作上没有什么区别。两部分的区别在于段的大小和物理地址的不同。 每个主存储区和信息存储区由若干个段组成。举例Easy430f2132学习板上的主芯片2132来说,f2132由8KB+256Bflash的资源。 8K的flash是主存储区,专门用来存储代码或信息的。该存储区被划分为若干个段,每个段的大小为512B,可以推断,f2132共有8KB/512B=16段。 256B的信息段被划分为4个段,分别为A,B,C,D四个段,每段大
[单片机]
<font color='red'>MSP430</font> FLASH结构 InfoA(1080H-10FFh)和InfoB(1000H-10FFH)
MSP430精确延时_delay_cycles
IAR 软件430的编译器里面我们可以利用它内部的延时子程序来实现我们想要的高精度软件延时,方法如下: (1):将以下这段代码复制到你的.C源文件中。 #define CPU_F ((double)8000000) #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) (2):修改 在 #define CPU_F ((dou
[单片机]
ATMage16的16位定时器的PWM应用
//ICC-AVR application builder : 2007-5-6 21:30:57 // Target : M16 // Crystal: 8.0000Mhz //TIMER1 initialize - prescale:64 // WGM: 10) PWM phz correct, TOP= ICRn // desired value: 1Hz // actual value: 1.000Hz (0.0%) #include iom16v.h #include macros.h #define PWM1A PORTD5 //OC1A PD5 #define PWM1B PORTD4 //OC1B
[单片机]
ATMage16的16位<font color='red'>定时器</font>的PWM应用
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved