📄 main.c
字号:
#include"reg51.h"//包涵头文件
//#define ctlout P1//定义P1口为控制输出口
#define minangle 500//定义最小脉宽
#define maxangle 1800//定义最大脉宽
#define Initangle 1100//初始角度-单位均为μm
//#define endangle 2200//终止角度
#define stepangle 50//定义步进脉宽
#define circle 20000//定义舵机周期20ms
#define T0MAX 65535//定义定时器定时的最大值
void Initinterupt(void);//中断初始化函数
sbit ctlout=P1^0;//定义P1.0口为控制输出口
//全局变量
unsigned int angle=Initangle ;//角度
bit angleflag=0;//正负向标志为,0标志舵机正向转动,1标志负向转动
bit voltflag=0;//输出高低电平(占空)标志位,0标志输出高电平(占),1标志低电平(空)
//主函数开始
void main(void)
{
Initinterupt();//中断初始化函数
while(1);//等待中断
}
//外部中断负跳变检测函数
void INT0process(void) interrupt 0
{
EX0=0;//关闭外部中断0
IE0=0;//外部中断标志清0
TR0=0;//关定时器0
if(!angleflag)//若果舵机正向转动
{
angle=angle+stepangle;//输出角度增加一个不进角
if(angle>=maxangle)//若果旋转角度大于或等于终止角度
angleflag=1;//标志负向旋转标志位
}
else //否则舵机反向旋转
{
angle=angle-stepangle;//输出角度减小一个不进角
if(angle<=minangle)//如果旋转角度小于或等于起始角度
angleflag=0;//标志正向旋转标志
}
ET0=1;//开定时器T0允许
TR0=1;
EX0=1;
ctlout=0;
voltflag=1;
}
//中断初始化函数
void Initinterupt(void)
{
IT0=1;//将外部中断0设置为下降沿触发方式
TMOD=0x01;//设置定时器T0工作方式为2计时
TH0=(T0MAX-(circle-angle))>>8;//送出高8位
TL0=(T0MAX-(circle-angle))&0x00ff;//送出低八位
EA=1;//开总中断允许
ET0=1;//开定时器T0允许
EX0=1;//开放外部中断0
ctlout=0;
voltflag=1;
TR0=1;
}
//定时中断处理程序,
void Time0process(void) interrupt 1
{
TR0=0;//关闭T0中断允许
TF0=0;//清除中都T0标志位
if(!voltflag)//如果是高电平输出标志
{
ctlout=0;//输出空
voltflag=1;//标志成低电平标志
TH0=(T0MAX-(circle-angle))>>8;//送出高8位
TL0=(T0MAX-(circle-angle))&0x00ff;//送出低八位
}
else//否则输出搞电平
{
ctlout=1;//输出占
voltflag=0;//标志成高电平标志
TH0=(T0MAX-angle)>>8;//送出高8位
TL0=(T0MAX-angle)&0x00ff;//送出低八位
}
TR0=1;//启动T0中断
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -