51单片机利用pwm和两个按键控制P1^0灯的亮暗程度代码实例
时间: 2024-01-29 13:03:10 浏览: 26
好的,以下是51单片机利用PWM和两个按键控制P1^0灯的亮暗程度的代码实例:
```c
#include <reg52.h>
sbit LED = P1^0; // 定义LED引脚
sbit BTN_UP = P3^0; // 定义升亮度按键引脚
sbit BTN_DOWN = P3^1; // 定义降亮度按键引脚
unsigned int duty_cycle = 0; // 占空比
unsigned char up_press = 0; // 升亮度按键是否按下
unsigned char down_press = 0; // 降亮度按键是否按下
void timer0_init()
{
TMOD |= 0x01; // 定时器0工作在模式1,16位定时器模式
TH0 = 0xFC; // 定时器初值为65536-5000,定时5ms
TL0 = 0x18;
ET0 = 1; // 允许定时器0中断
EA = 1; // 打开总中断
TR0 = 1; // 启动定时器0
}
void pwm_init()
{
TMOD &= 0xF0; // 定时器1工作在模式0,13位定时器模式
TMOD |= 0x01;
TH1 = 0xFF;
TL1 = 0x00;
P1M0 |= 0x01; // P1^0设置为PWM输出
P1M1 &= 0xFE;
ET1 = 0; // 关闭定时器1中断
TR1 = 1; // 启动定时器1
}
void main()
{
timer0_init();
pwm_init();
while (1)
{
if (up_press)
{
if (duty_cycle < 1000)
{
duty_cycle += 50;
up_press = 0;
}
}
if (down_press)
{
if (duty_cycle > 0)
{
duty_cycle -= 50;
down_press = 0;
}
}
}
}
void timer0_isr() interrupt 1
{
static unsigned int cnt = 0;
TH0 = 0xFC;
TL0 = 0x18;
cnt++;
if (cnt == 10) // 5ms*10 = 50ms
{
cnt = 0;
if (duty_cycle == 0)
{
LED = 0;
}
else if (duty_cycle == 1000)
{
LED = 1;
}
else
{
LED = 1;
TH1 = (65536 - duty_cycle) / 256;
TL1 = (65536 - duty_cycle) % 256;
}
}
}
void btn_up_isr() interrupt 0
{
up_press = 1;
}
void btn_down_isr() interrupt 2
{
down_press = 1;
}
```
注意,在以上代码中,我们使用了定时器0和定时器1。定时器0的中断时间为5ms,用于实现LED的PWM控制;而定时器1则用于产生PWM信号。
在 `main` 函数中,我们不断循环检测升亮度按键和降亮度按键是否按下,并根据按键状态调整占空比 `duty_cycle` 的值。
在 `timer0_isr` 函数中,我们先使用定时器0中断实现LED的PWM控制。每隔50ms,我们根据占空比 `duty_cycle` 的值来决定LED是否亮灭,并设置定时器1的重载值来调整PWM信号的占空比。
最后,在 `btn_up_isr` 和 `btn_down_isr` 函数中,我们分别处理升亮度按键和降亮度按键的中断请求,将对应的标志位置为1,以在主函数中进行处理。