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

📄 main.c

📁 用编码盘来控制舵机的程序
💻 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 + -