用52单片机,过零检测,pwm,双向可控硅,控制220v灯泡,一个按键增加亮度,一个按键减少亮度写一个程序
时间: 2023-06-18 12:05:33 浏览: 66
51单片机通过PWM调节灯光亮度
5星 · 资源好评率100%
以下是可能的程序代码,供您参考:
```c
#include <reg52.h>
#define LED_PIN P2_0
#define ZCD_PIN P2_1
#define UP_BTN_PIN P3_0
#define DOWN_BTN_PIN P3_1
#define TRIAC_PIN P3_2
unsigned int count = 0;
unsigned char level = 0;
bit up_btn_pressed = 0;
bit down_btn_pressed = 0;
void delay(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 120; j++);
}
}
void main() {
EA = 1; // enable global interrupt
TMOD = 0x01; // use timer 0 as 16-bit timer
TH0 = 0xFC; // set timer to overflow every 50us
TL0 = 0x18;
TR0 = 1; // start timer
IT0 = 1; // enable external interrupt 0 on falling edge
EX0 = 1; // enable external interrupt 0
while (1) {
if (up_btn_pressed && level < 100) {
level++;
up_btn_pressed = 0;
}
if (down_btn_pressed && level > 0) {
level--;
down_btn_pressed = 0;
}
if (count < level) {
TRIAC_PIN = 1;
} else {
TRIAC_PIN = 0;
}
delay(10); // delay to control the brightness
}
}
void zcd_isr() interrupt 0 {
count = 0;
}
void timer0_isr() interrupt 1 {
count++;
if (count >= 100) {
count = 0;
}
if (count == 0) {
LED_PIN = 1;
ZCD_PIN = 1;
} else if (count >= level) {
LED_PIN = 0;
ZCD_PIN = 0;
}
}
void up_btn_isr() interrupt 2 {
up_btn_pressed = 1;
}
void down_btn_isr() interrupt 3 {
down_btn_pressed = 1;
}
```
其中,`zcd_isr()` 是过零检测中断服务函数,用于检测交流电的正零交叉点;`timer0_isr()` 是定时器中断服务函数,用于控制 PWM 和延时控制灯泡亮度;`up_btn_isr()` 和 `down_btn_isr()` 分别是增加亮度和减少亮度按键的中断服务函数,用于更新亮度等级。在 `main()` 函数中,我们不断检测按键状态和亮度等级,并根据亮度等级控制 TRIAC 来控制灯泡的亮度。需要注意的是,本程序中的延时函数 `delay()` 可能不够精确,因此实际效果可能有所偏差。
阅读全文