`

51单片机学习笔记:定时器产生PWM可调方波,控制led灯亮度

PWM 
阅读更多

使用定时器T0产生PWM方波,

用按键调整占空比,20级可调

控制led灯的亮度等级.

 

#include  "my51.h"
#include  "timer0.h"

#define grading    20 	   	   //亮度20级变化
sbit keyS3=P3^5; 			   //按键调整占空比,PWM_keyChange++
sbit keyS4=P3^6; 			   //				PWM_keyChange--

u8 PWM_keyChange=10;	  	   //初值,按键调整在1~20之间变化
							   //占空比   PWM_keyChange/grading

void T0_work()				   //本函数由T0定时器中断函数调用
{	
	if(timeMultiple1Flag)
	{		
		led=off(7);			   //关闭7号灯
		timeMultiple1Flag=0;   //清定时器复用置位标志
	}
	
	if(timeMultiple2Flag)
	{		
		led=on(7);			   //打开7号灯
		timeMultiple2Flag=0;   //清定时器复用置位标志
	}  		
}

void main()				    	//测试
{
	u8 keyFlag=1;				//程序中没有消抖处理,只是简易的按键进出自锁标志
	led0=ledon;					//先打开0号灯,用于和7号灯对比亮度		
	initT0(1,10,grading);		//1毫秒的基本定时,亮的时间1*10毫秒,暗1*(grading-10)毫秒
	while(1)
	{
		if(0==keyS3)
		{
			if(keyFlag)			   			  //防止一次按键中多次执行
			{
				keyFlag=0;		   			  //清标志,类似同步锁
				if(++PWM_keyChange>grading)
				{
					PWM_keyChange=grading;	  //占空比最大100%
				}
				initT0(1,PWM_keyChange,grading);	
			}			
		}
		else if(0==keyS4)
		{
			if(keyFlag)
			{
				keyFlag=0;
				if(0==--PWM_keyChange)				//占空比减小
				{
					PWM_keyChange=1;  				//最小占空比 1/20
				}	
				initT0(1,PWM_keyChange,grading);	//占空比减小
			}
		}
		else
		{
			keyFlag=1;	//按键锁释放标志,下一次按键时允许调整占空比
		}
	}
}

 

#ifndef _MY51_H
#define _MY51_H
#include <reg52.h>
//#include <math.h>
#include <intrins.h>
#include <stdio.h>
#include "mytype.h"


#ifndef _51LED_
#define _51LED_
#define led 	  P1      			 //P1总线连8个led灯,灯连573锁存器,P1置低电平点亮
#define LED		  led
#define ON(x)     P1&(~(1<<(x)))	 //打开某个灯,开多个灯用 ON(m) & ON(n)
#define OFF(x)    P1|(1<<(x))	 	 //关闭某个灯,关多个灯用 OFF(m)| OFF(n)
#define on(x)	  ON(x)				 //包含大小写
#define off(x)	  OFF(x)

#define ledon     0					 //某个灯,打开
#define ledoff    1					 //某个灯,关闭

sbit led0=P1^0;     
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
sbit led4=P1^4;
sbit led5=P1^5;
sbit led6=P1^6;
sbit led7=P1^7;	
sbit ledLock=P2^5;	//锁定当前8个led的状态,0锁定 ,1不锁定

#endif

/*************二进制输入宏****************************/
#ifndef _LongToBin_
#define LongToBin(n) \ 			   
(					 \ 
((n >> 21) & 0x80) | \ 
((n >> 18) & 0x40) | \ 
((n >> 15) & 0x20) | \ 
((n >> 12) & 0x10) | \ 
((n >> 9)  & 0x08) | \ 
((n >> 6)  & 0x04) | \ 
((n >> 3)  & 0x02) | \ 
((n ) & 0x01) 		 \ 
)
#define  bin(n)  LongToBin(0x##n##l)
#define  BIN(n)  bin(n)
#define  B(n)    bin(n)
#define  b(n)    bin(n)			  
#endif

/*************单个数据位的置位宏*********************/
#ifndef   _BIT_
#define   BIT(n)   (1<<n)
#define   bit(n)   BIT(n)
#endif

#define high	1   //高电平
#define low		0   //低电平


sbit beep=P2^3;     //蜂鸣器

extern void delayms(u16 ms);
extern void delayXus(u8 us); //函数执行(8+6x)个机器周期, 即t=(8+6x)*1.085
/////////////////////////////////////////////////////////////////////////////


#endif

 

#ifndef _TIMER0_H
#define _TIMER0_H
#include "my51.h"


extern u8   timeMultiple1Flag; //中断时间复用置位标志,须手动清零
extern u8   timeMultiple2Flag; //中断时间复用置位标志,须手动清零
extern void T0_work(); 		   //该函数未实现,需外部实现
extern void initT0(u8 ms,u16 t_multiple1,u16 t_multiple2) ; //定时器初始化


#endif

 

#include "timer0.h"

u8   TH0Cout=0 ;	     //初值	
u8   TL0Cout=0 ;	   
u16  T0IntCouts1=0;     	 //中断计数
u16  T0IntCouts2=0;     	 //中断计数
u16  timeMultiple1=0;     //中断复用时间的倍数
u16  timeMultiple2=0;     //中断复用时间的倍数
u8   timeMultiple1Flag=0; //中断时间复用置位标志,须手动清零
u8   timeMultiple2Flag=0; //中断时间复用置位标志,须手动清零

//开启定时器,定时完成后需要手动关闭TR0,否则将循环定时
//参数一是定时的毫秒数,参数二和三是定时基时的倍率数(定时复用)
void initT0(u8 ms,u16 t_multiple1,u16 t_multiple2)  	 //定时器初始化设定,ms取值不超过65
{	
	u16   N=11059.2*ms/12; 				 //定时器总计数值
	TR0=STOP;							 //停掉定时器
	ET0=CLOSE;							 //关定时器中断

	//对于110592晶振,ms为5的整数倍时没有计算误差,但ms最大不超过71毫秒
	TH0Cout =(65536-N)/256;      	 	 //装入计时值零头计数初值
	TL0Cout =(65536-N)%256;
	if(0==t_multiple1)	  //0倍的基准时间是不合理的,至少1倍
	{
		t_multiple1=1;	
	}
	if(0==t_multiple2)	  //0倍的基准时间是不合理的,至少1倍
	{
		t_multiple2=1;	
	}
	timeMultiple1=t_multiple1;		 //倍时
	timeMultiple2=t_multiple2;		 //倍时
	TMOD &= 0xf0;					 //清定时器0配置
	TMOD |= 0x01; 					 //配置定时器0的工作方式为1
	
	EA =OPEN;   		//打开总中断
	ET0=OPEN;   		//打开定时器中断

	TH0=TH0Cout;  		//定时器装入初值
	TL0=TL0Cout;
	TR0=START;	 		//启动定时器
}
void T0_times() interrupt 1 	  	  //T0定时器中断函数
{
	TH0=TH0Cout;   			  	  	  //重装初值
	TL0=TL0Cout;
	if(++T0IntCouts1==timeMultiple1)  //判断是否复用定时器
	{	
		T0IntCouts1=0; 		 	  	  //中断次数清零,重新计时
		timeMultiple1Flag=1;		  //复用定时器标志,须在T0_work()中手动清零
	}
	if(++T0IntCouts2==timeMultiple2)  //判断是否复用定时器
	{	
		T0IntCouts1=0;			  	  //这个也要清,防止到达最小公倍数时乱掉
		T0IntCouts2=0; 		 	  	  //中断次数清零,重新计时
		timeMultiple2Flag=1;	  	  //复用定时器标志,须在T0_work()中手动清零
	}
	T0_work();     				  	  //调用工作函数
}

 

 

0
1
分享到:
评论
1 楼 tedeum 2013-03-04  
正在学些51,不错,学习了

相关推荐

    STC系列51单片机利用PCA定时器产生PWM信号例程

    PWM信号在许多领域都有应用,如电机控制、电源管理、LED亮度调节等。 首先,我们来理解PCA定时器。PCA实际上是51单片机中的一个可编程定时/计数器,它能够执行多种功能,包括普通定时、计数、比较和PWM输出。PCA...

    (PWM)51单片机脉冲宽度调制控制LED灯亮度

    标题中的 "(PWM)51单片机脉冲宽度调制控制LED灯亮度" 提示我们,这个话题涉及51系列单片机使用脉冲宽度调制(PWM)技术来调节LED灯的亮度。51单片机本身并不直接提供PWM接口,因此需要通过软件模拟来实现这一功能。 ...

    pwm控制的基本原理利用定时器产生PWM,控制LED灯由亮到灭,由灭到亮逐步变化,也就是调光现象.zip

    本教程将深入探讨PWM控制的基本原理以及如何利用单片机的定时器来实现PWM,进而控制LED灯的亮度。 首先,我们需要了解PWM的工作机制。PWM信号是一个周期性的方波信号,其特性在于高电平持续时间(占空比)与低电平...

    51单片机一个定时器产生可调PWM的c程序

    以上就是利用51单片机一个定时器生成可调PWM信号的基本步骤和涉及的知识点。在实际应用中,可能还需要考虑电源稳定性、电磁兼容性以及系统的实时响应等因素。通过理解这些原理和实践,可以为各种控制系统设计出高效...

    单片机产生PWM波形控制LED灯亮度.ppt

    单片机产生 PWM 波形控制 LED 灯亮度的设计思路是:首先通过单片机的定时器产生 PWM 波,然后控制 LED 灯的亮度。定时器的中断对 PWM 波形的影响可以通过改变脉冲列的周期和占空比来实现。 在这个设计中,单片机的...

    单片机pwm控制led亮度原理图

    单片机通过PWM(脉冲宽度调制)控制LED亮度的原理,实际上是一种利用数字信号对模拟信号进行模拟的过程。这种技术可以应用于多种微控制器中,但本文主要以51系列单片机为例进行说明。要理解单片机PWM控制LED亮度的...

    Protues仿真实例-51单片机-定时器做的可调PWM.rar

    这个压缩包文件“Protues仿真实例-51单片机-定时器做的可调PWM.rar”显然是一个关于如何使用51单片机的定时器来生成可调脉宽调制(PWM)信号的教程资源。以下将详细解释相关的知识点。 1. **51单片机**:51系列...

    51单片机定时器0模拟PWM输出

    本文将深入探讨如何使用51单片机的定时器0来模拟PWM(脉冲宽度调制)输出,这对于实现各种控制任务,如LED亮度调节、电机速度控制等,具有重要的实际意义。 首先,我们要理解PWM的基本原理。PWM是一种通过改变...

    单片机产生PWM波形控制LED灯亮度PPT课件.ppt

    单片机产生PWM波形控制LED灯亮度是利用单片机产生占空比可变的矩形波来控制LED灯的亮度。PWM(脉冲宽度调制)是指用微处理器的数字输出来对模拟电路进行控制的一种技术,广泛应用在从测量、通信到功率控制与变换的...

    51单片机定时器0产生200mS方波keil工程文件C源文件

    本文将深入探讨如何使用51单片机的定时器0来产生200毫秒(mS)的方波信号,并结合keil μVision(通常称为keil5)IDE进行C语言编程。 51单片机的定时器0是其内部的一种硬件资源,它能够计数CPU的时钟周期,以实现...

    51单片机定时器产生PWM.zip

    总的来说,51单片机定时器产生PWM的方法是通过软件模拟,利用定时器的中断功能和适当的GPIO操作来生成所需的PWM波形。这需要对51单片机的定时器工作模式、中断系统以及GPIO操作有深入的理解,同时,编程时要特别注意...

    51单片机Proteus仿真实例 定时器控制交通指示灯

    51单片机Proteus仿真实例 定时器控制交通指示灯51单片机Proteus仿真实例 定时器控制交通指示灯51单片机Proteus仿真实例 定时器控制交通指示灯51单片机Proteus仿真实例 定时器控制交通指示灯51单片机Proteus仿真实例 ...

    51单片机中用PWM控制LED亮度调节

    在本例中,我们探讨的是如何使用51单片机通过脉宽调制(PWM)技术来调节LED灯的亮度。PWM是一种通过控制信号的占空比来模拟电压或电流大小的技术,对于LED亮度调节非常有效。 首先,LED通常需要恒定电流驱动以确保...

    51单片机定时器产生1Hz信号

    51单片机定时器产生1Hz信号 本实验报告的主要目的是掌握单片机中断系统的结构、单片机的5个中断源、中断过程及中断源编号,并掌握C51中断服务函数的编写。实验内容包括使用软件延时方法产生5S延时,使LED0实现5S亮/...

    利用单片机定时器产生的占空比可调的PWM程序

    标题中的“利用单片机定时器产生的占空比可调的PWM程序”指的是在嵌入式系统中,通过单片机的定时器功能生成脉宽调制(PWM)信号,并且这种信号的占空比是可调节的。PWM是一种模拟控制技术,常用于电机驱动、电源...

    Protues仿真实例-51单片机-PWM控制LED的亮度仿真程序.rar

    这个压缩包文件“Protues仿真实例-51单片机-PWM控制LED的亮度仿真程序.rar”提供了关于如何使用51单片机通过脉冲宽度调制(PWM)技术来控制LED亮度的实例教程。下面我们将详细讨论相关知识点。 1. **51单片机**:51...

    51单片机单片机产生占空比可调方波程序(PWM).zip

    51单片机生成占空比可调的方波,不仅可用于电机控制、亮度调节、音频功放等,还可以作为数字模拟转换器(DAC)的替代方案,用于生成模拟信号。通过熟练掌握这一技能,开发者可以在各种嵌入式系统设计中灵活运用PWM...

    51单片机c语言PWM控制LED灯渐亮渐灭实验详细操作适合新手入门范例程序

    本实验主题是“51单片机C语言PWM控制LED灯渐亮渐灭”,这是一个很好的入门级项目,旨在帮助新手理解单片机基本原理、C语言编程以及脉冲宽度调制(PWM)技术的应用。 首先,我们来详细讲解51单片机。51单片机是Intel...

    51单片机通过PWM调节灯光亮度

    总结起来,通过51单片机的PWM技术调节灯光亮度涉及定时器的配置、PWM输出引脚的选择、串口通信的实现以及中断服务程序的设计。理解并掌握这些知识点,将有助于我们成功实现单片机对灯光亮度的智能控制。在提供的...

    51单片机定时器产生1mS方波keil工程文件C源文件

    本文将深入探讨如何使用51单片机的定时器来产生1毫秒(mS)的方波,并结合提供的keil工程文件进行解析。 51单片机的定时器是其核心功能之一,它可以实现定时或计数任务。在这个场景中,我们将关注定时器作为计数器...

Global site tag (gtag.js) - Google Analytics