用52单片机,过零检测电路,用四象限双向可控硅电源隔离和光耦隔离电路,控制220v50hz电灯泡,实现8种亮度,一个按键控制增加亮度,一个按键控制减小亮度的程序
时间: 2024-05-05 12:21:10 浏览: 93
以下是基于52单片机的过零检测电路,四象限双向可控硅电源隔离和光耦隔离电路,控制220v50hz电灯泡,实现8种亮度,一个按键控制增加亮度,一个按键控制减小亮度的程序。
```c
#include <reg52.h>
sbit Z = P1^0;
sbit SCR = P1^1;
sbit L1 = P2^0;
sbit L2 = P2^1;
sbit L3 = P2^2;
sbit L4 = P2^3;
sbit L5 = P2^4;
sbit L6 = P2^5;
sbit L7 = P2^6;
sbit L8 = P2^7;
sbit UP = P3^0;
sbit DOWN = P3^1;
unsigned char light = 0; // 当前亮度
void delay(unsigned int t) // 延时函数
{
unsigned int i, j;
for(i=0; i<t; i++)
for(j=0; j<100; j++);
}
void main()
{
Z = 1; // 设置为输入模式
SCR = 0; // 关闭可控硅
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0xFC; // 定时器0初值
TL0 = 0x67;
EA = 1; // 允许中断
ET0 = 1; // 允许定时器0中断
TR0 = 1; // 启动定时器0
while(1)
{
if(UP == 0) // 检测到按键UP按下
{
delay(10); // 延时去抖
if(UP == 0) // 确认按键已按下
{
if(light < 8) // 增加亮度
light++;
}
while(UP == 0); // 等待按键UP抬起
}
if(DOWN == 0) // 检测到按键DOWN按下
{
delay(10); // 延时去抖
if(DOWN == 0) // 确认按键已按下
{
if(light > 0) // 减小亮度
light--;
}
while(DOWN == 0); // 等待按键DOWN抬起
}
}
}
void timer0() interrupt 1 // 定时器0中断服务函数
{
static unsigned char cnt = 0; // 计数器
static unsigned char code[] = {0xFF, 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00}; // 亮度码表
unsigned char i;
Z = 0; // 将P1.0置为输出模式
P1 = 0; // 将P1口输出低电平
delay(1); // 延时一段时间
if(Z == 0) // 检测到过零点
{
cnt = code[light]; // 根据当前亮度设置计数器初值
SCR = 1; // 打开可控硅
for(i=0; i<cnt; i++)
; // 等待一段时间
SCR = 0; // 关闭可控硅
}
Z = 1; // 将P1.0置为输入模式
}
```
本程序使用定时器0进行周期性中断,通过过零检测电路检测交流电的零点,再使用四象限双向可控硅电源隔离和光耦隔离电路控制灯泡的亮度。按键UP和DOWN分别用于增加和减小灯泡的亮度,最多可以实现8种亮度。
阅读全文