使用51单片机控制sg90舵机来回旋转

时间:2024-04-05 11:42:55

使用STC89C51单片机控制SG90舵机来回旋转

main.c

#include "control.h"

void main() {
	
	Timer1_Init();
	
	while(1){
		
		control ();
		
	}
}

 control.c

#include <reg52.h>
#include <intrins.h>

sbit PWM = P1^0; // 舵机信号输入点位

unsigned char counter, angle; // 计数值和旋转方向, angle范围 (1-5);

// @11.0592MHZ
void Delay500ms(){
	
	unsigned char i, j, k;
	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
	  do
		{
			while(--k);
		} while(--j);
	} while(--i);
}
// 500微秒@11.0592MHZ
void Timer1_Init(){
	
	TMOD = 0x10; // 设置定时器模式
	TL1 = 0x33; // 设置定时初始值
	TH1 = 0xFE; // 设置定时初始值
	
	TF1 = 0; // 清除TF1标志
	TR1 = 1; // 定时器1开始计时
	ET1 = 1; // 定时器1的中断允许开关
	EA = 1; // 定时器总开关
	PT1 = 1; // 设置定时器为高低控制优先级
}

// 中断函数
void Timer1_Routine() interrupt 3
{
	TL1 = 0x33; // 设置定时初始值
	TH1 = 0xFE; // 设置定时初始值
	counter++;
	if (counter >= 40) {
		 counter = 0;
	}
	if (counter < angle) {
		PWM = 1;
	} else {
		PWM = 0;
	}
}

void control(){
	
	counter = 0;
	angle = 2; // -45度位置
	Delay500ms();
	
	counter = 0;
	angle = 4; // +45度位置
	Delay500ms();
	
	counter = 0;
	angle = 3; // 0度位置(归中)
	Delay500ms();
	Delay500ms();
}

 control.h

#ifndef __CONTROL_H_
#define __CONTROL_H_

Timer1_Init();
void control ();

#endif