#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度后再复位。求程序。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)