看完这些 你舵机也就掌握了
第一种方法用两个定时器
# include<reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit pwm=P0^3;//输出PWM信号
sbit hw=P1^0; //红外传感器 有人来 电平拉低 低电平
uint pwm_value=1500;//初值为1.5ms
uint value[]={2000,500};//
uint i;
void delay_ms(uint x)//延时函数
{
uint K;
while(x--)for(K=0;K<125;K++);
}
void InitTimer(void)
{
TMOD=0x11;//开定时器0,1
TH0=-20000/256;//定时20MS,20MS为一个周期
TL0=-20000%256;
TH1=-1500/256;//定时1.5MS,这时舵机处于0度
TL1=-1500%256;
EA=1;//开总断
TR0=0;//关定时器0
ET0=1;
TR1=0;//关定时器1
ET1=1;
}
void timer0(void) interrupt 1//定时器0中断函数
{
pwm=1;
TH0=-20000/256;
TL0=-20000%256;
TR1=1;
}
void timer1(void) interrupt 3//定时器1中断函数
{
pwm=0;
TH1=-pwm_value/256;
TL1=-pwm_value%256;
TR1=0;
}
void main(void)//主函数
{
InitTimer();
while(1)//不断检测是否有人来
{
if(hw==0)//判断语句如果有人来
{
TR0=1;
TR1=1;
pwm_value=1500;
for(i=0;i<2;i++)
{
pwm_value=value[i];//通过数组就可以改变舵机的转角度
delay_ms(2500);//延时2.5s
}
}
}
}
第二种方法只用延时来控制舵机转角
for( i=200; i>0; i-- )
{
PWM = 1; //舵机先转向-90度
delayms( 4 );//0.5MS
PWM = 0;
delayms( 129 );//19.5MS
}
for(j=100;j>0;j--)//delayms( 16500 );//延时2.5MS
{
PWM = 1; //延时2.5s后 舵机转向0度
delayms( 10 );//1.5MS
PWM= 0 ;
delayms( 123 );//18.5MS
}
第三种方法用一个定时和延时
#include <reg52.h>
#define uint unsigned int
sbit pwm=P1^0;
sbit PIS=P1^1;
uint PWM_W=0,PWM_T=0,PWM_data[]={13,4};
uint k=0,i=1,h=0 ;
/*******************************************/
/* 中断初始化 */
/*******************************************/
void InitTimer()
{
TMOD=0X01;
TH0=(65536-78)/256;
TL0=(65536-78)%256;
EA=1;
TR0=0;
ET0=1;
}
/*void delay_ms(uint x)//延时函数
{
uint K;
while(x--)for(K=0;K<125;K++);
} */
/*******************************************/
/* 中断初始化 */
/*******************************************/
void DropLitter()
{
if(PIS==0) //检测到人 舵机开始工作
{
TR0=1;
//h=0;
}
//else TR0=0;
}
void main()
{
InitTimer();
while(1)
{
DropLitter();
}
}
void T0_time() interrupt 1//100微秒中断一次
{
TH0=(65536-78)/256;
TL0=(65536-78)%256;
PWM_W++;
PWM_T++;
i++;
//k++;
if(PWM_T<200) //是否小于20MS
{
if(PWM_W<PWM_data[h]) //转向一个角度
{
pwm=1;
}
else pwm=0;
}
if(PWM_T==200)
{
//delay_ms(2500);
PWM_W=0;
PWM_T=0;
//TR0=0;
//h++;
}
if(i==25000) //延时2.5s后再转个角度
{ //i=0;
//delay_ms(2500);
//PWM_T=0;
//PWM_W=0;
h=1;
//if(h==2)//转向-90度
//h=0;
}
if(i>=26500)
{ i=0;
TR0=0;
h=0;
}
}
这三个舵机的程序很基础 看完理解 你舵机也就会了(这是我从我写的比赛程序里COPY下来的 就是多了个红外传感器检测到人的部分)
有意思
文字多点就好了 不过还行了 。 小编是女生么?不容易啊 可以互粉下啊
整需要谢谢!
谢谢分享!
多谢LZ贴出来,不用去下载
- #include<reg52.h>
- //#include"1602.h"
- #define uchar unsigned char
- #define uint unsigned int
- uchar PWM = 15;
- uchar num = 0;
- uint cycle = 200;
- //uchar beijing[] = "Angle:";
- //uchar angle = 0;
- //uint ske = 0;
- sbit out = P1^0;
- sbit P34 = P3^4;
- sbit P35 = P3^2;
- void delay_1ms(uchar t)
- {
- uchar k = 245;
- while(t--)
- {
- while(k--);
- }
- }
- void timer0_init(void)
- {
- TMOD = 0x01; //工作方式1
- TH0 = (65536 - 100) / 256;//0.1ms
- TL0 = (65536 - 100) % 256;
- TR0 = 1;
- EA = 1;
- ET0 = 1;
- }
- void timer0_isr(void) interrupt 1
- {
- TH0 = (65536 - 100) / 256;
- TL0 = (65536 - 100) % 256;
-
- num++;
- if (num > cycle)num = 0;
- if (num < PWM)
- {
- out = 1;
- }
- else
- {
- out = 0;
- }
-
- }
- //void lcdshow(uchar mm)
- //{
- // uchar gei, shi;
- // gei = mm % 10;
- // shi = mm / 10;
- // write_1602_char(7, 0, shi + 48);
- // write_1602_char(8, 0, gei + 48);
- //}
- void main()
- {
- timer0_init();
- // lcd_1602_init();
- // write_1602_string(0, 0, beijing);
- while(1)
- {
- if (P34 == 0)
- {
- delay_1ms(20);
- if (P34 == 0)
- {
-
- PWM = PWM + 1;
- if (PWM > 25)
- {
- PWM = 25;
- }
- }
- }
- if (P35 == 0)
- {
- delay_1ms(20);
- if (P35 == 0)
- {
-
- PWM = PWM - 1;
- if (PWM < 5)
- {
- PWM = 5;
- }
- }
- }
- // switch(PWM)
- // {
- // case 10: angle = 90; break;
- // case 20: angle = 45; break;
- // case 30: angle = 0; break;
- // case 40: angle = 45; break;
- // case 50: angle = 90; break;
- // }
- // lcdshow(angle);
- }
- }
你的第二种方法的程序不是全的的吧,我自己加完后,编译出错,你能看看哪错了吗
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit PWM=P1^0;
void delayms(uint x)//延时函数
{
uint K;
while(x--)for(K=0;K<125;K++);
}
unsigned char i,j;
for(i=200;i>0;i--)
{
PWM = 1; //舵机先转向-90度
delayms( 4 );//0.5MS
PWM = 0;
delayms( 129 );//19.5MS
}
for(j=100;j>0;j--)//
delayms( 16500 );//延时2.5MS
{
PWM = 1; //延时2.5s后 舵机转向0度
delayms( 10 );//1.5MS
PWM= 0 ;
delayms( 123 );//18.5MS
}
你的第二种方法的程序不是全的的吧,我自己加完后,编译出错,你能看看哪错了吗
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit PWM=P1^0;
void delayms(uint x)//延时函数
{
uint K;
while(x--)for(K=0;K<125;K++);
}
unsigned char i,j;
for(i=200;i>0;i--)
{
PWM = 1; //舵机先转向-90度
delayms( 4 );//0.5MS
PWM = 0;
delayms( 129 );//19.5MS
}
for(j=100;j>0;j--)//
delayms( 16500 );//延时2.5MS
{
PWM = 1; //延时2.5s后 舵机转向0度
delayms( 10 );//1.5MS
PWM= 0 ;
delayms( 123 );//18.5MS
}
好样的 正在学习舵机呢
谢谢小编啦啦啦啦啦啦啦啦啦啦啦
大神们 问一下
MG995舵机里的电位器的杆断了
是不是就是无法正常工作了
学习学习
强烈的关注一下哦,