用52单片机,计数器,定时器,过零检测,双向可控硅,控制一个220v灯泡,实现8个档位调节,外部中断控制按键,一个按键增加亮度,一个按键减少亮度,写一个调光程序
时间: 2024-05-14 07:18:14 浏览: 189
好的,下面是基于52单片机、计数器、定时器、过零检测和双向可控硅的调光程序:
1. 初始化相关寄存器和变量:
```
void init()
{
TMOD = 0x01; // 定时器0工作模式为16位定时器模式
TH0 = 0xFC; // 定时器0初值,每10ms中断一次
TL0 = 0x66;
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
EX0 = 1; // 开启外部中断0(按键1)
IT0 = 1; // 外部中断0下降沿触发
EX1 = 1; // 开启外部中断1(按键2)
IT1 = 1; // 外部中断1下降沿触发
P1 = 0x00; // P1口初始输出0
count = 0; // 计数器初始值为0
brightness = 0; // 初始亮度为0
}
```
2. 定时器0中断服务程序:
```
void timer0() interrupt 1
{
count++; // 计数器加1
if (count >= 100) // 100个10ms,即1s
{
count = 0; // 计数器清零
flag = 1; // 标志位置1,表示1s已到
}
}
```
3. 外部中断0服务程序:
```
void int0() interrupt 0
{
if (brightness < 8) // 最大亮度为8档
{
brightness++; // 亮度加1
}
}
```
4. 外部中断1服务程序:
```
void int1() interrupt 2
{
if (brightness > 0) // 最小亮度为0档
{
brightness--; // 亮度减1
}
}
```
5. 过零检测服务程序:
```
void zc() interrupt 3
{
if (flag) // 如果标志位为1,即1s已到
{
flag = 0; // 标志位清零
if (brightness == 0) // 如果亮度为0档,直接关闭灯泡
{
P1 = 0x00;
}
else // 否则计算定时器计数值,控制灯泡亮度
{
switch (brightness)
{
case 1:
value = 600; // 600 / 1000000 s
break;
case 2:
value = 800;
break;
case 3:
value = 1000;
break;
case 4:
value = 1200;
break;
case 5:
value = 1400;
break;
case 6:
value = 1600;
break;
case 7:
value = 1800;
break;
case 8:
value = 2000;
break;
default:
break;
}
for (i = 0; i < value; i++); // 延时
P1 = 0xFF; // P1口输出1,控制双向可控硅导通,灯泡亮起
for (i = 0; i < (10000 - value); i++); // 延时
P1 = 0x00; // P1口输出0,控制双向可控硅截止,灯泡灭掉
}
}
}
```
以上就是基于52单片机、计数器、定时器、过零检测和双向可控硅的调光程序。
阅读全文