经过7节的学习,我们已经掌握了基本的硬件的使用规则,从本节开始我们开始学习一些模块的使用PWM、PCF8591、AT24C02、DS18B20、DS1302、555频率测量、光敏电阻测量、超声波测距等。本节先将PWM的基本原理,本节通过调节呼吸灯进一步理解PWM。如果之前的led、按键、数码管、中断等有不懂的请去我的主页看一下之前的文章,或许可以帮助你。(1条消息) Do My Best的博客_CSDN博客-蓝桥杯单片机比赛学习领域博主

pwm的概念

PWM脉冲宽度调制,就是英文 “Pulse Width Modulation” 的缩写,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。

pwm的频率(Hz)

就是1s中有几个脉冲(周期),如有50个脉冲(周期)pwm的频率就是50Hz。

什么是脉冲?

脉冲就是从低电平到高电平再回到高电平,这样就是1个脉冲信号。

例:如下图,如果1s中产生3个脉冲(也就是3个周期),那么此pwm的频率就为3Hz。

PWM的周期 (S)

pwm的周期(T = 1 / f),也就是频率的倒数。

例:pwm频率(f)为50Hz,周期(T)就为20ms

1s中有50个周期(脉冲),每个周期为20ms

PWM的占空比

pwm的占空比就是 在一个周期内,高电平时间占整个周期时间的比例。

例:一个pwm的周期为20ms,高电平的时间为15ms,则此pwm的占空比为15/20 = 75%

PWM的基本原理

在我们使用单片机的时候一般都会使用到PWM进行小车调速、灯光亮度调节等,一般的,都是通过IO口输出高低电平调节占空比。例如,假设单片机输出的高电平为5V,低电平为0V,我们要想得到0~5V之间的任意电压就要使用PWM,通过改变IO口的占空比从而实现DA转化(数字量转化为模拟量)

我们知道,单片机可以输出5V和0V的电压,那么怎么输出0~5V之间的任意电压呢?我们现在就得使用pwm改变占空比 进而 输出0~5V之间的任意电压。

例:如下图,占空比依次为50% 25% 75%,他们的输出电压为:

占空比为50%:Vout = 5V*50%=2.5V

占空比为25%:Vout = 5V*25%=1.25V

占空比为75%:Vout = 5V*75%=3.75V

综上,PWM的 这种原理就是通过DA转换来实现的,最重要的是我们要知道输出电压是通过改变占空比来实现的。

PWM调节呼吸灯

在这里我们需要知道这样的小知识,LED灯的亮度是由电压来决定的,给的电压大LED亮度强,给的电压小LED亮度弱

从百度上我们可以搜到,人眼对于83Hz的频率以上的刷新率基本不感到闪烁?

用定时器模拟pwm,具体参数如何设置?如下图,请认真看,重点!重点!!重点!!!

步骤:

1、我们用定时器模拟一个pwm周期,我们选择频率为200Hz,周期为5ms(T=1/200s)的周期信号,每隔50us进一次中断,程序如下

void Timer0Init(void)        //50微秒@12.000MHz
{AUXR &= 0x7F;     //定时器时钟12T模式TMOD &= 0xF0;      //设置定时器模式TL0 = 0xCE;       //设置定时初值TH0 = 0xFF;        //设置定时初值TF0 = 0;       //清除TF0标志TR0 = 1;      //定时器0开始计时EA=1;ET0=1;
}//每50us进入一次中断,flag++,当flag=100时,就相当于过了5ms
//也就是相当于我们这里设置了一个pwm周期为5ms,频率为200Hz(f = 1/T)
void Timer0Service(void)  interrupt 1
{flag++;                              if(flag==100)flag=0;
}

2、并通过以下程序来设置脉冲宽度(也就是高电平的时间)

void key_scan(void)
{  if(s4==0){delay_ms(10);if(s4==0){set_flag+=10;        //通过按键设置脉宽时间,每按一次脉宽时间增大,周期不变,输出电压高,LED变亮if(set_flag>100)    //周期为5ms(我们自行设计分为100份),占空比不能超过100set_flag=0;while(s4==0){led_pwm();}} }
}

3、通过步骤2设置的脉冲时间,进而算出占空比,占空比实现的程序如下

void led_pwm(void)
{if(flag<=set_flag)    //set_flag为脉冲宽度(高电平时间)led_stat=0x00;elseled_stat=0xff;slect_138_573(4,led_stat);
}

通过以上步骤既可以实现pwm控制呼吸灯,完整代码如下:

#include "stc15f2k60s2.h"
#include "intrins.h"unsigned char flag=0,set_flag=0,led_stat=0xff;//***********独立按键****************
sbit s7 = P3^0;
sbit s6 = P3^1;
sbit s5 = P3^2;
sbit s4 = P3^3;
//***********************************void Delay1ms()        //@12.000MHz
{unsigned char i, j;i = 12;j = 169;do{while (--j);} while (--i);
}void delay_ms(int x)
{while(x--){Delay1ms();}
}/* 选择通道并且输入数据 */
void slect_138_573(unsigned char channel, unsigned char dat)
{P0 = 0x00;P0 = dat;                                      /* 这里用P0而不用其他端口是因为我们操作LED、数码管、继电器、蜂鸣器都是对P0进行操作 */switch(channel)                            /* 选择通道 */{case 4:                                      /* 使Y4输出低电平0,也就是操作LED */P2 = (P2 & 0x1f) | 0x80;/* (P2 & 0x1f)就是将前3位清0,再操作前3位。将0x80转为2进制1000 0000,这里只看前3位100就是Y4 */break;case 5:                                        /* 使Y5输出低电平0,也就是操作继电器和蜂鸣器 */P2 = (P2 & 0x1f) | 0xa0;break;case 6:                                       /* 使Y6输出低电平0,也就是操作8个数码管 */P2 = (P2 & 0x1f) | 0xc0;break;case 7:                                     /* 使Y7输出低电平0,也就是操作8个数码管中的1个数码管显示值 */P2 = (P2 & 0x1f) | 0xe0;break;case 0:                                       /* 关闭所有通道 */P2 = (P2 & 0x1f) | 0x00;break;}P2 = (P2 & 0x1f) | 0x00;       /* 使用后,关闭所有通道 */}void led_pwm(void)
{if(flag<=set_flag)led_stat=0x00;elseled_stat=0xff;slect_138_573(4,led_stat);
}void key_scan(void)
{  if(s4==0){delay_ms(10);if(s4==0){set_flag+=10;if(set_flag>100)set_flag=0;while(s4==0){led_pwm();}} }
}void Timer0Init(void)      //50微秒@12.000MHz
{AUXR &= 0x7F;     //定时器时钟12T模式TMOD &= 0xF0;      //设置定时器模式TL0 = 0xCE;       //设置定时初值TH0 = 0xFF;        //设置定时初值TF0 = 0;       //清除TF0标志TR0 = 1;      //定时器0开始计时EA=1;ET0=1;
}//每50us进入一次中断,flag++,当flag=100时,就相当于过了5ms
//也就是相当于我们这里设置了一个pwm周期为5ms,频率为200Hz(f = 1/T)
void Timer0Service(void)  interrupt 1
{flag++;                              if(flag==100)flag=0;
}void System_init(void)
{slect_138_573(4,0xff);slect_138_573(5,0x00);Timer0Init();
}void main(void)
{System_init();while(1){key_scan();led_pwm();}
}

 总结:LED灯的亮度就是通过调节占空比来实现,通过调节占空比调节输出电压,进而调节LED灯的亮度。

蓝桥杯单片机比赛学习:8、PWM的基本原理之呼吸灯相关推荐

  1. 蓝桥杯单片机比赛学习:9、PCF8591的基本原理和使用方法

    前面一节我们说了PWM呼吸灯的基本原理和使用方法,下面我们来看第二个模块,也是蓝桥杯单片机比赛中常考的一个模块--PCF8591.我主页有其他模块的使用方法和基本原理(2条消息) Do My Best ...

  2. 蓝桥杯单片机比赛学习:11、频率测量的基本原理

    在蓝桥杯单片机比赛中,频率测量一次都没考过,但是也不排除不考的可能.频率测量相对前面的几个模块来说相对简单,只需要两个定时器就可以实现. 频率测量的基本原理 产生脉冲的主要元件是555定时器.555定 ...

  3. 蓝桥杯单片机比赛学习:6、中断系统之定时器中断的基本原理

    上节我们讲了中断的外部中断,基本的了解了一下中断,这一节我们继续来学习中断系统的定时器中断基本原理,本节很重要无论是在比赛中还是在单片机.嵌入式等的学习上都有着很重要的地位.如对本作者有兴趣可以去我主 ...

  4. 蓝桥杯单片机比赛学习:5、中断系统之外部中断的基本原理

    中断的基本概念 百度百科上是这样说的,当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作 ...

  5. 蓝桥杯单片机比赛学习:7、中断系统之串口中断的基本原理

    这一节我们讲一下蓝桥杯单片机比赛中断中的最后一个模块--串口.中断的其他模块在我的个人主页(4条消息) Do My Best的博客_CSDN博客-蓝桥杯单片机比赛学习领域博主有兴趣的可以去学习. 通信 ...

  6. 蓝桥杯单片机比赛学习:1、led点亮原理

    此教程是鄙人蓝桥杯单片机的学习过程总结,可能会有错误,请指出批评.蓝桥杯单片机学习最重要的是将整个单片机模块化,比如,我们可以将它分为LED.蜂鸣器.继电器.数码管.按键.AD/DA.555定时器.光 ...

  7. 蓝桥杯单片机比赛学习:3、独立按键与矩阵按键的基本原理

    独立按键 首先我们看一下按键的原理图,如图1,当J5中的2,3接在一起的时候,红线标注就是一个完整的电路图,此时只有s4.s5.s6.s7按键可以使用,也就是独立按键.例如:当我们按下s4时,电路导通 ...

  8. 蓝桥杯单片机国赛客观题_蓝桥杯单片机比赛历年试题获取

    蓝桥杯单片机比赛历年试题获取!!! 准备蓝桥杯蓝桥杯比赛除了对板子各个模块的熟悉外,还有一件事,那就是把它们综合起来运用.当你单独使用板子上的某一个模块时,可能不会有什么问题,甚至对已经反复练习过后的 ...

  9. [蓝桥杯单片机]模块学习—中断系统

    前一段时间的文章已经跟各位一起刷了一部分的客观题了 接下来将会跟大家一起从官方提供的原理图和芯片手册出发 练习每个模块的程序编写 因为我学习采用的是模块化编程的思路,函数的定义分散在不同的文件中,所以 ...

最新文章

  1. Git环境搭建及简单的本地、远程 两库关联
  2. apt_Word模板注入攻击
  3. 关于meta的一些知识
  4. html如何设置多个模块,在webpack中如何实现多页面开发
  5. win10启动修复_win10下以安全模式启动电脑全攻略,装机、修复电脑故障必备
  6. Android系统编译so库提示error undefined reference to '__android_log_print问题的解决
  7. 软件测试oracle问题,数据库基础:Oracle数据库中时间问题比较
  8. Maven-学习笔记02【基础-Maven的安装和仓库种类】
  9. IOS仿微信朋友圈的日期处理
  10. 第十八期:网页禁止复制粘贴怎么办?教你六招轻松搞定
  11. Teradata在中国银行业的应用简介
  12. 机器学习监督学习之分类算法---朴素贝叶斯代码实践
  13. JavaScript ECMAScript版本介绍
  14. vyos使用flask
  15. 关于Linux性能调优中系统CPU监测信息统计的一些笔记
  16. 手写平衡二叉树(二)
  17. Worldpress常规利用思路
  18. CS224W-图神经网络 笔记5.3:Spectral Clustering - 谱图聚类的具体操作步骤
  19. mysql医学数据库_现代医学模式的特点是(  )
  20. 是的,各位久等的 Windows 神器已上架

热门文章

  1. 科研踩坑:角度制三角函数求导要乘上π/180
  2. Elasticsearch 6.4 索引时执行脚本报错
  3. linux 强制卸载nfs,linux nfs 卸载
  4. 4.4 like通配符关键字过滤查询数据
  5. 杜克大学电子与计算机工程系,杜克大学电子与计算机工程系
  6. 5.25 FLASH
  7. 解决deepin更换输入法之后系统报错、出现bug的问题
  8. 电子取证技术的三大方向
  9. Intel万兆网卡,intel万兆双口网卡X540T2 性能解剖
  10. 批处理获取系统安装时间/系统开机时间/电脑唤醒时间及开机使用时间(二)完成