导航:首页 > 操作系统 > 单片机红外遥控电机

单片机红外遥控电机

发布时间:2022-07-13 05:51:26

㈠ 求基于51单片机的 红外遥控电机正反转程序 要求:P3.2接红外接收头 控制两个电机正反

这是一个红外解码程序,解码后加上switch(IRcord[2])语句,根据解码值不同,执行不同的电机动作
//使用12M晶振 适用于TC9012芯片,其他芯片请自行更改解码时序
//夏注:0.56ms脉冲加0.56ms空白为0 ,0.56ms脉冲加3*0.56ms=1.68ms空白为1
//即周期为1.125ms和2.25ms
//无校验用户码及其反码是否一致
//“1”和“0”的区分取决于脉冲之间的时间,称之为脉冲位置调制方式(PPM)
//发射端输出高电平时按图5的载波波形发送, 频率:38KHz;周期26.3us 占空比:1/3。
/*.编码方式 TC9012的一帧数据中含有32位码,包含两次8位用户码,
8 位数据码和8 位数据码的反码及 最后位的同步位。引导码由4.5ms的载波和4.5ms的载波关断波形所构成,以作为用户码、
数据码以及他们的反码的先导。同步位(SY)是标志最后一位编码是“0”或“1”的标识位,它只有0.56ms的有载波信号构成。*/
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
////////////////////////////////////////////////
sbit IR=P3^2;//红外接口标志
//unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
////////////////////////////////////////////
unsigned char irtime;//红外用全局变量
bit irpro_ok,irok;
unsigned char IRcord[4]; //一次发射有4个编码值,还是5个 应该是4个,但编号为0-3
unsigned char irdata[33];//一次发射其有33 位
//////////////////////////////////////////////
void Delay(unsigned char mS);
void Ir_work(void);
void Ircordpro(void);
//////////////////////////////////////////////////////////////////
void tim0_isr (void) interrupt 1 using 1
//定时器0中断服务函数.一次中断约256us(12M)
//11.0592 时为278us
{
irtime++;
}
///////////////////////////////////////////////////////////////////////
void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数
//有脉冲时输出为0,下降沿触发
{
static unsigned char i;
static bit startflag;
if(startflag)
{

// if(irtime<42&&irtime>=33)//引导码 TC9012的头码9ms,取8.45-10.75ms
if(irtime<39&&irtime>=30)//11.0592M引导码 TC9012的头码9ms,取8.45-10.75ms
i=0;

irdata[i]=irtime;//一次存储32位电平宽度
irtime=0;
i++;
if(i==33)
{
irok=1;
i=0;
}
}

else
{irtime=0;startflag=1;}
}
////////////////////////////////////////////////////////////////////
void TIM0init(void)//定时器0初始化
{
TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值,约256US
TH0=0x00;//reload value
TL0=0x00;//initial value
ET0=1;//开中断
TR0=1;
}
///////////////////////////////////////////////////////////////////
void EX0init(void)
{
IT0 = 1; // Configure interrupt 0 for falling edge(下降沿) on /INT0 (P3.2)
EX0 = 1; // Enable EX0 Interrupt
EA = 1;
}
/****************************************************************/
/******************************************************************/
void Ir_work(void)//红外键值散转程序
{
//Q=1;
switch(IRcord[2])
{
case 0x8:P0|=0XF0;P0&=0X9F;break;//先关闭第一个电机,再使其正转,第二个电机状态不变
case 0x28:P0|=0XF0;P0&=0X6F;break;;//先关闭第一个电机,再使其反转,第二个电机状态不变
case 0x22:P0|=0X0F;P0&=0XF9;break;
case 0x50:P0|=0X0F;P0&=0XF6;break;
}
irpro_ok=0;//处理完成标志

}
/*****************************************************************/
void Ircordpro(void)//红外码值处理函数
{
unsigned char i, j, k;
unsigned char cord,value;
k=1;
for(i=0;i<4;i++)//处理4个字节
{
for(j=1;j<=8;j++) //处理1个字节8位
{
cord=irdata[k];
// if(cord>7)//大于某值为1, 1.792mS
if(cord>6)//大于某值为1,11.0592M
{
value=value|0x80;
}
else
{
value=value;
}
if(j<8)
{
value=value>>1;
}
k++;
}
IRcord[i]=value;
value=0;
} irpro_ok=1;//处理完毕标志位置1

}

