用52单片机,用定时器实现pwm调光,控制一个220v灯泡,实现8个档位调节,一个按键增加亮度,一个按键减少亮度,写一个调光程序
时间: 2024-05-07 16:20:12 浏览: 95
51单片机通过PWM调节灯光亮度
5星 · 资源好评率100%
以下是一个简单的调光程序,使用定时器0来产生PWM信号,按键1和按键2分别用于增加和减少PWM占空比来控制灯光亮度。
```c
#include <reg52.h>
#define FREQ 1000 // PWM频率为1kHz
#define MAX_DUTY 255 // 最大占空比为255
#define MIN_DUTY 0 // 最小占空比为0
sbit key1 = P2^0;
sbit key2 = P2^1;
sbit light = P1^0;
unsigned char duty = 0; // 初始PWM占空比为0
void timer0_init()
{
TMOD |= 0x01; // 设置定时器0为模式1
TH0 = 256 - FREQ/100; // 定时器初值
TL0 = 256 - FREQ/100;
ET0 = 1; // 允许定时器0中断
TR0 = 1; // 启动定时器0
EA = 1; // 开启总中断
}
void delay(unsigned int t) // 延时函数
{
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<125;j++);
}
void main()
{
timer0_init();
while(1)
{
if(!key1) // 按键1按下,增加PWM占空比
{
delay(10);
if(!key1)
{
if(duty < MAX_DUTY)
duty++;
}
while(!key1);
}
if(!key2) // 按键2按下,减小PWM占空比
{
delay(10);
if(!key2)
{
if(duty > MIN_DUTY)
duty--;
}
while(!key2);
}
}
}
void timer0_isr() interrupt 1 // 定时器0中断服务程序
{
static unsigned char cnt = 0;
TH0 = 256 - FREQ/100; // 重新设置定时器初值
TL0 = 256 - FREQ/100;
cnt++;
if(cnt > duty) // PWM占空比
light = 0;
else
light = 1;
if(cnt >= 255)
cnt = 0;
}
```
上述程序使用了定时器0来产生PWM信号,按键1和按键2用于控制PWM占空比,从而控制灯光亮度。程序使用了一个中断服务程序来产生PWM信号,每次定时器0中断时都会更新PWM占空比。其中,`delay()`函数用于消除按键抖动。
阅读全文