用52单片机,过零检测,双向可控硅,控制一个220v灯泡,实现8个档位调节,一个按键增加亮度,一个按键减少亮度,写一个调光程序
时间: 2023-11-09 09:07:02 浏览: 57
以下是一个基于52单片机、双向可控硅和按键的灯光调节程序,它实现了8个档位调节以及按键增加和减少亮度功能。
首先,需要进行过零检测,以确定何时打开双向可控硅。在本例中,使用GPIO口 P3.2 进行过零检测,当检测到电压为零时,将 GPIO P1.0 置为高电平,表示打开双向可控硅。
```c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DIM_UP = P2^0; // 增加亮度按键
sbit DIM_DOWN = P2^1; // 减少亮度按键
sbit ZCD = P3^2; // 过零检测
sbit SCR = P1^0; // 双向可控硅控制
uchar dim_level = 0; // 亮度级别
uchar dim_table[8] = {10, 20, 30, 40, 50, 60, 70, 80}; // 亮度级别表
void delay(uint t) // 延时函数
{
uint i, j;
for (i = 0; i < t; i++) {
for (j = 0; j < 100; j++);
}
}
void zcd_isr(void) interrupt 0 // 过零中断服务程序
{
SCR = 1; // 打开双向可控硅,使灯泡通电
delay(dim_table[dim_level]); // 延迟一段时间,控制亮度
SCR = 0; // 关闭双向可控硅,使灯泡断电
}
void main()
{
EA = 1; // 开启总中断
EX0 = 1; // 开启外部中断0
IT0 = 1; // 设置外部中断0为下降沿触发
while (1) {
if (DIM_UP == 0) { // 如果按下增加亮度按键
delay(10); // 延迟一段时间,消除抖动
if (DIM_UP == 0) { // 如果还是按下状态
dim_level++; // 增加亮度级别
if (dim_level > 7) dim_level = 7; // 不能超过最大亮度级别
}
while (DIM_UP == 0); // 等待按键释放
}
if (DIM_DOWN == 0) { // 如果按下减少亮度按键
delay(10); // 延迟一段时间,消除抖动
if (DIM_DOWN == 0) { // 如果还是按下状态
dim_level--; // 减少亮度级别
if (dim_level < 0) dim_level = 0; // 不能低于最小亮度级别
}
while (DIM_DOWN == 0); // 等待按键释放
}
}
}
```
在中断服务程序中,需要根据当前的亮度级别来控制灯泡的亮度。在本例中,使用一个亮度级别表 `dim_table` 来存储每个亮度级别对应的延时时间,使得灯泡通电的时间越长,灯泡发出的光就越明亮。
在主循环中,检测是否按下了增加或减少亮度的按键,如果按下了,则增加或减少亮度级别,并且限制亮度级别在0到7之间。最后,等待按键释放。
这样,我们就实现了一个简单的灯光调节程序。
阅读全文