【蓝桥杯—单片机】PWM脉宽调制信号的发生与控制| 备赛 | 笔记

前言

学习资料参考

课程资料
【【小蜜蜂笔记】蓝桥杯大赛-单片机设计与开发基础技能与进阶强化教程】https://www.bilibili.com/video/BV1Bt41187hw?p=11&vd_source=e2191f89c557f5ac44bb6c7aa3967c7c

LED基本控制可以参考以下笔记
https://blog.csdn.net/zicheng_G/article/details/142025188?fromshare=blogdetail&sharetype=blogdetail&sharerId=142025188&sharerefer=PC&sharesource=zicheng_G&sharefrom=from_link


独立按键的基本控制可以参考以下笔记
https://blog.csdn.net/zicheng_G/article/details/142354656?fromshare=blogdetail&sharetype=blogdetail&sharerId=142354656&sharerefer=PC&sharesource=zicheng_G&sharefrom=from_link

本节训练重点

  1. 利用PWM控制灯光亮度:PWM脉宽信号的频率为100Hz,系统上电后L1指示灯处在熄灭状态,按下S7按键,使L1指示灯在完全熄灭、10%的亮度、50%的亮度和90%的亮度之间切换。

PWM脉宽调制信号的发生与控制

原理

PWM的基本原理是通过改变信号的脉冲宽度来实现对信号的控制。它由一个固定频率的周期性方波和一个可调节的占空比组成。

关于PWM详细的介绍可以看下面的资料
https://blog.csdn.net/as480133937/article/details/103439546?fromshare=blogdetail&sharetype=blogdetail&sharerId=103439546&sharerefer=PC&sharesource=zicheng_G&sharefrom=from_link

  • 51单片机用定时器实现脉宽调制

编程思路

/*头文件声明区域*/
#include <REGX52.H>

/*变量声明区域*/
sbit S7 = P3^0;//定义独立按键S7
sbit L1 = P0^0;//定义L1指示灯
sbit HC138_A0_A = P2^5;//用于三八译码器三个口的输入
sbit HC138_A1_B = P2^6;
sbit HC138_A2_C = P2^7;

unsigned char count;//记录中断次数
unsigned char PWM_Duty;//记录占空比对应的时间
unsigned char status;//标记状态

/*三八译码器选中指示灯相关的锁存器*/
void HC138_L1()
{
  HC138_A0_A=0;
	HC138_A1_B=0;
	HC138_A2_C=1;
}

/*延时函数*/
void Delay(unsigned char t)
{
	while(t--);
}

//==========S7按键扫描函数=========
void Key_Scan()
{
	if(S7==0)//判断S7是否按下
	{
		Delay(100);
		switch(status)
		{
			/*上一个状态为完全熄灭,按下按键后,状态切换至10%的亮度*/
			case 0:
			{
				L1=1;
				TR0=1;//打开计时器计时功能
				PWM_Duty=10;//占空比为10%
				status=1;
			}
			break;
			
			/*上一个状态10%的亮度,按下按键后,状态切换至50%的亮度*/
			case 1:
			{
				PWM_Duty=50;//占空比为50%
				status=2;
			}
			break;
			
			/*上一个状态50%的亮度,按下按键后,状态切换至90%的亮度*/
			case 2:
			{
				PWM_Duty=90;//占空比为90%
				status=3;
			}
			break;
			
			/*上一个状态90%的亮度,按下按键后,状态切换至完全熄灭*/
			case 3:
			{
				L1=1;
				TR0=0;//关闭计时器计时功能
				status=0;
			}
			break;
		}		
		while(S7==0);//判断S7是否松开,避免多次扫描
	}
}
//==================================

//============定时器============
void Timer0Init(void)		//100微秒@12.000MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	
	TL0 = 0x9C;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
	
	ET0=1;
	EA=1;
}

void ServerTimer0() interrupt 1
{
	/*设置定时初值*/
	TL0 = 0x9C;		
	TH0 = 0xFF;		
	
	count++;//每中断一加一
	
	/*当时间未达到占空比对应位置时,PWM低电平状态*/
	if(count < PWM_Duty) 
	{
		L1 = 0;
	}
	
	/*当时间超过占空比对应位置且未达到一个周期时,PWM高电平状态*/
	else if(count < 100) 
	{
		L1 = 1;
	}
	
	/*当时间达到一个周期时,重新开始计时*/
	else if(count == 100) 
	{
		L1 = 0;
		count=0;
	}
}
//==============================

/*主函数*/
void main()
{
	HC138_L1();
	L1=1;//初始状态下,指示灯完全熄灭
	Timer0Init();
	while(1)
	{
		Key_Scan();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值