LPC1114:定时器实现LED呼吸灯

       基于LPC1114 DevKit口袋开发板,系统上电,系统默认工作频率为48MHz,在Keil MDK 4.74上编写一段程序:设置16位定时器1工作在PWM模式,PIO1_9设置为PWM输出引脚,利用另外一个定时器定时(例如32位定时器0,设置每隔0.01s,或者更小)增大或者减小16位定时器1输出PWM的占空比(占空比改变的步长与32位定时器0的定时时间相配合,确定呼吸频率),实现PIO1_9上的LED灯渐亮渐灭的呼吸灯效果。

#include <LPC11xx.h>

#define step 0.005                             // 步长

int flag = 0;                                  // 定义标志变量,代表占空比是否越界
float freCoe = 0;                              // 呼吸灯频率系数

void TMR16B1_PWM_Init(void);
void TMR32B0_Init(void);
void TIMER32_0_IRQHandler(void);

int main(){
	
	TMR16B1_PWM_Init();                         // 初始化16位定时器
	TMR32B0_Init();                             // 初始化32位定时器
	
	while(1){};    
   		
}

void TMR16B1_PWM_Init(void){                    // 16位定时器配置PWM
	LPC_SYSCON->SYSAHBCLKCTRL |= (1UL << 8);    // 16位定时器1时钟使能
	LPC_SYSCON->SYSAHBCLKCTRL |= (1UL << 16);   // IO配置块时钟使能
	LPC_IOCON->PIO1_9 |= 0x01;                  // MAT0匹配IO1_9
	LPC_TMR16B1->PR = 0;                        // 分频系数;
	LPC_TMR16B1->PWMC= 0x01;                    // 开通道MAT0;
	LPC_TMR16B1->MCR = 0x02 <<9;                // 设置MR3匹配后复位TC;
	LPC_TMR16B1->MR3 = SystemCoreClock;         // PWM周期设置为1HZ
	LPC_TMR16B1->MR0 = LPC_TMR16B1->MR3/2;      // PWM占空比
	LPC_TMR16B1->TCR = 0x01;                    // 启动定时器
}

void TMR32B0_Init(void){                        // 32位定时器初始化
	LPC_SYSCON->SYSAHBCLKCTRL |= (1UL << 9);    // 32位定时器0时钟使能
	LPC_TMR32B0->IR = 0x1F;
	LPC_TMR32B0->PR = 0;                        // 分频系数;
	LPC_TMR32B0->MCR = 3;                       // 设置MR0匹配后复位TC并产生中断;
	LPC_TMR32B0->MR0 = SystemCoreClock/100;     // 中断时间0.01s
	LPC_TMR32B0->TCR = 0x01;                    // 启动定时器
	NVIC_EnableIRQ(TIMER_32_0_IRQn);
}

void TIMER32_0_IRQHandler(void){                // 中断函数
	if((LPC_TMR32B0->IR|=0x01)==1){             // 判断是否MR0中断,并清MR0中断
		if (freCoe > 1 || freCoe < 0){          // 越界翻转
			flag = ~flag;                   
		}
		if(flag==0){                            // 渐亮
			LPC_TMR16B1->MR0 = freCoe*LPC_TMR16B1->MR3;      
			freCoe += step;                     // 频率系数++步长
		}
		else{                                   // 渐暗
			LPC_TMR16B1->MR0 = freCoe*LPC_TMR16B1->MR3;
			freCoe -= step;                     // 频率系数--步长
		}	
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值