写一份51单片机可控硅调光的代码
时间: 2023-08-06 20:11:49 浏览: 203
以下是一份简单的51单片机可控硅调光的代码,基于定时器和PWM控制实现:
```c
#include <reg51.h>
sbit SCR = P1^0; // 可控硅控制引脚
void delay(unsigned int t) // 延时函数
{
unsigned int i;
while(t--)
for(i=0;i<122;i++);
}
void InitTimer0(void) // 定时器0初始化
{
TMOD |= 0x01; // 16位定时器模式
TH0 = 0xFC; // 初始值
TL0 = 0x67;
ET0 = 1; // 允许定时器0中断
TR0 = 1; // 启动定时器0
}
void InitPWM(void) // PWM初始化
{
TMOD |= 0x10; // 定时器1为8位自动重装模式
TH1 = TL1 = 0x00; // 初始值
ET1 = 1; // 允许定时器1中断
TR1 = 1; // 启动定时器1
}
void main(void)
{
InitTimer0(); // 初始化定时器0
InitPWM(); // 初始化PWM
while(1)
{
SCR = 1; // 可控硅导通
delay(200); // 延时一段时间,控制灯亮度
SCR = 0; // 可控硅截止
delay(800); // 延时一段时间,控制灯亮度
}
}
void Timer0_ISR(void) interrupt 1 // 定时器0中断服务程序
{
TH0 = 0xFC; // 重新赋初始值
TL0 = 0x67;
P1 ^= 0x01; // 翻转P1.0口
}
void Timer1_ISR(void) interrupt 3 // 定时器1中断服务程序
{
static unsigned char cnt = 0;
cnt++;
if(cnt == 200)
{
P1 ^= 0x02; // 翻转P1.1口
cnt = 0;
}
TH1 = TL1 = 0xFF - P1^0; // 根据SCR控制PWM占空比
}
```
其中,定时器0用于控制LED闪烁,定时器1用于产生PWM信号控制可控硅。定时器0中断服务程序用于控制LED翻转,定时器1中断服务程序用于控制PWM占空比。通过调整可控硅导通时间和延时时间,可以实现灯的调光效果。
阅读全文