使用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