⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwm.c

📁 51单片机控制舵机PWM程序
💻 C
字号:
#include "PWM.h"

uchar baseTimeCounter = 0;		// 定时器0的基本定时时间
uchar steeringEngineAngle = STEERING_ENGINE_ANGLE;	//角度标识

/******************************************************************
 - 功能描述:1ms精度的延迟函数
 - 参数说明:  
 - 返回说明:
 - 示例:  
 - 修改记录:
 - 注意事项:适用于11.0592M的晶振频率。
******************************************************************/
void Delay_1ms(uint ms)//延时
{
	uint i, j;

	for (i=0; i<ms; i++)
	{
		for (j=0; j<125; j++);
	}
}

/******************************************************************
 - 功能描述:设定定时器0的定时时间为0.5ms
 - 参数说明:  
 - 返回说明:
 - 示例:  
 - 修改记录:
 - 注意事项:适用于11.0592M的晶振频率。
******************************************************************/
void Init_Timer0(void)	//定时器初始化
{	
	// 设定定时器0工作在方式1(16位定时器模式)
	TMOD = 0x01;	
	// 设定定时器0的定时时间
	TH0 = (65535-460)/256;
	TL0 = (65535-460)%256;	//11.0592MZ晶振,0.5ms
	// 开中断
	ET0 = 1;
	EA = 1;
	// 开启定时器
	TR0 = 1;
}

/******************************************************************
 - 功能描述:产生所需要的PWM波
 - 参数说明:  
 - 返回说明:
 - 示例:  
 - 修改记录:
 - 注意事项:适用于11.0592M的晶振频率。
******************************************************************/
void Timer0_Interrupt() interrupt 1 //中断程序
{	 
	// 重载定时器0
	TH0 = (65535-460)/256;	
	TL0 = (65535-460)%256;

	if (baseTimeCounter < steeringEngineAngle) 	//判断0.5ms次数是否小于角度标识
	{
		PWM0 = 1;                  //确实小于,PWM输出高电平
	}
	else
	{
		PWM0 = 0;                  //大于则输出低电平
	}

	baseTimeCounter += 1;          //0.5ms次数加1
	if (baseTimeCounter == 40)
	{
		baseTimeCounter = 0;
	}
}

/******************************************************************
 - 功能描述:通过按键调整PWM波的占空比->舵机的角度
 - 参数说明:  
 - 返回说明:
 - 示例:  
 - 修改记录:
 - 注意事项:每次增加/减少的角度为45°
******************************************************************/
void KeyScan(void)              //按键扫描
{ 	
	#if (ADJUST_STEERING_ENGINE_MODE == KEY_SET_POINT)
	{
		// 增加角度
		if (KEY1 == 0) 				// 角度增加按键是否按下
		{
			Delay_1ms(10); 					// 延时消抖
			if (KEY1 == 0)   			// 确实按下
			{	
				baseTimeCounter = 0;				// 按键按下 则20ms周期从新开始
	
				steeringEngineAngle++;			// 高电平时间增加0.5ms->角度增加45°			
				if(steeringEngineAngle == 12)
				{
					steeringEngineAngle = 11;	// 已经是180度,则保持
				}
	
				while (KEY1 == 0);	// 等待按键放开
			}
		}
		// 减少角度
		if (KEY2 == 0)     			// 角度减小按键是否按下
		{
			Delay_1ms(10);					// 延时消抖
			if (KEY2 == 0)
			{	
				baseTimeCounter = 0;
	
				steeringEngineAngle--;     	// 角度标识减1			
				if(steeringEngineAngle==0)
				{
					steeringEngineAngle=1;  	// 已经是0度,则保持
				}
	
				while (KEY2 == 0);		// 等待按键放开
			}
		}
	}
	#endif
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -