51单片机控制舵机左转90然后延时2秒再右转180,延时两秒回到中间,怎么做?

51单片机控制舵机左转90然后延时2秒再右转180,延时两秒回到中间,怎么做?,第1张

以下程序可供参考

//用一个定时器定时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}

}

舵机频率50hz就是说一周期是20ms,占空比在百分之2.5到12.5可以从-90转到90度

单片机内部有工作的晶振频率,定时器就是基于这个频率计时,根据程序可以知道,20ms计时20000,所以计时器每加一的时间为1us,这个程序的意思就是先工作定时器0,20ms后输出置为1并打开定时器1,定时器1计时到1.5ms后触发中断使得输出为0,即占空比为1.5/20=百分之7.5,中间位置

定时器的寄存器加到0会触发中断,所以寄存器都写负数,如想要20ms就写-20000,这样往上加到0需要的计数的次数就为20000,一次计数为1us,所以为20ms,而寄存器是由两个八位寄存器组成的,所以20000要分开写

建议有时间可以去看一下郭天祥老师的51单片机视频,能搜到而且不多,貌似第三集是讲的定时器


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存