51单片机输出8个同一频率呼吸灯,两秒为一个周期,C代码
时间: 2024-01-01 07:03:56 浏览: 68
下面是使用51单片机输出8个同一频率呼吸灯的C代码:
```c
#include <reg51.h>
typedef unsigned char u8;
typedef unsigned int u16;
#define FREQ 20000000L // 定义晶振频率
u8 pwm_duty_cycle = 0; // 占空比
void delay(u16 t) // 延时函数
{
u16 i, j;
for(i = t; i > 0; i--)
for(j = 110; j > 0; j--);
}
void pwm_led(u8 pin) // PWM控制LED亮度
{
u8 i;
for(i = 0; i < 100; i++) // 占空比范围为0~99
{
if(i < pwm_duty_cycle) // 高电平
P1 |= (1 << pin);
else // 低电平
P1 &= ~(1 << pin);
delay(5); // 调整PWM频率,可以改变此延时时间
}
}
void main()
{
u8 i;
u8 pins[8] = {0, 1, 2, 3, 4, 5, 6, 7}; // 8个IO口
TMOD = 0x01; // 定时器T0工作模式1
TH0 = 0x3C; // 定时器T0高8位初始值,实现2秒中断
TL0 = 0xAF; // 定时器T0低8位初始值,实现2秒中断
ET0 = 1; // 开启定时器T0中断
EA = 1; // 开启总中断
while(1)
{
for(i = 0; i < 8; i++)
{
pwm_led(pins[i]); // PWM控制LED亮度
}
}
}
void timer0_isr() interrupt 1 // 定时器T0中断服务程序
{
pwm_duty_cycle++; // 增加占空比
if(pwm_duty_cycle == 100) // 占空比达到最大值,需要重新开始
{
pwm_duty_cycle = 0;
}
TH0 = 0x3C; // 定时器T0高8位初始值,实现2秒中断
TL0 = 0xAF; // 定时器T0低8位初始值,实现2秒中断
}
```
注:此代码使用定时器T0实现定时中断,每次中断时增加PWM占空比,当占空比达到100时重新开始。可以通过调整`delay(5)`的延时时间来调整PWM频率。
阅读全文