首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

51单片机控制输出pwm信号控制舵机

2024-03-09 来源:华拓网


利用51单片机控制输出pwm信号控制舵机

# include

#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++);

}

# include

#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++);

}

因篇幅问题不能全部显示,请点此查看更多更全内容