内容来自b站小蜜蜂老师
一、什么是脉宽调制
PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%高低电平在一个周期内各占一半
二、pwm实际运用 led调光
#include "reg52.h" unsigned int count = 0; //计数 unsigned char pwm_duty = 0; //记录占空比 unsigned char status = 0; //状态记录 sbit S7 = P3^0; //按键 sbit L1 = P0^1; //led //------------------------------简单延时函数------------------------- void Delay(unsigned int t) { while(t--); } //-------------------------------------------------------------------- //--------------------------74HC138初始化--------------------------- void Init_74HC138(unsigned char n) { switch(n) { case 4: P2 = P2 | 0x1f; P2 = 0x80; break; case 5: P2 = P2 | 0x1f; P2 = 0xa0; break; case 6: P2 = P2 | 0x1f; P2 = 0xc0; break; case 7: P2 = P2 | 0x1f; P2 = 0xe0; break; } } //-------------------------------------------------------------------- //-----------------------------系统初始化----------------------------- void InitSystem(void) { Init_74HC138(5); //Y5选通 P0 = 0x00; //关闭继电器和蜂鸣器 Init_74HC138(4); //Y4 P0 = 0xff; //关闭LED } //---------------------------------------------------------------------- //-------------------------------定时器0初始化------------------------- void Init_Timer0(void) { TMOD = 0x01; //定时0 方式二16位 //100us TH0 = (65535-100)/256; //高八位 TL0 = (65535-100)%256; //低八位 ET0 = 1; //定时器0中断使能 EA = 1; //总中断 } //---------------------------------------------------------------------- //--------------------------------按键处理函数---------------------------- void Key_Tackle(void) { if(S7 == 0) { Delay(50); if(S7 == 0) { switch(status) { case 0: L1 = 0; TR0 = 1; pwm_duty = 10;status = 1;break; case 1: pwm_duty = 50;status = 2;break; case 2: pwm_duty = 90;status = 3;break; case 3: L1 = 1; TR0= 0;status = 0;break; } while(S7 == 0); } } } void main(void) { InitSystem(); Init_Timer0(); Init_74HC138(4); while(1) { Key_Tackle(); } } //--------------------------定时器0中断服务函数------------------------- void Server_Timer0() interrupt 1 { //该方式没有自动重装载 需要手动重新配置 TH0 = (65535-100)/256; //高八位 TL0 = (65535-100)%256; //低八位 count++; if(count == pwm_duty) { L1 = 1; } else if(count == 100) { L1 = 0; count = 0; } } //---------------------------------------------------------------------
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)