用52单片机,过零检测,pwm,双向可控硅,控制220v灯泡,一个按键增加亮度,一个按键减少亮度写一个程序
时间: 2023-06-18 12:06:24 浏览: 66
51单片机通过PWM调节灯光亮度
5星 · 资源好评率100%
下面是一个简单的程序:
```c
#include <reg52.h>
sbit ZP = P3^2; // 过零检测引脚
sbit SCR = P1^5; // 双向可控硅引脚
sbit UP = P3^3; // 增加亮度按键
sbit DOWN = P3^4; // 减少亮度按键
unsigned int duty = 0; // 占空比
bit direction = 0; // 方向标志位,0为降低亮度,1为增加亮度
void delay(unsigned int t) // 延时函数
{
unsigned int i, j;
for (i = 0; i < t; i++)
for (j = 0; j < 120; j++);
}
void main()
{
ZP = 1; // 设置过零检测引脚为上拉输入
SCR = 0; // 初始状态下,可控硅关闭
EA = 1; // 打开总中断
EX0 = 1; // 打开外部中断0
IT0 = 1; // 设置外部中断0为下降沿触发
while (1)
{
if (UP == 0) // 检测增加亮度按键是否按下
{
delay(10); // 延时去抖动
if (UP == 0 && duty < 1000) // 再次检测按键是否按下,且占空比小于100%
{
duty += 50; // 增加占空比
if (duty > 1000) // 占空比最大为100%
duty = 1000;
}
while (UP == 0); // 等待按键释放
}
if (DOWN == 0) // 检测减少亮度按键是否按下
{
delay(10); // 延时去抖动
if (DOWN == 0 && duty > 0) // 再次检测按键是否按下,且占空比大于0%
{
duty -= 50; // 减少占空比
if (duty < 0) // 占空比最小为0%
duty = 0;
}
while (DOWN == 0); // 等待按键释放
}
}
}
void isr() interrupt 0 // 外部中断0中断服务程序
{
if (direction == 0) // 当前为降低亮度状态
{
SCR = 1; // 开启可控硅
delay(duty); // 延时
SCR = 0; // 关闭可控硅
direction = 1; // 改变方向标志位
}
else // 当前为增加亮度状态
{
delay(1000 - duty); // 延时
SCR = 1; // 开启可控硅
delay(duty); // 延时
SCR = 0; // 关闭可控硅
direction = 0; // 改变方向标志位
}
}
```
程序的主要思路是:通过外部中断0检测到过零点,然后根据占空比控制可控硅的导通时间,从而控制灯泡亮度。同时,通过增加亮度按键和减少亮度按键来增加或减少占空比。程序中还包含了延时去抖动的代码,以及占空比的最大值和最小值的限制。
阅读全文