51单片机PWM的控制(呼吸灯)

一、PWM

Pulse Width Modulation脉冲宽度调制,简称PWM。

PWM(脉冲宽度调制)对模拟信号电平进行数字编码的方法,计算机只能输出0或5V的数字电压值而不能输出模拟电压,而我们如果想获得一个模拟电压值,则需通过使用高分辨率计数器,改变方波的占空比来对一个模拟信号的电平进行编码。

仍输出数字信号,因为满幅值的直流供电只有5V(1)和0V(0)两种。电压是以一种连接(1)或断开(0)的重复脉冲序列被夹到模拟负载上去的,连接即是直流供电输出,断开即是直流供电断开。通过对连接和断开时间的控制,只要带宽足够,可以输出任意不大于最大电压值的模拟电压。

     输出电压=(接通时间/脉冲时间)*最大电压值

这里写图片描述

二、51单片机的Timer

作者用的单片机是STC89C52,其内部有3个16位Timer,分别为T/C0,T/C1,T/C2,通过配置相关寄存器即可实现Timer的功能控制。

控制PWM需要用到定时器来生成不同占空比的波形,采用定时器中断的方式。

相关寄存器:

1.IE寄存器

名称 功能
0 EX0 外部中断0的中断允许位
1 ET0 Timer0的溢出中断允许位
2 EX1 外部中断1的中断允许位
3 ET1 Timer1的溢出中断允许位
4 ES 串行口中断允许位
5 ET2 Timer
6 - -
7 EA 中断允许总控制位

2. TCON寄存器

名称 功能
0 IT0 外部中断0的触发方式选择位。功能和IE1类似
1
  • 129
    点赞
  • 671
    收藏
    觉得还不错? 一键收藏
  • 32
    评论
以下是使用51单片机的定时器功能实现PWM呼吸灯的方法[^1][^2]: 1. 首先,需要配置定时器和IO口。选择一个定时器作为PWM波的源,并将其输出连接到LED灯。同时,选择一个IO口作为按键输入,用于控制呼吸灯的暂停和方向变化。 2. 在程序中,使用定时器产生PWM波信号。通过改变PWM信号的占空比来控制LED灯的亮度。占空比越大,LED灯越亮;占空比越小,LED灯越暗。 3. 实现流水呼吸灯效果。通过循环遍历LED灯的位置,依次点亮LED灯,并在数码管上显示LED灯的位置和PWM信号的占空比。当按下按键时,暂停流水变化并保持当前亮度。松开按键后,亮度开始变化,并调整呼吸流水的方向。 4. 在最左边的1位数码管上显示LED灯的位置,在最右边的2位数码管上显示PWM信号的占空比。其余的数码管熄灭。 以下是一个示例代码,用于实现51单片机PWM呼吸灯效果: ```c #include <reg51.h> sbit LED = P1^0; // LED连接的IO口 sbit Button = P2^0; // 按键连接的IO口 void delay(unsigned int time) // 延时函数 { unsigned int i, j; for(i = 0; i < time; i++) for(j = 0; j < 125; j++); } void main() { unsigned int brightness = 0; // 亮度 unsigned char direction = 1; // 呼吸流水的方向,1表示递增,0表示递减 while(1) { if(Button == 0) // 按键按下时,暂停流水变化并保持当前亮度 { while(Button == 0); // 等待按键松开 } else // 按键松开后,亮度开始变化,并调整呼吸流水的方向 { if(direction == 1) // 递增方向 { brightness++; if(brightness == 100) // 达到最大亮度后,改变方向为递减 direction = 0; } else // 递减方向 { brightness--; if(brightness == 0) // 达到最小亮度后,改变方向为递增 direction = 1; } } LED = 1; // 点亮LED灯 delay(brightness); // 延时,控制亮度 LED = 0; // 熄灭LED灯 delay(100 - brightness); // 延时,控制亮度 // 在数码管上显示LED灯的位置和PWM信号的占空比 // 例如:当前点亮L6灯光,PWM信号的占空比为30% // 在最左边的1位数码管显示“6”,在最右边的2位数码管显示“30” // 其余的数码管熄灭 // ... } } ```
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值