【嵌入式系统开发】Keil 实现闪烁频率可变化的呼吸灯 详细教程及完整代码

在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;
}

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用Keil中的定时器模块来实现呼吸效果。具体实现方法如下: 1. 首先需要配置定时器模块,设置定时器的时钟源、计数器的位数、计数器的初值等参数。 2. 然后在定时器中断服务函数中,根据当前计数器的值来控制LED的亮度。可以使用PWM技术来实现LED的调光效果,即通过改变LED的占空比来控制LED的亮度。 3. 在主函数中,可以通过改变定时器的计数器初值来改变LED的呼吸频率,从而实现呼吸效果。 下面是一个简单的示例代码: ``` #include <reg52.h> sbit LED = P1^0; // LED连接在P1.0口 void Timer0_ISR() interrupt 1 // 定时器0中断服务函数 { static unsigned char cnt = 0; static unsigned char dir = 1; if (dir) // 呼吸逐渐变亮 { cnt++; if (cnt >= 100) dir = 0; } else // 呼吸逐渐变暗 { cnt--; if (cnt == 0) dir = 1; } TH0 = 0xFF; // 重新设置定时器初值 TL0 = 0x00; LED = (cnt > 50) ? 1 : 0; // 根据计数器值控制LED亮度 } void main() { TMOD = 0x01; // 定时器0工作在模1 TH0 = 0xFF; // 设置定时器初值 TL0 = 0x00; ET0 = 1; // 允许定时器0中断 EA = 1; // 允许总中断 TR0 = 1; // 启动定时器0 while (1); } ``` 在这个示例代码中,定时器0工作在模1,即13位定时器模,计数器初值为0xFFFF,每次计数器溢出时会触发中断。在定时器中断服务函数中,使用一个静态变量cnt来记录当前计数器的值,根据cnt的值来控制LED的亮度。当cnt逐渐增加到100时,LED的亮度逐渐变亮;当cnt逐渐减小到0时,LED的亮度逐渐变暗。在主函数中,通过改变定时器的初值来改变LED的呼吸频率

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Karry D

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值