51单片机红外控制舵机
时间: 2023-12-06 17:36:33 浏览: 268
用51单片机舵机控制
4星 · 用户满意度95%
以下是基于51单片机的红外控制舵机的步骤和代码示例:
1. 首先,需要连接电路,将舵机与51单片机连接,并将红外接收器连接到单片机的P3.2口。
2. 接下来,需要编写程序。程序的主要功能是接收红外信号,并根据不同的信号控制舵机的转动角度。
```c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit IRIN=P3^2; //红外接收器连接的单片机口
uchar irtime=0; //用于计算红外信号的时间
uchar ircode[4]; //用于存储红外信号的数组
uchar irflag=0; //用于标记是否接收到红外信号
//延时函数
void delay(uint i)
{
while(i--);
}
//红外接收函数
void ir_receive()
{
uchar j,k;
irtime=0;
while(IRIN)
{
irtime++;
delay(1);
if(irtime>30) //如果超过30ms没有信号,说明信号结束
{
irtime=0;
irflag=0;
return;
}
}
if(irtime<8) //如果信号小于8ms,说明是噪声,不处理
{
irtime=0;
return;
}
for(j=0;j<4;j++) //接收4个字节的信号
{
for(k=0;k<8;k++)
{
irtime=0;
while(!IRIN)
{
irtime++;
delay(1);
if(irtime>30) //如果超过30ms没有信号,说明信号结束
{
irtime=0;
irflag=0;
return;
}
}
if(irtime<4) //如果信号小于4ms,说明是噪声,不处理
{
irtime=0;
return;
}
irtime=0;
while(IRIN)
{
irtime++;
delay(1);
if(irtime>30) //如果超过30ms没有信号,说明信号结束
{
irtime=0;
irflag=0;
return;
}
}
if(irtime<4) //如果信号小于4ms,说明是噪声,不处理
{
irtime=0;
return;
}
if(irtime>10) //如果信号大于10ms,说明是1,否则是0
{
ircode[j]|=1<<(7-k);
}
}
}
irflag=1; //标记接收到信号
}
//舵机控制函数
void servo_control(uchar angle)
{
uint i;
for(i=0;i<20000;i++) //延时等待舵机归位
{
P1=0x00;
}
for(i=0;i<angle*10;i++) //计算延时时间,控制舵机转动到指定角度
{
P1=0x01;
delay(1);
P1=0x00;
delay(19);
}
}
//主函数
void main()
{
while(1)
{
ir_receive(); //接收红外信号
if(irflag) //如果接收到信号
{
switch(ircode[2]) //根据不同的信号控制舵机转动
{
case 0x18: servo_control(0); break; //按键1,控制舵机转动到0度
case 0x08: servo_control(45); break; //按键2,控制舵机转动到45度
case 0x1C: servo_control(90); break; //按键3,控制舵机转动到90度
case 0x5A: servo_control(135); break; //按键4,控制舵机转动到135度
case 0x42: servo_control(180); break; //按键5,控制舵机转动到180度
}
irflag=0; //清除标记
}
}
}
```
以上就是基于51单片机的红外控制舵机的步骤和代码示例。
阅读全文