/////////////////////////////////////////////////////////////////
void main(void)
{
EX0init(); // Enable Global Interrupt Flag
TIM0init();//初始化定时器0

while(1)//主循环
{
if(irok) //收到9ms引导码
{
Ircordpro();//码值处理
irok=0;
}
if(irpro_ok)//step press key
{
Ir_work();//码值识别散转
}
}
}

㈡ 51单片机怎么用红外遥控小车

检查看电机是否影响了红外接收的供电

㈢ 红外遥控器控制单片机

这个问题你还是自己解决比较好,不要忘了你买单片机学习板的目的是学习,学习单片机是要多实践的,先试着自己写,实在写不出来的时候在发出来问下
这里给你点建议:
电机硬件驱动做成H型桥接电路比较简单。
遥控器如果不是自带的,请选用彩电的或是DVD、机顶盒的,不要选用空调的做解码,空调的编码是随模式的变化而变化的。

㈣ 单片机红外遥控控制步进电机快慢 正反转

#include <reg51.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int

sbit IRIN = P3^3; //红外接收器数据线
sbit BEEP=P0^5;

sbit ml1=P1^2;
sbit ml2=P1^3;
sbit mle=P1^4;

sbit mr1=P1^5;
sbit mr2=P1^6;
sbit mre=P1^7;

void delay(uchar x); //x*0.14MS

uchar IRCOM[7];
uchar count,cml,cmr,t108;

sbit LWE=P3^7;
uchar code LED7Code[]={ 0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F, // 9
0x77, // A
0x7C, // B
0x39, // C
0x5E, // D
0x79, // E
0x71 // F
};
void LED(uchar w,uchar s)
{
LWE=0;
P2=w;
P0=LED7Code[s];
LWE=1;
delay(5);
LWE=0;
delay(5);
}

void change()
{

switch(IRCOM[2])
{
/*
case 0x45:ml1=0;ml2=1;cml=100;break;
case 0x44:ml1=0;ml2=1;cml=60;break;
case 0x07:ml1=0;ml2=1;cml=30;break;
case 0x16:ml1=0;ml2=0;cml=0;break;
case 0x0c:ml1=1;ml2=0;cml=30;break;
case 0x08:ml1=1;ml2=0;cml=60;break;
case 0x42:ml1=1;ml2=0;cml=100;break;

case 0x47:mr1=0;mr2=1;cmr=100;break;
case 0x43:mr1=0;mr2=1;cmr=60;break;
case 0x09:mr1=0;mr2=1;cmr=30;break;
case 0x0d:mr1=0;mr2=0;cmr=0;break;
case 0x5e:mr1=1;mr2=0;cmr=30;break;
case 0x5a:mr1=1;mr2=0;cmr=60;break;
case 0x4a:mr1=1;mr2=0;cmr=100;break;
*/

case 0x0c:ml1=0;ml2=1;cml=10;
mr1=0;mr2=1;cmr=100;break;
case 0x18:ml1=0;ml2=1;cml=100;
mr1=0;mr2=1;cmr=100;break;
case 0x5e:ml1=0;ml2=1;cml=100;
mr1=0;mr2=1;cmr=10;break;
case 0x08:ml1=1;ml2=0;cml=90;
mr1=0;mr2=1;cmr=90;break;
case 0x5a:ml1=0;ml2=1;cml=90;
mr1=1;mr2=0;cmr=90;break;
case 0x42:ml1=1;ml2=0;cml=10;
mr1=1;mr2=0;cmr=100;break;
case 0x52:ml1=1;ml2=0;cml=100;
mr1=1;mr2=0;cmr=100;break;
case 0x4a:ml1=1;ml2=0;cml=100;
mr1=1;mr2=0;cmr=10;break;
default:break;
}

return;
}

main()
{

IE = 0x86;
TCON = 0x10;

TMOD = 0x02;
TH0 = 0x00;
TL0 = 0x38;

TR0 = 1;

IRIN=1;
BEEP=1;
count=0;
cml=0;
cmr=0;
mr1=0;
mr2=0;
ml1=0;
ml2=0;

t108=0;
delay(100);

while(1)
{

/*
for(t108=0;t108<10;t108++)
{LED(0,IRCOM[0]>>4);
LED(1,IRCOM[0]&0x0F);

LED(2,IRCOM[1]>>4);
LED(3,IRCOM[1]&0x0F);

LED(4,IRCOM[2]>>4);
LED(5,IRCOM[2]&0x0F);

LED(6,IRCOM[3]>>4);
LED(7,IRCOM[3]&0x0F);
}
*/

for(t108=0;t108<250;t108++)delay(4);

cml=0;
cmr=0;
mr1=0;
mr2=0;
ml1=0;
ml2=0;
BEEP=1;
}

}

void IR_IN() interrupt 2 using 0
{
unsigned char j,k,N=0;
delay(35);
if (IRIN==1)return;
while (!IRIN) {delay(1);}

BEEP=0;
N=0;
while (IRIN)
{delay(1);N++;
if(N>50)return;
}

if(N<20){
//2.25ms
t108=0;
while (!IRIN);
IRCOM[0]++;
return;
}

for (j=0;j<4;j++)
{
for (k=0;k<8;k++)
{
while (IRIN)
{delay(1);}
while (!IRIN)
{delay(1);}
while (IRIN)
{delay(1);
N++;
if (N>=30){return;}
}

IRCOM[j]=IRCOM[j] >> 1;
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
N=0;
}
}

if (IRCOM[2]!=~IRCOM[3]){return;}
t108=0;
change();
}

void delay(unsigned char x) //x*0.14MS
{
unsigned char a,b;
while(x--)
{
for(b=3;b>0;b--)
for(a=19;a>0;a--);
}
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0x38;
TL0 = 0x38;
count+=1;
if(count==100)
{count=0;
mle=1;
mre=1;
}

if(count==cml)mle=0;
if(count==cmr)mre=0;
}

我以前写的一个红外遥控小车的代码,PWM调速,PWM是用定时器产生的。

㈤ 单片机如何实现红外遥控

以下文件是51单片机实现遥控解码,通过数码管显示键码的程序,P0口驱动数码管段选,p2.6和p2.7为数码管位选,接收头连到P3.2口。此程序以通过验证,可以直接编译使用,另外还有一个继电器和蜂鸣器的控制,不用可以屏蔽掉。

;********************************************************************************
;* 描述: *
;* 遥控键值读取器 *
;* 数码管显示, P0口为数码管的数据口 *
;* *
;********************************************************************************
;遥控键值解码-数码管显示 *
;********************************************************************************/

#include <reg51.h>
#include <intrins.h>

void IR_SHOW();
void delay(unsigned char x);//x*0.14MS
void delay1(unsigned char ms);
void beep();

sbit IRIN = P3^2;
sbit BEEP = P3^7;
sbit RELAY= P1^3;
sbit GEWEI= P2^7;
sbit SHIWEI= P2^6;

unsigned char IRCOM[8];
unsigned char code table[16] =
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
main()
{
IE = 0x81; //允许总中断中断,使能 INT0 外部中断
TCON = 0x1; //触发方式为脉冲负边沿触发
delay(1);

IRIN=1;
BEEP=1;
RELAY=1;
for(;;)
{
IR_SHOW();
}

} //end main

void IR_IN() interrupt 0 using 0
{
unsigned char i,j,k,N=0;
EA = 0;
I1:
for (i=0;i<4;i++)
{
if (IRIN==0) break;
if (i==3) {EA =1;return;}
}
delay(20);
if (IRIN==1) goto I1; //确认IR信号出现
while (!IRIN) //等 IR 变为高电平
{delay(1);}

for (j=0;j<4;j++)
{
for (k=0;k<8;k++)
{
while (IRIN) //等 IR 变为低电平
{delay(1);}
while (!IRIN) //等 IR 变为高电平
{delay(1);}
while (IRIN) //计算IR高电平时长
{
delay(1);
N++;
if (N>=30) {EA=1;return;}
}
IRCOM[j]=IRCOM[j] >> 1;
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
N=0;
}//end for k
}//end for j

if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
IRCOM[5]=IRCOM[2] & 0x0F;
IRCOM[6]=IRCOM[2] & 0xF0;
IRCOM[6]=IRCOM[6] >> 4;
beep();
EA = 1;

}

void IR_SHOW()
{
P0 = table[IRCOM[5]];
GEWEI = 0;
SHIWEI = 1;
delay1(4);
P0 = table[IRCOM[6]];
SHIWEI = 0;
GEWEI = 1;
delay1(4);
}

void beep()
{
unsigned char i;
for (i=0;i<100;i++)
{
delay(5);
BEEP=!BEEP;
}
BEEP=1;
}

void delay(unsigned char x)//x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}

void delay1(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i<120; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}

㈥ 单片机红外线控制步进电机的方法

不知道你要怎么控制,估计只是做实验吧,你可以对红外遥控器的信号进行解码,每个按钮的编码都不同的,然后你自己去定义哪个按键是启动,哪个按键是加速、哪个按键是减速,哪个按键是停止,等等等等.....

㈦ 单片机的红外遥控的原理

1、发送端由单片机和红外发光二极管组成。
单片机控制红外发光二极管发射38KHz左右的红外光,这个红外光就可能起到传递信号的作用。你可以在你的程序中规定发射红外线时表示二进制的一个位‘1’无红外线时表示二进制的‘0’。这样你就可以发出一系列由‘1’和‘0’所级成的信号。
2、接收端是由红外接收二极管和单片机组成。
前面我们让发射端发出信号,现在接收头就开始收信号。

㈧ STC89C52单片机红外遥控电机问题

  1. 电机要看你是步进电机还是减速电机,正常减速电机用的多,我就和你说明下减速电机的用法,也稍稍提及下步进电机:

    减速电机:两个口,一个口接高电平,另一个口接低电平,就可以转了,要控制方向两个颠倒即可(所以正常这两个接单片机的IO口即可,还可以实现调速,下面说明),如果两个口都接低电平或高电平则不转(减速比大的减速电机可以实现伪自锁)

    步进电机:我拿步进电机28BYJ-48 为例子,他有4个信号线,这几个信号线要给一定的脉冲才会转,给相反的脉冲顺序就反转,转过的角度是一组脉冲的360/64(1:64减速比),如果想进一步知道请追问。

  2. 无论减速电机还是步进电机控制方向就利用PWM来进行调速,PWM的实现可以利用软件的延时函数如1ms的高电平,2ms的低电平来实现,也可以利用定时器精准实现,还可以利用单片机的特定模块FTM模块等来实现,根据具体问题是否需要高进度和单片机的实际情况决定。

    PS:要代码请再追问

㈨ 基于51单片机的红外遥控直流电机,电机转起来就停不住了咋回事

电池或摇控器坏了

㈩ 关于51单片机红外遥控器控制电机的转速问题

现在解决了吗,我现在也遇到差不多的问题,风速小的时候控制一切正常,风速大的时候红外遥控就不起作用了,怎么解决啊

阅读全文

与单片机红外遥控电机相关的资料

热点内容
腾讯云连接不上服务器 浏览:221
不能用来表示算法的是 浏览:859
6轴机器人算法 浏览:890
手机主题照片在哪个文件夹 浏览:294
安卓手机后期用什么软件调色 浏览:628
cad修改快捷键的命令 浏览:242
好钱包app怎么登录不了 浏览:859
树莓派都用python不用c 浏览:757
access文件夹树的构造 浏览:662
安卓多指操作怎么设置 浏览:658
linux树形目录 浏览:727
平方根的简单算法 浏览:898
千牛订单页面信息加密取消 浏览:558
单片机自制红外遥控灯 浏览:719
服务器最小配置怎么弄 浏览:853
ibm服务器硬件如何升级 浏览:923
全球程序员节点赞 浏览:986
php函数传递数组 浏览:632
人工峰群算法的目标函数 浏览:469
如何删加密文档 浏览:105