【ARM+51单片机开发板套件试用体验】 7、定时器PWM控制LED

  • hehung
  • LV5工程师
  • |      2018-04-12 21:11:02
  • 浏览量 1110
  • 回复:0
今天有些路一个定时器控制LED的程序,原理比较简单。 使用的是定时器0,通过配置定时器0为定时模式就可以了,然后在程序中打开定时器,定时时间间隔设置的小一点,设置的太大会造成不流畅的情况。 我在程序中设置的是0.01ms,周期为100,通过跟戴duty就可以改变占空比。如果要控制舵机运动的话,可以将定时时间设置成0.2ms,这样100次就是20ms,就是多级的控制周期了,然后通过设置占空比就可以控制舵机运动了。 废话不多说了,上程序:
#include 



#define uchar unsigned char

#define uint  unsigned int



sbit pwm = P3^7;		//定义PWM引脚为P3.7

uchar duty = 100;



void timer0_Init(void);

void Set_Duty(void);

void delay_ms(uint ms);



int main()

{

	int i;

	

	timer0_Init();

	

	while(1)

	{

		for(i=100;i>0;i-=1)

		{

			duty = i;

			delay_ms(1);

		}	

		for(i=0;i<10;i+=1)

		{

			duty = i;

			delay_ms(1);

		}

	}

}



//延时函数

void delay_ms(int ms)

{

	uint i;

	for(;ms>0;ms--)

		for(i=0;i<110;i++);

}

	

//定时器0初始化

void timer0_Init(void)

{

	TMOD|=0X01;			//选择为定时器0模式,工作方式1,仅用TR0打开启动。



	TH0=(65536-20)/256;	//给定时器赋初值,50us

	TL0=(65536-20)%256;	

	ET0=1;				//允许定时器中断0

	EA=1;				//打开总中断

	TR0=1;				//打开定时器			

}



//使用定时0模拟PWM

void timer0() interrupt 1

{	

	static uint pwm_count = 0;

	

	TH0=(65536-10)/256;	//给定时器赋初值,50us

	TL0=(65536-10)%256;	

	

	pwm_count ++;	



	if(pwm_count >= 100)

	{

		pwm_count = 0;

	}else if(pwm_count <= duty)

	{

		pwm = 0;

	}else

	{

		pwm = 1;

	}

}
其中duty变量就是占空比的控制变量。 展示效果,如下图动图所示: 可以看到LED呈现明暗的变化 期望大家支持:)
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:0
x
收藏成功!点击 我的收藏 查看收藏的全部帖子