📄 51 -
字号:
# include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
void keyscan(void);
uint a,b,c,d;
/*a为舵机1的脉冲宽度,b为舵机2的脉冲宽度,单位1/1000 ms */
/*c、d为中间变量*/
/*以下定义输出管脚*/
sbit p12=P1^2;
sbit P13=P1^3;
sbit p16=P1^6;
sbit p15=P1^5;
sbit p17=P1^7;
void delay(void);
/*以下两个函数为定时器中断函数*/
/*定时器1,控制舵机1,输出引脚为P12,可自定义*/
void timer0(void) interrupt 1 using 1
{p12=!p12; /*输出取反*/
c=18432-c; /*20000代表20 ms,为一个周期的时间*/
TH0=-(c/256); TL0=-(c%256); /*重新定义计数初值*/
if(c>=470&&c<=2300)c=a;
else c=18432-a; /*判断脉宽是否在正常范围之内*/
}
/*定时器2,控制舵机2,输出引脚为P13,可自定义*/
void timer1(void) interrupt 3 using 1
{P13=!P13;
d=18432-d;
TH1=-(d/256); TL1=-(d%256);
if(d>=470&&d<=2304)d=b;
else d=18432-b;
}
/*主程序*/
void main(void)
{TMOD=0x11; /*设初值*/
p12=1;
P13=1;p17=1;
a=2000;
b=566; /*数值1500即对应1.5ms,为舵机的中间90度的位置*/
c=a;d=b;
TH0=-(a/256); TL0=-(a%256);
TH1=-(b/256); TL1=-(b%256); /*设定定时器初始计数值*/
EA=1;
ET0=1; TR0=1;EX0=1;EX1=1;
ET1=1; TR1=1;
PX0=0;PX1=0;PT1=1;PT0=1;/*设定中断优先级*/
for(;;)
{
keyscan();
}
}
/*在这个for循环中,可以根据程序需要
在任何时间改变a、b值来改变脉宽的输
出时间,从而控制舵机*/
void keyscan(void)
{
if(p16==0)
{
delay();
if(p16==0)
{
if(500<=a&&a<=2100)a+=50;
p17=!p17;
while(p16==0);
}
}
if(p15==0)
{
delay();
if(p15==0)
{
if(550<=a&&a<=2150)a-=30;
p17=!p17;
while(p15==0);
}
}
}
void delay (void)
{
uint uidata;
for(uidata=1;uidata<=500;uidata++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -