蓝桥杯单片机学习记录(8)(PWM脉宽调制)

PWM脉宽调制

PWM(Pluse Width Modulation)简称脉宽调制,是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。广泛应用在从测量、通信到功率控制与变换的许多领域中。

PWM频率:指在1s钟内,信号从高电平到低电平再回到高电平的次数,单位Hz

PWM周期:T = 1/f

占空比:指一个脉冲周期内,高电平的时间与整个周期时间的比例,单位%

例如可以通过改变占空比来实现对灯光强度的控制。

代码(通过按键改变LED灯的亮度)

key.c

#include <sys.h>

uchar stat = 0;

void KeyScans()
{
	if(s4 == 0)
	{
		Delay(10);
		if(s4 == 0)
		{
			switch(stat)
			{
				case 0: Work_Led(0x00); TR0 = 1; pwm_duty = 10; stat = 1; break;
				case 1: pwm_duty = 20; stat = 2; break;
				case 2: pwm_duty = 30; stat = 3; break;
				case 3: pwm_duty = 40; stat = 4; break;
				case 4: pwm_duty = 50; stat = 5; break;
				case 5: pwm_duty = 60; stat = 6; break;
				case 6: pwm_duty = 70; stat = 7; break;
				case 7: pwm_duty = 80; stat = 8; break;
				case 8: pwm_duty = 90; stat = 9; break;
				case 9: pwm_duty = 100; stat = 10; break;
				case 10: Work_Led(0xff); TR0 = 0; stat = 0; break;
			}
		}
		while(s4 == 0);
	}
}

 main.c

//PWM脉宽信号的频率为100HZ
#include <sys.h>

void InitTimer0();
uchar count = 0,pwm_duty;//占空比

void main()
{
	Init_System();
	InitTimer0();
	Work_Led(0xff);
	while(1)
	{
		KeyScans();
	}
}

void InitTimer0()
{
	TMOD = 0X01;
	TH0 = (65535 - 100) / 256;
	TL0 = (65535 - 100) % 256;
	
	ET0 = 1;
	EA = 1;
}

void ServiceTimer0() interrupt 1
{
	TH0 = (65535 - 100) / 256;
	TL0 = (65535 - 100) % 256;
	count++;
	if(count <= pwm_duty)
	{
		Work_Led(0x00);
	}
	if(count < 100 && count > pwm_duty)
	{
		Work_Led(0xff);
	}
	if(count == 100)
	{
		Work_Led(0x00);
		count = 0;
	}
}

sys.c

#include <sys.h>

void Select_74HC138(uchar channel)
{
	switch(channel)
	{
		case 0: P2 = P2 | 0X1F; break;
		case 4: P2 = (P2 | 0X1F) & 0X80; break;
		case 5: P2 = (P2 | 0X1F) & 0XA0; break;
		case 6: P2 = (P2 | 0X1F) & 0XC0; break;
		case 7: P2 = (P2 | 0X1F) & 0XE0; break;
	}
}

void Init_System()
{
	Select_74HC138(4);
	P0 = 0XFF;
	Select_74HC138(5);
	P0 = 0X00;
	Select_74HC138(6);
	P0 = 0XFF;
	Select_74HC138(0);
}

void Delay(uint ms)
{
	uint i;
	for(ms; ms > 0; ms--)
		for(i = 921; i > 0; i--);
}

void Work_Led(uchar dat)
{
	Select_74HC138(4);
	P0 = dat;
	Select_74HC138(0);
}

sys.h

#ifndef _SYS_H_
#define _SYS_H_

#include <STC15F2K60S2.H>
#include <intrins.h>

sbit s4 = P3^3;

#define uchar unsigned char
#define uint unsigned int
	
extern unsigned char pwm_duty;
	
//sys.c
void Select_74HC138(unsigned char channel);
void Init_System();
void Delay(unsigned int ms);
void Work_Led(unsigned char dat);

//key.c
void KeyScans();

#endif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wu小燕呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值