单片机控制舵机程序

单片机控制舵机程序,第1张

//12MHz

#include <reg51.h>

void InitTimer0(void)

{

TMOD = 0x01

TH0 = 0x0B1

TL0 = 0x0E0

EA = 1

ET0 = 1

TR0 = 1

}

void delay(void) //误差 0us 延时1ms 此处可以修改高电平汪陆周期

//修改困逗顷此处的延时可以更改舵机转的角度 ,45度具体是多少 你指备可以试试

{

unsigned char a,b,c

for(c=1c>0c--)

for(b=142b>0b--)

for(a=2a>0a--)

}

void main(void)

{

InitTimer0()

P1_2=0

while(1)

}

void Timer0Interrupt(void) interrupt 1

{

//20ms中断

TH0 = 0x0B1

TL0 = 0x0E0

P1_2=1

delay()

P1_2=0

}

51单片机控制舵机程序

#include <reg52.h>

#define Stop 0 //宏定义,停止

#define Left 1 //宏核者定义,左转

#define Right 2 //宏定义,右转

sbit ControlPort = P2^0//舵机信号端慧烂口

sbit KeyLeft = P1^0//左转按键端口

sbit KeyRight = P1^1//右转按键端口

sbit KeyStop = P1^2//归位按键端口

unsigned char TimeOutCounter = 0,LeftOrRight = 0//TimeOutCounter:定时器溢出计数 LeftOrRight:舵机左右旋转标志

void InitialTimer ( void )

{

TMOD=0x10//定时/计数器1工作于方式1

TH1 = ( 65535 - 500 ) / 256//0.25ms

TL1 = ( 65535 - 500 ) % 256

EA=1//开总中断

ET1=1//允许定时/计数器1 中断

TR1=1//启动定时/计数器1 中断

}

void ControlLeftOrRight ( void ) //控制舵机函数

{

if( KeyStop == 0 )

{

//while ( !KeyStop )//使标志等于Stop(0),改碧薯在中断函数中将用到 LeftOrRight = Stop

}

if( KeyLeft == 0 )

{

//while ( !KeyLeft )//使标志等于Left(1),在中断函数中将用到 LeftOrRight = Left

}

if( KeyRight == 0 )

{

//while ( !KeyRight )//使标志等于Right(2),在中断函数中将用到 LeftOrRight = Right

}

以下程序可供参考

//用一个定时器定时100US产生PWM波

//周期200*100us=20ms

//改变b的值族郑谈可改兆碰变占空比 b=10对应高电平时间1ms

#include<STC12C5A.H>

#define uchar unsigned char

#define uint unsigned int

sbit PWM=P2^0

uchar a=200,b=15//b=15对应舵机0度

void Delay1ms(uint i) //1ms延时程序

{

uint j

for(i>0i--)

{

for(j=0j<125j++)

{}

}

}

void main()

{

TMOD=0X01

TH0=(65536-100)/256

TL0=(65536-100)%256

ET0=1

EA=1

TR0=1

P1M0=0X0F//低4位推挽输出 控制两个电机正反转

P1M1=0X00

P2M0=0X01//最低位推挽输出 控制舵机

P2M1=0X00

while(1)

{

P1=0x0a

b=15Delay1ms(2000)//直行

b=10Delay1ms(1000)//左转

b=15Delay1ms(2000)//直行

b=20Delay1ms(1000)//丛喊右转

b=15Delay1ms(2000)//直行

P1=0x05

b=15Delay1ms(2000)//后退

b=10Delay1ms(1000)//后左转

b=15Delay1ms(2000)//后退

b=20Delay1ms(1000)//后右转

b=15Delay1ms(2000)//后退

}

}

void timer0()interrupt 1

{

TH0=(65536-100)/256

TL0=(65536-100)%256

a++

if(a<=b) PWM=1

else PWM=0

if(a==200){a=0PWM=1}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8281492.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-15
下一篇 2023-04-15

发表评论

登录后才能评论

评论列表(0条)

保存