标题:
51单个舵机精确控制程序
[打印本页]
作者:
南风知我意@@@
时间:
2020-4-4 12:18
标题:
51单个舵机精确控制程序
舵机控制
#include <12c5a.H> //STC12C5A系列单片机
unsigned char count; //0.5毫秒计数
//PWM控制
sbit jia =P1^6; //测试加
sbit jan =P1^5; //测试减
unsigned char jd; //角度控制
sbit pwm8=P0^1;
sbit pwm7=P1^1;
sbit pwm6=P2^1;
sbit pwm5=P2^0;
sbit youyan=P3^5;
sbit zuoyan=P3^7;
sbit zuojiao=P1^7;
sbit youjiao=P1^2;
sbit zuojiao2=P1^6;
sbit youjiao2=P1^0;
sbit pwm4=P0^4;
sbit pwm3=P1^4;
sbit pwm2=P3^4;
sbit pwm1=P2^4;
uint16 pwm[9]={1500,1500,1500,1500,1500,1500,1500,1500,1500}; //定时器取定时值从这里取
/**************************************************************************************************
函数名:delay(uint16 time)
功能: 软件延时函数
参数: time 定时值,其大小与延时长短成正比
备注:
/***************************************************************************************************/
void delay(uint16 time)
{
uint16 i;
uint16 j;
for(i=0;i<1000;i++)
for(j=0;j<time;j++);
}
/**************************************************************************************************
函数名:timer_init()
功能: 定时器初始化函数
备注: 1T
/***************************************************************************************************/
void Timer_init()
{
EA=1; //开总中断
AUXR|=0xC0; //T0,T1工作在1T
TMOD|= 0x11; //T0工作在方式1,16位
ET0 = 1; //开定时器0中断
}
/**************************************************************************************************
函数名:timer0(uint32 us)
功能: 定时器0定时函数
参数: us,毫秒。 精确定时。
备注: 晶振12M,工作模式1T
/***************************************************************************************************/
void Timer0(uint32 us)
{
uint32 valu;
valu=us*12; //工作在1T,最大定时时间2700us
valu=valu;
valu=0xffff-valu; //
TH0=valu>>8;
TL0=(valu<<8)>>8;
TR0 = 1; //T0开始工作
}
/**************************************************************************************************
函数名:T0zd(void) interrupt 1
功能: 定时器0中断函数
备注: 控制8个舵机
/***************************************************************************************************/
void T0zd(void) interrupt 1
{
static uint8 i=1;
switch(i) //
{
case 1:
{
pwm1=1;
Timer0(pwm[1]); //定时
} break;
case 2:
{
pwm1=0; //pwm1变低
Timer0(2500-pwm[1]);// 定时
} break;
case 3:
{
pwm2=1; //pwm2变高
Timer0(pwm[2]);// 定时时常为pwm[2]
} break;
case 4:
{
pwm2=0; //pwm2变低
Timer0(2500-pwm[2]);// 定时时常为pwm[2]
} break;
case 5:
{
pwm3=1; //pwm3变高
Timer0(pwm[3]);// 定时时常为pwm[3]
} break;
case 6:
{
pwm3=0; //pwm3变低
Timer0(2500-pwm[3]);// 定时
} break;
case 7:
{
pwm4=1; //pwm4变高
Timer0(pwm[4]);// 定时
} break;
case 8:
{
pwm4=0; //pwm4变低
Timer0(2500-pwm[4]);// 定时
} break;
case 9:
{
pwm5=1; //pwm5变高
Timer0(pwm[5]);// 定时
} break;
case 10:
{
pwm5=0; //pwm5变低
Timer0(2500-pwm[5]);// 定时
} break;
case 11:
{
pwm6=1; //pwm6变高
Timer0(pwm[6]);// 定时
} break;
case 12:
{
pwm6=0; //pwm6变低
Timer0(2500-pwm[6]);// 定时
} break;
case 13:
{
pwm7=1; //pwm7变高
Timer0(pwm[7]);// 定时
} break;
case 14:
{
pwm7=0; //pwm7变低
Timer0(2500-pwm[7]);// 定时
} break;
case 15:
{
pwm8=1; //pwm8变高
Timer0(pwm[8]);// 定时
} break;
case 16:
{
pwm8=0; //pwm8变低
Timer0(2500-pwm[8]);// 定时
i=0;
} break;
default:break;
}
i++;
}
void keyscan() //测试按键扫描
{
if(jia==0)
{
if(jia==0)
{
pwm[1]=pwm[1]+3;
if(pwm[1]>=250)
pwm[1]=250;
delay(40);
}
}
if(jan==0)
{
if(jan==0)
{
pwm[1]=pwm[1]-3;
if(pwm[1]<=20)
pwm[1]=20;
delay(40);
}
}
}
void main()
{
P0M1=0; //设置P口为强推免输出模式,下同
P0M0=0XFF;
P2M1=0;
P2M0=0XFF;
P3M1=0;
P3M0=0XFF;
P4M1=0;
P4M0=0XFF;
P5M1=0;
P5M0=0XFF;
P4SW|=0X70;
Timer_init();
Timer0(32);
delay(40);
pwm[1]=110;
while(1)
{
keyscan(); //持续监测按键状态
}
}
复制代码
舵机精确控制.7z
2020-4-4 12:17 上传
点击文件名下载附件
下载积分: 黑币 -5
22.05 KB, 下载次数: 22, 下载积分: 黑币 -5
作者:
admin
时间:
2020-4-7 15:54
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1