STC89C52RC使用定时器2控制90°SG90舵机

不想写文章,只放代码自己拷。

#include <REGX52.H>

#define SG90_PORT		        P1_0  //端口

//获取位值
#define GET_BIT_H(BIT) 			(BIT>>8)
#define GET_BIT_L(BIT)			(BIT&0xFF)

//计算定时器值
#define GET_VAL(US, FREQ) 	(65535-(unsigned short)(US*FREQ/12)) //计算定时器计数值

//电平标志
#define LEVEL_HIGH    1
#define LEVEL_LOW     0

unsigned short high_level;
unsigned short low_level;
	
void sg90_init(int ang)
{
	//周期20ms
	int us = (int)((float)ang/180.0*2000+500); //计算计时频率
	high_level = GET_VAL(11.0592, us); //计算pwm高电平
	low_level  = GET_VAL(11.0592, 20000-us); //计算pwm低电平
	SG90_PORT  = LEVEL_HIGH;
	
	T2MOD = 0;
	T2CON = 0;
	TH2 = GET_BIT_H(low_level);
	TL2 = GET_BIT_L(low_level);
	ET2 = 1;
	EA = 1;
	PT2 = 0;
  TR2 = 1;
}

void sg90_set(int ang)
{
	int us = (int)((float)ang/180.0*2000+500); //计算计时频率
	high_level = GET_VAL(11.0592, us); //计算pwm高电平
	low_level  = GET_VAL(11.0592, 20000-us); //计算pwm低电平
	//电平为高
	SG90_PORT  = LEVEL_HIGH;
	//更新定时器计数
	RCAP2H = GET_BIT_H(low_level);
	RCAP2L = GET_BIT_L(low_level);
}

void sg90_contrl_handler(void) interrupt 5
{
	
	if (SG90_PORT == LEVEL_HIGH)
	{
		//设置端口电平
		SG90_PORT = LEVEL_LOW;
		//更新定时器值
		RCAP2H = GET_BIT_H(high_level);
		RCAP2L = GET_BIT_L(high_level);
	}
	else
	{
		//设置端口电平
		SG90_PORT = LEVEL_HIGH;
		//更新定时器值
		RCAP2H = GET_BIT_H(low_level);
		RCAP2L = GET_BIT_L(low_level);
	}
	
	//清除标志位
	TF2 = 0;
}










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值