如何用51单片机实现pwm调光+呼吸灯(超详细+源码)

这篇具有很好参考价值的文章主要介绍了如何用51单片机实现pwm调光+呼吸灯(超详细+源码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如何用51单片机实现pwm调光+呼吸灯(超详细+源码),51单片机,单片机,嵌入式硬件,c语言

洗剪吹一条龙服务(PWM信号产生电路设计)

🛴综合设计背景及意义

在工控行业,PWM信号可以用来调节电机转速、调节变频器以及BLDC电机驱动等;在LED照明行业,可以通过PWM来控制LED灯的亮暗变化;还可以通过PWM信号来控制无源蜂鸣器发出简单的声音以及实现功率继电器的线圈节能等。

🚗设计要求

PWM(Pulse Width Modulation,脉冲宽度调制)为脉冲周期固定、占空比可调的信号如图所示。
如何用51单片机实现pwm调光+呼吸灯(超详细+源码),51单片机,单片机,嵌入式硬件,c语言

设计并制作PWM信号产生电路,具体要求如下:

1.PWM信号的频率为2kHz;
2.PWM信号的占空比在0~100%之间可调,分辨率不大于1%;
3.用PWM信号驱动发光二极管,能够观察到PWM信号占空比的变化。
★发挥部分:在完成基本功能的基础上,实现上呼吸灯功能。

🚓 pwm原理简述,以及工具软件

🍉 pwm工作原理

PWM是利用微处理器的数字输出来对模拟电路进行控制,控制方式就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。

🍌 pwm的周期T(单位秒)

信号从高电平到低电平再回到高电平所需要的时间称之为周期。

🍯 pwm的频率f(单位赫兹)

一秒内有多少这样的周期就是pwm的频率。
  f=1/T;

🍩占空比

占空比是一个脉冲周期内高电平保持的时间与该pwm时钟周期的比值(高电平所占的时间比例)
  举个🍎
  如何用51单片机实现pwm调光+呼吸灯(超详细+源码),51单片机,单片机,嵌入式硬件,c语言
第一个周期内占空比为80%,第二个周期内占空比为40%。
如何用51单片机实现pwm调光+呼吸灯(超详细+源码),51单片机,单片机,嵌入式硬件,c语言
对于占空比为80%,平均电压就是4v,总的来说就是占空比越大平均电压就越大。

🍤工具软件

proteus:仿真工具
如何用51单片机实现pwm调光+呼吸灯(超详细+源码),51单片机,单片机,嵌入式硬件,c语言

keil5:给芯片编写代码
如何用51单片机实现pwm调光+呼吸灯(超详细+源码),51单片机,单片机,嵌入式硬件,c语言

stc_isp:给硬件电路烧录软件
如何用51单片机实现pwm调光+呼吸灯(超详细+源码),51单片机,单片机,嵌入式硬件,c语言

EDA:pcb画板软件
如何用51单片机实现pwm调光+呼吸灯(超详细+源码),51单片机,单片机,嵌入式硬件,c语言

🚜设计过程(原理图讲解,代码讲解)

如何用51单片机实现pwm调光+呼吸灯(超详细+源码),51单片机,单片机,嵌入式硬件,c语言

皇上儿,燕国使者原理图奉上☝
报菜名:(51的芯片+晶振+电容+按键+74hc573+74hc138+74hc02+拨码开关+发光二极管+示波器)

51最小系统

晶振电路

如何用51单片机实现pwm调光+呼吸灯(超详细+源码),51单片机,单片机,嵌入式硬件,c语言
晶振电路的作用是为电路提供基本的时钟信号,使其工作在稳定的频率范围内,从而保持各个部分之间的同步。驱动数字电路运转是时钟信号,时序电路都需要一个外部时钟信号来驱动,完成记时和计数

复位电路

如何用51单片机实现pwm调光+呼吸灯(超详细+源码),51单片机,单片机,嵌入式硬件,c语言
防止程序跑飞,接上复位电路按下按键,程序从头开始跑,当单片机一上电,C3击穿相当于导线,直接将vcc接入rst置为1,发生复位,当按键S1按下将电容短路,rst置一复位

单片机

如何用51单片机实现pwm调光+呼吸灯(超详细+源码),51单片机,单片机,嵌入式硬件,c语言

1~8:P1对应的IO口(可编程输入输出口)
9:RST复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。
10~17:P3对应的IO口。
18:XTAL2晶振输出端。
19:XTAL1晶振输入端。
20:GND电源地。
21~28:P2对应的IO口。
29:PSEN外部存储器读选通信号引脚。
30:ALE/PROG地址锁存允许信号引脚。
31:EA/VPP程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。
32~39:P0对应的IO口。
40:VCC电源。

选通模块

如何用51单片机实现pwm调光+呼吸灯(超详细+源码),51单片机,单片机,嵌入式硬件,c语言
74hc138让使能端有效,使得74hc138正常工作,A,B,C分别接25,26,27引脚,通过芯片给p2口的高三位赋值选择不同的通道,这里我们不用数码管显示,只看灯的情况,所以将P2口的高三位置100,选择4通道,74hc138输出低有效,选四通道,其余全是1,Y4=0,由于SW1拨码开关接地,74hc02单输入非门,输出则是1.

锁存模块,显示模块

如何用51单片机实现pwm调光+呼吸灯(超详细+源码),51单片机,单片机,嵌入式硬件,c语言
74hc573锁存器,由Y4c通道送来个高电平,使其使能端有效,74hc573正常工作,有没有人有这样的疑惑?????为什么74hc138译码器输出有不同的通道,每个138输出端口连接这每个573的LE使能端,总结一下就是P2高3位决定138输出选择哪个端口为低有效,然后通过非门将数据置1对应的573锁存器有效,将P0口的数据输出,这里的P0口复用解决了io口不够用的问题。你想想如果数码管位选段,数码管片选段,二极管,用不同的io口的话,单片机那几个引脚完全不够用的。
二极管D1接的P0最低位如果P0^0=0,二极管导通放光,对应的示波器A为低电平,
二极管D2接的P0次低位如果P0^1=0,二极管导通放光,对应的示波器B为低电平.

按键控制模块

如何用51单片机实现pwm调光+呼吸灯(超详细+源码),51单片机,单片机,嵌入式硬件,c语言

当对应的按键按下,单片机对应的io口电平就会被拉低。

代码模块

#include <REGX52.H>
sbit S7=P3^0;
sbit L1=P0^0;
sbit S4=P3^3;
sbit L2=P0^1;
unsigned char PWMcnt1=0;//进入中断3的次数
unsigned char PWMduty1=0;//D2的占空比
unsigned char PWMuad=0;//变亮模式还是变暗模式
unsigned char S4no=0;//S4按下的次数,S4没有按下,不会进入呼吸部分
unsigned char keypressed=0;//S4按下置1,S4松开置0

unsigned char times=0;
unsigned char stat=0;//按下S7一次改变对应的状态(不同的状态占空比不同)
unsigned char PWMduty;//D1的占空比

void Delay(unsigned int t)//延迟去抖动
{while(t--);}
void Selecthc138(unsigned char channel)
{switch(channel)
	{case 4:P2=(P2&0x1f)|0x80;break;//P2高三位置100
	}}
void show()//按键控制函数
{if(S7==0)//S7按一次占空比改变10%
	   {Delay(20);
			 if(S7==0)
			  { if(stat==0)
			   {stat=1;PWMduty=1;TR0=1;L1=0;}//第一次按下S7的时候开始计时器0开始计时L1=0就是L1灯亮的时候,对应的就是高电平,占空比的时候
			   else if(stat==1)//每次按下的时候stat就会改变成下一种状态再次按下的时候就是对应的改变后的状态
			  {stat=2;PWMduty=2;}
			   else if(stat==2)
			  {stat=3;PWMduty=3;}
			   else if(stat==3)
			  {stat=4;PWMduty=4;}
			  else if(stat==4)
			  {stat=5;PWMduty=5;}
		    else if(stat==5)
			  {stat=6;PWMduty=6;}
				else if(stat==6)
			  {stat=7;PWMduty=7;}
					else if(stat==7)
			  {stat=8;PWMduty=8;}
					else if(stat==8)
			  {stat=9;PWMduty=9;}
				else if(stat==9)
			  {stat=0;PWMduty=0;TR0=0;L1=1;}}//关灯,定时器0停止计时
		 }while(S7==0);
if(S4==0)//呼吸灯按键
	   {Delay(20);//软件去抖动if(S4==0)
						   {while(S4==0) keypressed=1;
		            S4no++;
		            keypressed=0;
		            if(S4no>2)
									{S4no=1;}}}
}


void Inittime()//中断初始化函数
{ TMOD=0x11;//两个定时器都是定时模式	
	TH0=(65536-50)/256;
	TL0=(65536-50)%256;
	TH1=(65536-1000)/256;
	TL1=(65536-1000)%256;
	ET0=1;//定时器0的使能开关
	ET1=1;//定时器1的使能开关
	EA=1;//使能总开关
	TR1=1;//定时器1开始计时
}

unsigned char PWMcnt=0;//进入中断1的次数
void Servive() interrupt 1// 中断服务函数中断1
{TH0=(65536-50)/256;//高八位
 TL0=(65536-50)%256;//16位不重装模式就要自己重装,低八位
	PWMcnt++;
	if(PWMcnt==PWMduty)
	 {L1=1;}
	else if(PWMcnt==10)
	{L1=0;PWMcnt=0;}
}	
void Servive1() interrupt 3 // 中断服务函数中断3
{	TH1=(65536-1000)/256;
	TL1=(65536-1000)%256;
	if(S4no==0)
	{L2=0;return;}//为什么不会进入呼吸部分,这里如果S4no==0的话,直接return,跳出中断
	PWMcnt1++;
	if(PWMcnt1<PWMduty1)
	   {L2=0;}
	else if(PWMcnt1<=10)
	   {L2=1;}
	else 
	    {PWMcnt1=0;
			 if(keypressed==0)
			   {times++;}}
}
void LEDcol()
{if(times==5)
	   {times=0;
		  if(PWMuad==0)
			  {PWMduty1++;
		     if(PWMduty1>10)
				    {PWMduty1=10;PWMuad=1;}}
		 else if(PWMuad==1)
		        {PWMduty1--;
		         if(PWMduty1==255)
						   {PWMduty1=0;PWMuad=0;
		             
		              }}}
}
void main()
{Inittime();
	
	while(1)//为了使无限演示结果,将函数写在循环里面
	{show();
	LEDcol();
	
}

}

必杀技:说了这么多,说人话就是使用单片机的定时器,在一个周期内控制高电平的时间,就是占空比,灯的亮度越亮就是占空比越大,高电平时间就是对应灯阴极接口为低电平的时间。
2000hz的频率要怎么调呢???
用定时器0,2000hz的频率对应周期就是500us,
如何用51单片机实现pwm调光+呼吸灯(超详细+源码),51单片机,单片机,嵌入式硬件,c语言
呼吸灯是用的定时器1实现的,按下S4,D2发光二极管开始呼吸。
呼吸灯部分代码解释:当S4按下一次,S4no==1;定时器1设置的时间是1ms进入中断一次,

void Servive1() interrupt 3 // 中断服务函数中断3
{	TH1=(65536-1000)/256;
	TL1=(65536-1000)%256;
	if(S4no==0)
	{L2=0;return;}//为什么不会进入呼吸部分,这里如果S4no==0的话,直接return,跳出中断
	PWMcnt1++;
	if(PWMcnt1<PWMduty1)
	   {L2=0;}
	else if(PWMcnt1<=10)
	   {L2=1;}
	else 
	    {PWMcnt1=0;
			 if(keypressed==0)
			   {times++;}}

1ms进入中断pwmcnt1==1,此时pwmduty1还是0

else if(PWMcnt1<=10)
	   {L2=1;}

当进入10次这个的时候,接下来进入中断pwmcnt1==11,执行一次这个

else 
	    {PWMcnt1=0;
			 if(keypressed==0)
			   {times++;}}

pwmcnt1置0,times+1,当进入50次的时候,times==5,进入

void LEDcol()
{if(times==5)
	   {times=0;
		  if(PWMuad==0)
			  {PWMduty1++;
		     if(PWMduty1>10)
				    {PWMduty1=10;PWMuad=1;}}
		 else if(PWMuad==1)
		        {PWMduty1--;
		         if(PWMduty1==255)
						   {PWMduty1=0;PWMuad=0;
		             
		              }}}
}

每50ms,pwmduty1+1,pwmduty1越大占空比就越大,这里是逐渐变亮的过程,每50ms就好像S7按下一次开关一样,500次的时候,接下来进去时PWMuad=1;

 else if(PWMuad==1)
		        {PWMduty1--;
		         if(PWMduty1==255)
						   {PWMduty1=0;PWMuad=0;
		             
		              }}

每50ms,pwmduty1-1,pwmduty1越小占空比就越小,这里是逐渐变暗的过程,接下来进去时PWMuad=0;以此循环实现呼吸灯的效果,这里逐渐变亮需要500ms,逐渐变暗需要500ms.在每50ms的时间内pwmduty1是一样的,所以灯的亮度是一样的,每50ms变亮一点

🚲proteus仿真演示

20230803_191206

如何用51单片机实现pwm调光+呼吸灯(超详细+源码),51单片机,单片机,嵌入式硬件,c语言
点击cursors看他的周期
如何用51单片机实现pwm调光+呼吸灯(超详细+源码),51单片机,单片机,嵌入式硬件,c语言
620us=0.62ms;
f=1/T=1612hz
这里试过100hz的误差不大,接近一百赫兹,但是如果是2000hz,我勒亲娘,误差好大,不知道是哪里有问题。


总结

本学期我们专业,在学习完课本上的知识以后,我们做了课程设计,课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。通过这次电子课程设计,我不仅巩固了在课本上学到的知识,而且还学到了很多课本之外的知识。在这次课程设计中我收获颇丰,无论是在培养自己的实验动手能力还是培养自己的性情方面。我明白了要去做好一个东西最重要的是心态,也许在你拿到题目时会觉得很困难,但是只要你充满信心,认真去思考,一步一个脚印去实现它,你就肯定会完成课程实践的。在实践的过程中,我也遇到了很多困难,发现我自己在学习课本上知识的时候并没有深刻的去理解,掌握的只是很浅显的东西,所以在时遇到很多以前在书本上没有遇到过的实际的问题,只要一个小小的错误,就无法成功的完成实践的要求。
分享到此结束,如果你觉得不错的话,记得点个赞哦!!个人理解,如果有不对的地方,求大佬多多指教,阿里嘎多!!点赞大佬offer拿到手软哈哈文章来源地址https://www.toymoban.com/news/detail-625698.html

到了这里,关于如何用51单片机实现pwm调光+呼吸灯(超详细+源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机之用定时器写呼吸灯(全站解释最细节)

            PWM:一般指脉冲宽度调制。         个人理解:在一个周期内,高电平和低电平持续时间所占总时间的百分比,即占空比,即PWM。         呼吸:一呼一吸即为呼吸。         要实现呼吸的效果,就要在呼气和吸气的这俩个小周期内实现pwm的动态变化,从视觉上看

    2023年04月13日
    浏览(44)
  • 【51单片机学习】PWM电机调速

    中断允许寄存器,详情可以看STC51单片机芯片手册第160页 TMOD、TCON详情可以看STC51单片机芯片手册第187页 51单片机中的定时器有三个,(C52比C51多了一个定时器3,但这些都统称为51单片机) 本次以 Timer0 为例进行介绍 定时器的作用: 1:用于计时系统,可实现软件计时,或者使程

    2023年04月18日
    浏览(83)
  • 51单片机PWM(定时器)

    目录 前言 一、PWM的介绍 二、在定时器中配置PWM 三、代码  总结         PWM普遍应用于惯性系统,我们知道单片机几乎只能输出“1”和“0”两种状态,即开和关,想要输出模拟量是不太容易实现的,那么怎样才能使单片机输出平滑的线性信号呢?没接触过PWM的小伙伴可能第

    2024年02月09日
    浏览(56)
  • 基于51单片机的舵机控制(PWM)

    舵机是一种位置伺服的驱动器,常被用于遥控汽车、机器人等领域,结构主要包括小型直流电机、变速齿轮组、可调电位器和控制电路板四个部分,如下图,舵机的外部一般接有三根线,分别是黑(接地线)、红(电源线)、棕(白或者黄,信号线)三种颜色进行区分。 2.

    2024年02月16日
    浏览(43)
  • 【51单片机】直流电机驱动(PWM)(江科大)

    · 直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极,当电极正接时,电机正转,当电极反接时,电机反转 · 直流电机主要由永磁体(定子)、线圈(转子)和换向器组成 · 除直流电机外,常见的电机还有步进电机、舵机、无刷电机、空心杯电机等 电机的驱动无法

    2024年02月20日
    浏览(50)
  • 【Proteus仿真】【51单片机】PWM电机调速系统设计

    本项目使用Proteus8仿真51单片机控制器,使用L298N电机模块、数码管模块、按键模块、LED指示灯模块等。 系统运行后,数码管显示电机当前运行档位和速度。 可通过按键K4启动与停止,按键K1加速、按键K2减速,按键K3换向; 档位可在1-5挡。 最终可实现: 按键功能:具有加速、

    2023年04月17日
    浏览(52)
  • 【51单片机】直流电机的驱动和PWM调速

    51单片机驱动直流电机与 PWM 调速是通过使用 51 单片机来控制直流电机的转速和方向。51 单片机通过控制电机的电流来实现驱动,并通过生成 PWM 信号来调节电机的转速。使用 PWM 调速可以使得直流电机的转速精确可控,并且减少了电机的功率损耗。在 51 单片机的控制系统中,

    2023年04月09日
    浏览(42)
  • 基于51单片机直流电机PWM调速液晶1602显示设计

    一、系统方案 本文主要研究了利用MCS-51系列单片机控制PWM信号从而实现对直流电机转速进行控制的方法。本文中采用了三极管组成了PWM信号的驱动系统,并且对PWM信号的原理、产生方法以及如何通过软件编程对PWM信号占空比进行调节,从而控制其输入信号波形等均作了详细的

    2024年02月11日
    浏览(50)
  • 51单片机-PWM调速(直流电机,智能小车的电机调速)

    这次来对PWM做一个总结 最近学习时,发现PWM控制在很多地方都会用到,比如使用PWM来控制电机的速度,使用PWM来生成想要的波形。 那么到底什么是PWM呢? PWM即 脉冲宽度调制 ,在具有惯性的系统中,可以通过对 一系列脉冲的宽度进行调制 ,来等效的获得所需要的模拟参量。

    2024年02月02日
    浏览(52)
  • [51单片机]什么是按键抖动,如何用程序防抖

    在进行硬件设计时,添加到PCB板中的机械开关触点断开、闭合时,由于机械触点的弹性作用,按键开关在闭合或松开时并不会马上稳定地接通或断开。因而在闭合或断开的瞬间均伴随有一连串的抖动,这样的抖动叫按键抖动。 一般采取在程序中加入延时函数的方法来消抖,程

    2024年02月13日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包