蓝桥杯单片机之模块代码《PWM控制灯亮度》

过往历程

历程1:秒表

历程2:按键显示时钟

历程3:列矩阵按键显示时钟

历程4:行矩阵按键显示时钟

历程5:新DS1302

历程6:小数点精确后两位ds18b20

历程7:35定时器测量频率

历程8:AT24C02

历程9:AT24C02秒表

历程10:AD

历程11:超声波

历程12:多样点灯方式

历程13:AT24C02页写入

历程14:DA

历程15:串口发数据

历程16:逐个点亮LED

历程17:花样霓虹灯



前期准备

1:本文使用的头文件是由stc生成
在这里插入图片描述
点击保存文件之后,保存至自己文件目录下方即可
在这里插入图片描述
2:本文使用的都是官方提供的底层驱动代码
在这里插入图片描述

简单了解

  单片机的PWM代表脉冲宽度调制(Pulse Width Modulation)。它是一种用于控制模拟信号的数字技术。通过调节脉冲的宽度,可以控制输出信号的平均功率。在单片机中,PWM通常用于控制电机的转速、LED的亮度以及其他需要调节电压、功率或信号的应用中。通过改变脉冲的宽度和周期,可以调节输出信号的平均电压或电流,从而实现对被控制设备的精确控

原理介绍

   PWM(Pulse Width Modulation,脉宽调制)是一种通过改变信号的脉冲宽度来控制电平的技术。它通过调整脉冲信号的占空比(高电平时间与周期的比例)来实现对电压或电流的精确控制。

PWM的原理可以简单描述为以下几个步骤:

  • 选择一个固定的周期:PWM信号由一系列周期性的脉冲组成,其中周期是固定的,表示脉冲信号的重复时间。

  • 设置一个目标值:根据需要控制的设备或系统,设置一个目标值,例如期望的电压或电流。

  • 比较目标值和当前值:将目标值与一个计数器进行比较,该计数器在每个周期内递增。如果目标值大于计数器的当前值,则输出高电平;如果目标值小于计数器的当前值,则输出低电平。

  • 调整占空比:通过调整目标值与计数器的比较关系,可以改变脉冲信号的占空比。占空比越大,高电平时间越长,输出电平的平均值也就越高;占空比越小,高电平时间越短,输出电平的平均值也就越低。

  • 输出PWM信号:根据比较结果,生成相应的脉冲信号。通常,高电平表示逻辑1或高电平电压,低电平表示逻辑0或低电平电压。

简单应用

   PWM(Pulse Width Modulation)即脉冲宽度调制,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量。

   何为脉冲宽度调制?比如说,我们线输出1ms的高电平,再输出1ms的低电平以此快速进行输出,那么这段电信号并没有以全程高电平的状态输出,也没有以全程低电平的状态输出,而是以稳定的中间电平状态输出。再比方说周期的时间是10ms,脉宽时间是8ms 那么低电平时间就是2ms 总的占空比 8/(8+2)= 80%,就会以80%总电流的强度输出。根据这个就可以控制电机的速度或LED灯的亮度。
在这里插入图片描述

   值得一提的是,这种调制方法只适用于惯性系统,例如电机的转动,当从高电平跳变到低电平时,电机不会马上停止转动,而是靠着惯性继续旋转,LED灯则是根据人眼的视觉暂留效果,当它熄灭的一瞬间会留有余晖,连当频率很快的时候,LED灯的亮暗过度就会看上去很自然。

本期代码

#include<reg52.h>
sbit k7=P3^0;
int a=0,i=0;

void aa(int x)
{
	while(x--);
}

void fmq()
{
	P2=((P2^0x1f)|0xa0);
	P0=0x00;
	P2&=0x1f;
	
		P2=((P2^0x1f)|0x80);
	        P0=0xff;
	        P2&=0x1f;
}

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

void din1() interrupt 1
{
	TH0=(65536-100)/256;
	TL0=(65536-100)%256;
	a++;
	if(a==i)
	{
	P2=((P2^0x1f)|0x80);
	P0=0xff;
	P2&=0x1f;
	}
	else if(a==100)
	{
	a=0;	
	P2=((P2^0x1f)|0x80);
	P0=0x00;
	P2&=0x1f;
	}
}
int x=0;
void anjian()
{
	
	if(k7==0)
	{
		aa(1000);
		if(k7==0)
		{
			switch(x)
			{
				case 0:
			   	P2=((P2^0x1f)|0x80);
	        P0=0x00;
	        P2&=0x1f;
				
				  TR0=1;
				i=10;
				x=1;
				break;
				
				case 1:
				i=50;
				x=2;
				break;	
				
				case 2:
				i=90;
				x=3;
				break;
				
				case 3:
						P2=((P2^0x1f)|0x80);
	        P0=0xff;
	        P2&=0x1f;
				
						TR0=0;
				x=0;
			}
			while(k7==0);
			while(k7==0);
		}
	}
}	

void main()
{
	fmq();
	din();
	while(1)
	{	
		anjian();
	}
}
		

省赛代码传送门

第三届蓝桥杯单片机省赛
第四届蓝桥杯单片机省赛
第五届蓝桥杯单片机省赛
第六届蓝桥杯单片机省赛
第七届蓝桥杯单片机省赛
第八届蓝桥杯单片机省赛
第九届蓝桥杯单片机省赛
第十届蓝桥杯单片机省赛
第十一届蓝桥杯单片机省赛

  • 34
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值