TH1=-100>>8, 这个-100 到底是多少位呢??从数值来看,-100 符合 -128~127的范围(char),所以系统只需要 用 char 型运算即可了。于是,不管 -100 结果如何,>>8 都=0;于是 TH1=0;然后,T0,T1 就不知道成什么样了。
定时器初值的赋值,建议你算好后,放进去,不要 靠单片机帮你计算,这样不会出错。
*** 作步骤:
1 单片机,舵机,电源共地;
2 用两个稳压芯片进行供电,将电源分开来;
3 舵机信号端没有直接连接单片机IO口,我串了一个10K的电阻,也就是这一步之后就可以控制舵机。
#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;
}
舵机是通过占空比,来控制它的旋转角度,控制信号从单片机输出之后,不能直接接舵机,因为功率不够,中间接一个非门就可以了。控制信号的编程应该来说是很简单的,就是总周期是固定的,角度不同,高电平的持续时间就不同,然后,比如,50的高电平,150的低电平,那么这样的周期要多少个呢,这也是一个问题,太少了,旋转时间不够,太多了,连续的角度变化的话就会不流畅。多尝试一下吧,还有,这种例子也很多,我们那个时候调了一星期才调好,单片机的型号,引脚关系大嘛?只要是通用的io口都可以用啊
#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;
}
/
辛苦之作,如果能够回答你的问题,别忘了给分哦~~喵喵
以上就是关于51单片机控制舵机问题全部的内容,包括:51单片机控制舵机问题、怎么用51单片机控制舵机、怎么利用Stc15F2K60S2单片机 仿真系列,控制舵机旋转在线求简单的实例程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)