用52单片机,过零检测,pwm,双向可控硅,一个按键控制增加亮度,一个按键控制减少亮度,写一个调光程序
时间: 2023-06-18 16:08:48 浏览: 192
51单片机通过PWM调节灯光亮度
5星 · 资源好评率100%
下面是一个简单的基于52单片机的调光程序,使用过零检测和双向可控硅来控制LED灯的亮度。其中一个按键控制增加亮度,另一个按键控制减少亮度。
代码如下:
```C
#include <reg52.h>
// 定义IO口
sbit ZC = P0^0; // 过零检测
sbit S = P0^1; // 双向可控硅控制端S
sbit R = P0^2; // 双向可控硅控制端R
sbit BtnInc = P1^0; // 增加亮度按键
sbit BtnDec = P1^1; // 减少亮度按键
// 定义变量
unsigned char brightness = 0; // 当前亮度
unsigned char flag = 0; // 控制标志位
// 延时函数
void Delay(unsigned int n)
{
unsigned int i;
while(n--)
{
for(i=0; i<125; i++);
}
}
// 过零检测中断服务程序
void ZC_ISR() interrupt 1
{
if(flag == 1)
{
S = 1;
Delay(brightness);
S = 0;
}
else if(flag == 2)
{
R = 1;
Delay(255 - brightness);
R = 0;
}
}
// 增加亮度按键中断服务程序
void BtnInc_ISR() interrupt 0
{
Delay(50); // 延时消抖
if(BtnInc == 0)
{
flag = 1;
brightness += 10;
if(brightness > 255)
{
brightness = 255;
}
}
}
// 减少亮度按键中断服务程序
void BtnDec_ISR() interrupt 2
{
Delay(50); // 延时消抖
if(BtnDec == 0)
{
flag = 2;
if(brightness > 10)
{
brightness -= 10;
}
else
{
brightness = 0;
}
}
}
// 主函数
void main()
{
EA = 1; // 开启全局中断
EX0 = 1; // 开启外部中断0
EX1 = 1; // 开启外部中断1
IT0 = 1; // 下降沿触发外部中断0
IT1 = 1; // 下降沿触发外部中断1
while(1)
{
if(flag == 0)
{
S = 0;
R = 0;
}
}
}
```
上述代码中,ZC_ISR()是过零检测中断服务程序,BtnInc_ISR()和BtnDec_ISR()分别是增加亮度按键和减少亮度按键的中断服务程序。在主函数中,不断检测标志位flag的值,根据flag的值来控制双向可控硅的控制端S和R的状态,从而控制LED灯的亮度。
阅读全文