51单片机PWM渐变三档调光
时间: 2023-07-24 10:30:28 浏览: 51
以下是基于STC89C52单片机的PWM渐变三档调光示例代码:
```c
#include <reg52.h>
sbit PWM_OUT = P1^0; //PWM输出引脚
sbit BTN1 = P3^0; //按键1引脚,用于切换调光档位
sbit BTN2 = P3^1; //按键2引脚,用于切换调光方向
unsigned int T = 200; //PWM周期,单位为us
unsigned int D = 0; //PWM占空比,取值范围为0~255
unsigned char mode = 0; //调光档位,0表示最低档,1表示中档,2表示最高档
unsigned char direction = 0; //调光方向,0表示升级,1表示降级
//定时器0中断服务程序
void Timer0_ISR() interrupt 1
{
static unsigned int cnt = 0;
if(cnt < D) {
PWM_OUT = 1; //PWM输出高电平
} else {
PWM_OUT = 0; //PWM输出低电平
}
cnt++;
if(cnt >= T) {
cnt = 0;
}
}
void main()
{
TMOD = 0x01; //定时器0工作于模式1:16位自动重载定时器
TH0 = (65536 - T) / 256; //设置定时器初值
TL0 = (65536 - T) % 256;
ET0 = 1; //允许定时器0中断
EA = 1; //开启中断总开关
TR0 = 1; //启动定时器0
while(1) {
if(BTN1 == 0) { //按键1被按下
delay(20); //消除按键抖动
if(BTN1 == 0) { //再次确认按键状态
mode++; //切换到下一个调光档位
if(mode > 2) {
mode = 0;
}
switch(mode) {
case 0:
D = 30; //最低档,占空比为30
break;
case 1:
D = 128; //中档,占空比为128
break;
case 2:
D = 255; //最高档,占空比为255
break;
}
while(BTN1 == 0); //等待按键释放
}
}
if(BTN2 == 0) { //按键2被按下
delay(20); //消除按键抖动
if(BTN2 == 0) { //再次确认按键状态
direction = !direction; //切换调光方向
while(BTN2 == 0); //等待按键释放
}
}
if(direction == 0) { //升级调光
D++;
if(D > 255) {
D = 255;
direction = 1; //升级调光到最高档后,切换为降级调光
}
} else { //降级调光
D--;
if(D < 0) {
D = 0;
direction = 0; //降级调光到最低档后,切换为升级调光
}
}
delay(10); //每个占空比的变化都延时10ms,以便观察PWM渐变效果
}
}
//延时函数,单位为ms
void delay(unsigned int ms)
{
unsigned int i, j;
for(i = 0; i < ms; i++) {
for(j = 0; j < 114; j++) {
//1ms延时,114为经验值,可根据实际情况进行调整
}
}
}
```
该示例代码实现了PWM渐变三档调光功能,可以通过按键1切换调光档位,按键2切换调光方向。在升级调光时,PWM占空比从当前值逐渐增加到255;在降级调光时,PWM占空比从当前值逐渐减小到0。每个占空比的变化都延时10ms,以便观察PWM渐变效果。