用52单片机,过零检测,双向可控硅,pwm,控制一个220v灯泡,8个档位,一个按键增加亮度,一个按键减少亮度的调光程序
时间: 2023-06-19 20:05:44 浏览: 112
以下是基于52单片机的过零检测、双向可控硅、pwm控制220V灯泡,实现8个档位的调光程序,其中有一个按键增加亮度,一个按键减少亮度的代码实现。
首先,需要使用一个变压器将220V交流电降压为12V直流电,然后使用一个电桥整流电路将交流电转换为直流电。接下来,使用一个光耦进行过零检测,将过零信号输入到单片机的外部中断引脚上。同时,使用一个双向可控硅控制220V灯泡的电流,通过单片机的PWM输出控制双向可控硅的导通角度,从而实现调光。
以下是代码实现:
```c
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit Zerocrossing = P3^2; // 过零检测引脚
sbit Triac = P3^3; // 双向可控硅控制引脚
sbit UpButton = P1^0; // 增加亮度按键
sbit DownButton = P1^1; // 减少亮度按键
uint counter = 0; // 计数器
uint brightness = 0; // 亮度值
uint pwm_value = 0; // PWM值
void delay_us(uint us)
{
while(us--)
_nop_();
}
void delay_ms(uint ms)
{
uchar i;
while(ms--)
{
i = 120;
while(i--)
delay_us(1000);
}
}
void Triac_On(void)
{
Triac = 1;
delay_us(10);
Triac = 0;
}
void Triac_Off(void)
{
Triac = 1;
delay_us(10);
Triac = 0;
}
void Zerocrossing_ISR(void) interrupt 0
{
counter++;
if(counter >= pwm_value)
Triac_On();
else
Triac_Off();
}
void UpButton_ISR(void) interrupt 1
{
delay_ms(20); // 去抖动
if(UpButton == 0)
{
brightness++;
if(brightness > 7)
brightness = 7;
pwm_value = 255 * brightness / 7;
}
}
void DownButton_ISR(void) interrupt 2
{
delay_ms(20); // 去抖动
if(DownButton == 0)
{
brightness--;
if(brightness < 0)
brightness = 0;
pwm_value = 255 * brightness / 7;
}
}
void main()
{
TMOD = 0x01; // 定时器0工作模式1
TH0 = 0xFC; // 定时器0初值
TL0 = 0x67;
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
TR0 = 1; // 启动定时器0
EX0 = 1; // 开启外部中断0
IT0 = 1; // 下降沿触发
EX1 = 1; // 开启外部中断1
IT1 = 1; // 下降沿触发
while(1)
{
if(counter >= 255)
counter = 0;
}
}
```
在上面的代码中,我们使用了定时器0中断来进行PWM输出,时钟频率为12MHz,计时器初值为65536-500=65036,中断周期为20us。当计数器达到PWM值时,触发一次Triac_On()函数,即双向可控硅导通,灯泡亮度增加;否则触发Triac_Off()函数,即双向可控硅截止,灯泡亮度减小。增加亮度和减少亮度的按键中断函数分别为UpButton_ISR()和DownButton_ISR(),在这里我们使用了一个计数器brightness来记录亮度档位,PWM值根据brightness计算得出。在主函数中,我们通过不断循环来实现计数器counter的清零,从而实现过零检测。
需要注意的是,本代码仅供参考,实际使用时需要根据电路和硬件设备进行相应的调整和修改。同时,涉及到220V电压,需要注意安全问题。
阅读全文