用52单片机,过零检测,双向可控硅,控制一个220v灯泡,实现8个档位调节,一个按键增加亮度,一个按键减少亮度,写一个调光程序
时间: 2023-11-09 12:07:02 浏览: 39
基于51单片机的可控硅调压调光程序-带过零检测
以下是一个基于52单片机,过零检测和双向可控硅的调光程序,实现8个档位调节,一个按键增加亮度,一个按键减少亮度的功能:
```C
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit ZD = P1^0; // 过零检测引脚
sbit SCR = P1^1; // 双向可控硅控制引脚
sbit UP = P3^2; // 增加亮度按键
sbit DOWN = P3^3; // 减少亮度按键
uchar code Light_Tab[9] = {0xFF, 0xEF, 0xCF, 0x8F, 0x4F, 0x0F, 0x07, 0x03, 0x01}; // 调光表
uint Timer_Count = 0; // 定时器计数器
uint Light_Index = 0; // 调光表索引
void Timer0_Init() { // 定时器初始化
TMOD |= 0x01;
TH0 = 0xFC;
TL0 = 0x67;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void Delay(uint ms) { // 延时函数
uint i, j;
for (i = ms; i > 0; i--) {
for (j = 114; j > 0; j--);
}
}
void main() {
uchar i;
Timer0_Init();
while (1) {
if (!UP) { // 增加亮度按键按下
Delay(10); // 延时去抖动
if (!UP) { // 真正按下
if (Light_Index < 8) {
Light_Index++;
}
}
}
if (!DOWN) { // 减少亮度按键按下
Delay(10); // 延时去抖动
if (!DOWN) { // 真正按下
if (Light_Index > 0) {
Light_Index--;
}
}
}
SCR = 1; // 先关闭可控硅
for (i = 0; i < Light_Tab[Light_Index]; i++); // 延时调光
SCR = 0; // 打开可控硅
}
}
void Timer0_ISR() interrupt 1 { // 定时器0中断服务程序
Timer_Count++;
if (Timer_Count >= 80) { // 1s
Timer_Count = 0;
if (ZD) { // 正半周
SCR = 1; // 先关闭可控硅
} else { // 负半周
SCR = 0; // 打开可控硅
}
}
}
```
程序的思路是,定时器0中断服务程序每80个中断(即1s)执行一次,根据过零检测引脚的状态(高电平表示正半周,低电平表示负半周),控制双向可控硅的开关,从而控制灯的亮度。而调光功能则是通过按键控制调光表的索引,从而改变灯的亮度。
需要注意的是,双向可控硅的控制引脚需要与过零检测引脚相位一致,否则会出现闪烁等问题。另外,程序中的延时调光方法并不是最优的,可以根据实际情况进行优化。
阅读全文