用51单片机编写一个pwm控制的呼吸灯的代码类似#include <reg51.h>//包含头文件reg51.h,定义了51单片机的专用寄存器//符号常量OFF,表示灯灭 #define OFF 1 #define ON 0 //符号常量ON,表示灯亮 sbit light=P1^0;//台灯灯泡连接P1.0引脚 sbit light_up=P0^0; //亮度加强按键连接PO.0引脚 sbit light_down=P0^1;//亮度减弱按键连接PO.1引脚 void delay (unsigned int i) { unsigned int k; for(k=0;k<i;k++); } void main() { int i,j; i=0; j=500; while(1) { light=ON; delay(i); light=OFF; delay(j); if(light_up==0) { delay(100); if(light_up==0) { j--; i++; if(j==0) j=500; i=0; } } if(light_down==0) { delay(100); if(light_up==0) { j++; i--; if(j==0) i=500; j=0; } } } }
时间: 2023-12-04 08:02:25 浏览: 100
基于51单片机pwm控制的呼吸灯程序
5星 · 资源好评率100%
好的,下面是一个基于51单片机的PWM控制呼吸灯的程序,类似于你提供的代码:
```
#include <reg51.h>
#define FREQ 11059200 // 时钟频率
#define PWM_FREQ 100 // PWM频率
#define T_PWM (FREQ / PWM_FREQ) // PWM周期
#define DUTY_MIN 0 // 最小占空比
#define DUTY_MAX 255 // 最大占空比
sbit LED = P1^0; // LED连接P1.0引脚
sbit BTN_UP = P0^0; // 亮度加强按键连接PO.0引脚
sbit BTN_DOWN = P0^1; // 亮度减弱按键连接PO.1引脚
unsigned char duty = DUTY_MIN; // 初始占空比设为最小值
signed char delta = 1; // 占空比的变化量
void pwm_init()
{
TMOD |= 0x01; // 设置定时器0为模式1
TH0 = 0xFF; // 初始值设为最大值
TL0 = 0xFF;
TR0 = 1; // 启动定时器0
}
void update_duty()
{
if (BTN_UP == 0) {
delay(10); // 延时去抖动
if (BTN_UP == 0) {
duty += 10; // 增加占空比
if (duty > DUTY_MAX) {
duty = DUTY_MAX;
}
}
}
if (BTN_DOWN == 0) {
delay(10); // 延时去抖动
if (BTN_DOWN == 0) {
duty -= 10; // 减小占空比
if (duty < DUTY_MIN) {
duty = DUTY_MIN;
}
}
}
}
void main()
{
pwm_init(); // 初始化PWM
while (1) {
LED = 1; // 点亮LED
delay(T_PWM * duty / 255); // 延时
LED = 0; // 熄灭LED
delay(T_PWM * (255 - duty) / 255); // 延时
update_duty(); // 更新占空比
}
}
void delay(unsigned int t)
{
unsigned int i, j;
for (i = 0; i < t; i++) {
for (j = 0; j < 10; j++);
}
}
```
这个程序使用了定时器0来实现PWM控制,可以控制一个LED灯的亮度呼吸效果,并且通过按下亮度加强或减弱按键,来改变LED灯的亮度。程序中使用了一个占空比的变量来控制LED灯的亮度,每次循环改变占空比的值,从而实现呼吸灯的效果。同时,程序还实现了按键的检测和去抖动,可以稳定地改变LED灯的亮度。
阅读全文