用52单片机,过零检测,pwm,双向可控硅,控制220v灯泡,一个按键增加亮度,一个按键减少亮度写一个程序
时间: 2023-06-18 11:05:50 浏览: 124
以下是一个简单的程序框架,可以实现通过按键控制灯泡亮度的功能:
```c
#include <reg52.h>
#define ON 0
#define OFF 1
sbit SCR = P1^0; // 双向可控硅控制引脚
sbit ZERO = P1^1; // 过零检测引脚
sbit UP = P3^4; // 增加亮度按键
sbit DOWN = P3^5; // 减少亮度按键
unsigned char brightness = 50; // 初始亮度为50%
bit flag = OFF; // 控制灯泡开关状态
void delay(unsigned int); // 延时函数
void increase_brightness(); // 增加亮度函数
void decrease_brightness(); // 减少亮度函数
void main() {
EA = 1; // 开启总中断
ET0 = 1; // 开启定时器0中断
ET1 = 1; // 开启定时器1中断
EX0 = 1; // 开启外部中断0
EX1 = 1; // 开启外部中断1
TMOD = 0x11; // 定时器0和1均为模式1
TH0 = 0xFF; // 定时器0初始值
TL0 = 0xFF;
TH1 = 0xFF; // 定时器1初始值
TL1 = 0xFF;
TR0 = 1; // 开启定时器0
TR1 = 1; // 开启定时器1
while (1) {
if (flag == ON) {
SCR = ON; // 双向可控硅导通
} else {
SCR = OFF; // 双向可控硅截止
}
}
}
void delay(unsigned int t) {
while (t--);
}
void increase_brightness() {
if (brightness < 100) {
brightness += 10; // 每次增加10%
}
}
void decrease_brightness() {
if (brightness > 0) {
brightness -= 10; // 每次减少10%
}
}
void timer0() interrupt 1 {
static unsigned char cnt = 0;
TH0 = 0xFF;
TL0 = 0xFF;
cnt++;
if (cnt > brightness) {
flag = OFF; // 超过当前亮度值,灯泡熄灭
cnt = 0;
}
}
void timer1() interrupt 3 {
static unsigned char cnt = 0;
TH1 = 0xFF;
TL1 = 0xFF;
cnt++;
if (cnt >= 30) { // 30个周期后再次检测过零
if (ZERO == ON) { // 过零检测到信号
cnt = 0;
flag = ON; // 控制灯泡开关状态
}
}
}
void external0() interrupt 0 {
delay(1000); // 延时去抖动
if (UP == 0) {
increase_brightness(); // 增加亮度
}
}
void external1() interrupt 2 {
delay(1000); // 延时去抖动
if (DOWN == 0) {
decrease_brightness(); // 减少亮度
}
}
```
需要注意的几点:
1. 过零检测和PWM的实现需要用到定时器和中断,这里使用了定时器0和定时器1。
2. 双向可控硅的控制需要通过控制引脚的电平来实现,这里使用了P1^0。
3. 增加亮度和减少亮度的按键需要通过中断来实现,这里使用了外部中断0和外部中断1。
4. 在按键处理函数中,需要加上一定的延时来去抖动。
阅读全文