单片机STC89C52 如何控制舵机

单片机STC89C52 如何控制舵机,第1张

#include<reg52h> //51单片机头文件

#define uint unsigned int //宏定义

#define uchar unsigned char //宏定义

void delay(uint); //延时子函数声明

void enable1(void);

void enable2(void);

sbit P1_0=P1^0; //PWM信号输出端

sbit K1=P1^1;

sbit K2=P1^2;

sbit K3=P1^3;

/主函数/

void main()

{

P1_0=1; //置PWM初始输出为高电平

while(1)

{

if(K1==0)

{

delay(20);

if(K1==0)

{

while(!K1);

enable1();

//while(!s2)

}

}

if(K2==0)

{

delay(20);

if(K2==0)

{

while(!K2);

enable2();

}

}

/ if(K3==0)

{

delay(20);

if(K3==0)

{

Init3;

}

}

/

}

}

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void enable1(void)

{

TMOD=0x01; //设置定时器0工作方式1后面运行TR位启动

TH0=(65536-1500)/256;

TL0=(65536-1500)%256; //15ms 的高电平

EA=1; //开总中断

ET0=1; //开定时器0中断

TR0=1; //启动定时器0

}

void enable2(void)

{

TMOD=0x10; //设置定时器1工作方式1后面运行TR位启动

TH1=(65536-900)/256;

TL1=(65536-900)%256; //15ms 的高电平

EA=1; //开总中断

ET1=1; //开定时器1中断

TR1=1; //启动定时器1

}

//设置第三种PWM方式的初始化

/

void Init3()

{

TMOD=0x01; //设置定时器0工作方式1后面运行TR位启动

TH0=(65536-1500)/256;

TL0=(65536-1500)%256; //15ms 的高电平

}

/

/中断服务程序/

void PWM1() interrupt 1 //定时器0 中断,产生方波

{

if(P1_0==1) //如果上个电平为1,则下个低电平的时间为185ms

{

TH0=(65536-18500)/256;

TL0=(65536-18500)%256;

}

else //如果上个电平为0,则下个高电平为15ms

{

TH0=(65535-1500)/256;

TL0=(65535-1500)%256;

}

P1_0=~P1_0;

}

void PWM2() interrupt 3 //定时器1中断,产生方波

{

if(P1_0==1) //如果上个电平为1,则下个低电平的时间为185ms

{

TH0=(65536-19000)/256;

TL0=(65536-19000)%256;

}

else //如果上个电平为0,则下个高电平为15ms

{

TH0=(65535-900)/256;

TL0=(65535-900)%256;

}

P1_0=~P1_0;

}

//定时器2设置第三种PWM波

/ void PWM3() interrupt 5 //定时器2 中断,产生方波

{

if(P1_0==1) //如果上个电平为1,则下个低电平的时间为185ms

{

TH0=(65536-18500)/256;

TL0=(65536-18500)%256;

}

else //如果上个电平为0,则下个高电平为15ms

{

TH0=(65535-1500)/256;

TL0=(65535-1500)%256;

}

P1_0=~P1_0;

}

/

辛苦之作,如果能够回答你的问题,别忘了给分哦~~喵喵

*** 作步骤:

1 单片机,舵机,电源共地;

2 用两个稳压芯片进行供电,将电源分开来;

3 舵机信号端没有直接连接单片机IO口,我串了一个10K的电阻,也就是这一步之后就可以控制舵机。

给你个思路

0-90度

1、IO输出高电平15ms

2、低电平输出185ms(周期20ms)

3、循环重复100次步骤1 2

90-0度

1、IO输出高电平05ms

2、低电平输出195ms(周期20ms)

3、循环重复100次步骤1 2

TH1=-100>>8, 这个-100 到底是多少位呢??从数值来看,-100 符合 -128~127的范围(char),所以系统只需要 用 char 型运算即可了。于是,不管 -100 结果如何,>>8 都=0;于是 TH1=0;然后,T0,T1 就不知道成什么样了。

定时器初值的赋值,建议你算好后,放进去,不要 靠单片机帮你计算,这样不会出错。

#include <reg52h> //12M晶振

sbit PWM=P1^0; //定义P1^0为输出端口

unsigned int pwm_h=2430,pwm; //定义pwm信号中的高电平时间

范围 535< pwm_h <2430

bit fa;

void Init_Timer0() //定时器初始化子程序

{

TMOD = 0x01;

TH0 = 0x0FF;

TL0 = 0x0F6;

EA = 1;

ET0 = 1;

TR0 = 1; //定时器开关打开

}

void main() //主函数

{

Init_Timer0(); //定时器初始化

PWM=0;

while(1)

{

if(fa)

{

fa=0;

pwm_h=20000-pwm_h;

}

}

}

void Timer0() interrupt 1 using 1

{

TH0 =(-pwm_h)/256;

// (65535-200) /256=0xff;

TL0 =(-pwm_h)%256; //01ms一个记时器周期

236 % 256 = 236

fa=1;

PWM=~PWM;

}

以上就是关于单片机STC89C52 如何控制舵机全部的内容,包括:单片机STC89C52 如何控制舵机、怎么用51单片机控制舵机、51单片机控制9g小舵机,转90度后再复位。求程序。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9352741.html

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

发表评论

登录后才能评论

评论列表(0条)

保存