在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 x=0; //定义变量,代表占空比
void TMR16B1_PWM_Init(void)
{
LPC_SYSCON->SYSAHBCLKCTRL |= (1UL << 8); // 16位定时器1时钟使能;
LPC_SYSCON->SYSAHBCLKCTRL |= (1UL << 16); //IO配置块时钟使能;
LPC_IOCON->PIO1_9 |= 0x01; // CT16B1_MAT0-16位定时器1的匹配输出0;
LPC_TMR16B1->PR = 0; // 设置分频系数;
LPC_TMR16B1->PWMC= 0x01; //设置MAT0为PWM输出;
LPC_TMR16B1->MCR = 0x02 <<9; //设置MR3匹配后复位TC;
LPC_TMR16B1->MR3 = SystemCoreClock/1000; //周期设置为0.001S;
LPC_TMR16B1->MR0 = LPC_TMR16B1->MR3/4;//MAT0输出25%的方波;
LPC_TMR16B1->TCR = 0x01; // 启动定时器
}
int main()
{
TMR16B1_PWM_Init(); //初始化
while(1)
{
if (x>=1 | x<=0) //当(占空比)输出方波到达1或者到达0时
{
flag = ~flag; //标志信号取反
}
if(flag==0) //当标志信号为零时
{
LPC_TMR16B1->MR0 = x*LPC_TMR16B1->MR3; //改变占空比
x=x+0.00001; //占空比加加
}
else //当标志信号为0时,也就是占空比为1时
{
LPC_TMR16B1->MR0 = x*LPC_TMR16B1->MR3;
x=x-0.00001; //比例--
}
}
return 0;
}