89c52单片机过零检测触发光可控硅调光电路,用两个按键控制调光电路电压的升降,一共八个挡位的程序
时间: 2024-06-08 12:12:19 浏览: 153
可控硅过零触发调压器原理电路
5星 · 资源好评率100%
以下是89C52单片机过零检测触发光可控硅调光电路,用两个按键控制调光电路电压的升降,一共八个挡位的程序:
```
#include <reg52.h>
sbit triac = P1^0; // 光可控硅控制引脚
sbit zero_cross = P1^1; // 过零检测引脚
sbit up = P3^4; // 调光电路电压升高按键
sbit down = P3^5; // 调光电路电压降低按键
unsigned char dimming_level = 0; // 当前亮度级别,0表示最暗,7表示最亮
void delay_us(unsigned int us) // 延时函数,us为要延时的微秒数
{
while (us--)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void delay_ms(unsigned int ms) // 延时函数,ms为要延时的毫秒数
{
while (ms--)
{
delay_us(1000);
}
}
void triac_trigger() // 光可控硅触发函数
{
triac = 1;
delay_us(10);
triac = 0;
}
void zero_cross_isr() interrupt 0 // 过零中断服务函数
{
unsigned char i = dimming_level;
zero_cross = 0;
while (i--)
{
delay_us(100); // 延时控制相位
}
triac_trigger(); // 触发光可控硅
zero_cross = 1;
}
void main()
{
zero_cross = 1; // 初始化过零检测引脚
EA = 1; // 允许中断
EX0 = 1; // 允许外部中断0
IT0 = 1; // 外部中断0下降沿触发
while (1)
{
if (!up) // 如果升高按键被按下
{
delay_ms(20); // 延时去抖动
if (!up) // 如果升高按键仍被按下
{
dimming_level++;
if (dimming_level > 7)
{
dimming_level = 7;
}
}
while (!up); // 等待升高按键释放
}
if (!down) // 如果降低按键被按下
{
delay_ms(20); // 延时去抖动
if (!down) // 如果降低按键仍被按下
{
dimming_level--;
if (dimming_level > 7)
{
dimming_level = 0;
}
}
while (!down); // 等待降低按键释放
}
}
}
```
本程序使用89C52单片机实现了过零检测触发光可控硅调光电路,用两个按键控制调光电路电压的升降,一共八个挡位。在主循环中,程序不断检测升高按键和降低按键是否被按下,如果被按下则增加或减小当前亮度级别,然后等待按键释放。在过零中断服务函数中,程序延时一定时间控制相位,然后触发光可控硅。
阅读全文