51单片机PWM的控制(呼吸灯)
来源:互联网 发布:windows update打不开 编辑:程序博客网 时间:2024/04/28 04:52
一、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寄存器
2. TCON寄存器
3. TMOD寄存器
控制Timer0/1的工作方式
4. Timer0/1计数寄存器
TL0
TL1
TH0
TH1
当定时开启后,TL0(TL1)自动跟随机器周期加一。当TL0(TL1)满了后,自动清零同时向TH0(TH1)进一位,不需要手动操作.
而当TL0(TL1)和TH0(TH1)都满了以后,此时如果定时中断和总中断都已经打开,那么就会发生溢出中断,同时这两个寄存器清零
三、运用PWM完成呼吸灯
1. 硬件电路
2. 软件驱动
unsigned char PWM_COUNT; //计数unsigned int HUXI_COUNT; //占空比更新时间unsigned char PWM_VLAUE; //占空比比对值bit direc_flag; //占空比更新方向void timer0_init(){ TMOD=0x02; //模式设置,00010000,定时器0,工作于模式2(M1=1,M0=0) TH0=0x47; //定时器溢出值设置,每隔200us发起一次中断。 TL0=0X47; TR0=1; //定时器0开始计时 ET0=1; //开定时器0中断 EA=1; //开总中断 PWM_COUNT =0;}void time0() interrupt 1{ PWM_COUNT++; HUXI_COUNT++; if(PWM_COUNT == PWM_VLAUE) //判断是否到了点亮LED的时候 LED = 1; //点亮LED if(PWM_COUNT == 10) //当前周期结束 { LED = 0; //熄灭LED PWM_COUNT = 0; //重新计时 } if((HUXI_COUNT == 600) && (direc_flag == 0)) { //占空比增加10% HUXI_COUNT = 0; PWM_VLAUE++; if(PWM_VLAUE == 9) //占空比更改方向 direc_flag = 1; } if((HUXI_COUNT == 600) && (direc_flag == 1)) { //占空比减少10% HUXI_COUNT = 0; PWM_VLAUE--; if(PWM_VLAUE == 1) //占空比更改方向 direc_flag = 0; } }void main(){ HUXI_COUNT = 0; PWM_COUNT = 0; PWM_VLAUE = 5; direc_flag = 0; LED = 1; //默认LED熄灭 timer0_init(); //定时器0初始化 while(1);}
阅读全文
0 0
- 51单片机PWM的控制(呼吸灯)
- 基于PWM的呼吸灯
- 单片机学习札记9 定时器模拟PWM呼吸灯
- 51单片机PWM控制电机
- 基于stm32的pwm呼吸灯
- 【PIC32MZ】PWM呼吸灯
- PWM输出,呼吸灯
- STM32使用PWM控制LED呼吸灯效果
- 单片机的PWM波控制LED灯电路
- 51单片机按键控制输出pwm的占空比
- 基于51单片机实现的电机PWM控制及测速(Proteus仿真)
- 51单片机 LED点阵的呼吸灯效果
- 51单片机 LED点阵的呼吸灯效果
- 使用51单片机输出PWM控制舵机
- 51单片机PWM双舵机控制详解
- 51单片机 精确控制舵机pwm
- 51单片机中控制PWM波
- msp430g2553单片机 感应温度的呼吸灯
- 我的前端开发之路---谨以记录工作中那些踩过的坑,持续更新中~~
- 第五部分 模块
- Java 泛型详解
- iOS ijkplayer prepareToPlay 函数详解
- Java中正确使用文件分隔符
- 51单片机PWM的控制(呼吸灯)
- Cocos2d-X游戏开发(一)
- 如何使用 Vim 的 help
- html基础2012
- JPA配置多数据源多persistence.xml文件
- 如何区分不同用户——Cookie/Session机制详解
- LeetCode之路:171. Excel Sheet Column Number
- Linux shell中进制转换
- Yarn的fair和capacity调度器