在Keil MDK 4.74上编写一段程序:
(1)利用16位定时器1实现定时1s,控制LPC1114微控制器的GPIO引脚PIO1_9上的LED灯状态反转(可以用中断方式也可以用匹配输出功能);
(2)设置16位定时器1工作在PWM模式,利用另外一个定时器定时增大或者减小占空比,实现PIO1_9上的LED灯渐亮渐灭的呼吸灯效果,改变呼吸的频率观察效果。
写出主程序、各子程序和完整注释,并在LPC1114 DevKit口袋开发板上调试运行通过。
要求:参考所提供子程序,写出主程序、初始化子程序和中断服务子程序,并进行完整注释;建立工程项目,编译通过后并在LPC1114 DevKit口袋开发板上调试运行。
作业提交方式:直接输入完整程序文本(带注释),并插入编译通过的图片和调试运行结果的小视频。
提示:LED灯状态反转可以用定时器中断方式也可以用匹配输出功能但不能两个同时用。
相关寄存器:
源码:
#include <LPC11xx.h>
int flag=0; // 定义标志变量,代表占空比是否越界
float dc=0; //定义变量,代表占空比
void TMR16B1_PWM_Init(void)
{
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/100; //PWM周期设置为100HZ
LPC_TMR16B1->MR0 = LPC_TMR16B1->MR3/2;//PWM占空比
LPC_TMR16B1->TCR = 0x01; // 启动定时器
}
void SysTick_Handler(void)
{
if (dc>=1 | dc<=0) //当占空比越界
{
flag = ~flag;
}
if(flag==0) //渐亮
{
LPC_TMR16B1->MR0 = dc*LPC_TMR16B1->MR3;
dc=dc+0.0001; //占空比++
}
else //渐暗
{
LPC_TMR16B1->MR0 = dc*LPC_TMR16B1->MR3;
dc=dc-0.0001; //占空比--
}
}
int main()
{
TMR16B1_PWM_Init(); //初始化
SysTick_Config(SystemCoreClock / 10000);//节拍定时器改变占空比
while(1);
}