
自制遥控器来控制电机,理论上可行,但制作比较繁琐。
1、购买元件
自制需要用到一些元件,比如红外发射头、红外接收头、晶振、三极管等。
2、设计线路板
元件需要焊接在线路板上,线路板上的走线、元件位置如何安排等等都要设计妥当。
3、编写程序
控制线路的通断需要使用单片机,因此需要编写简单的控制程序,并将程序烧录进单片机。
论文摘要:本文介绍一款红外线遥控小车,以AT89S51单片机为核心控制器,用L289驱动直流电机工作,控制小车的运行。本款小车具有红外线遥控手动驾驶、自动驾驶、寻迹前进等功能。本系统采用模块化设计,软件用C语言编写。转贴于 51论 文网 >
用sprintf函数啊,把数字“打印”到一个数组里,然后用LCD-showstring来显示就可以了。
char buf[30];
sprintf(buf,"Frequency=%dHz",Frequency);
给你一个我编的红外解码的程序,这个程序会将接收到的红外编码中的8位码通过串口发送到上位机,你可以通过串口调试助手来看看,程序是正确的,希望对你有参考价值。 ////////////////////////////////////////////////////////////////// //////////////////////////yorkWorldDream///////////////////////// ///////////////////////////////////////////////////////////////// #include"reg52h" #define uchar unsigned char #define uint unsigned int //tc9012 uchar flag=0;//是否接到起始位标志 未接到为0 接到为1 uchar traflag=0;//翻译是否完成标记 完成为1 uchar rec[33];//接收遥控器发送的所有数据 用来记录两个下降沿之间的时间 uchar recok=0;//是否接收完一帧数据标记 接收完为1 uchar sendok=0;//是否发送完毕标记 发送完成为1 uchar num=0;//变相记录时间 uchar n=0;//rec[]中的数组定位 void timerinit();//定时器0初始化 void ruptinit();//外部中断0初始化 void tradata();//一帧数据的翻译 即把时间记录转换成0/1 void send();//把收到的数据发给上位机 void delay(); //////////////////////////定时器 中断初始化///////////////////////////////// void timerinit()//定时器0 { TMOD=0x02;//定时器0使用方式2 TH0=0x00; TL0=0x00; EA=1; ET0=1;//定时器中断开 TR0=1;//计时开 } void ruptinit()//外部中断0 { EA=1; EX0=1;//外部中断开 IT0=1;//下降沿触发 0是电平触发 } ////////////////////////////定时器 中断函数////////////////////////////// void timer() interrupt 1 //系统从0x00记到0xff 每记一次时间大概为1us 记256次 即256us中断一次 { num++;//num记录的是256us的个数 总时间=num256us } void rupt() interrupt 0 //外部中断0 当遇到下降沿时触发 { if(flag==1)//flag为1 说明收到了起始位 接下来要开始进行记录了 { if(num>32)//时间为32256us=82ms是整个起始位的时间 { n=0; } rec[n]=num;//记录两个下降沿之间的num值 这样也就相当于记录了其间的时间 num=0; n++; if(n==33)//因为前面是n++ 所以当n=33时 数组已经从0记到了32 已经记满了 { recok=1;//标记 接收一帧数据完成 n=0; } } else//首次得到下降沿到达这里 使flag变1 用来说明收到了起始位 { flag=1; } } /////////////////////////////时间翻译函数/////////////////////////////////////// void tradata()//一帧数据的翻译 即把时间记录转换成0/1 { uchar i; for(i=1;i/0的数据时间是num=44 1的数据时间是num=88 { //记住要从rec[1]开始 因为rec[0]记录的是引导码的num值 if(rec[i]>6)//使用6做中间值 小于则为0 大于为1 用0/1替换rec中的数据 这样就进行了翻译 { rec[i]='1'; }//因为要以字符串发送 所以这里用字符形式 else rec[i]='0'; } traflag=1;//翻译完成标记 } /////////////////////////////发送数据函数//////////////////////////////////// void send()//把收到的数据发送给上位机 具体细节不懂看串口通信 mcu to pc { uchar i; TMOD=0x20; TH1=0xfd; TL1=0xfd; TR1=1; SM0=0; SM1=1; REN=1; for(i=25;i/选择要发送出去的数据 这里是从25开始发送的 { SBUF=rec[i]; while(!TI); TI=0; } sendok=1; } //////////////////////////////////////////////////////////////////////// void delay()//1ms { unsigned char a,b,c; for(c=1;c>0;c--) for(b=142;b>0;b--) for(a=2;a>0;a--); } void main() { timerinit();//定时器0初始化 ruptinit();//外部中断0初始化 while(1) { if(recok==1)//接收一帧数据完成 { P1=0xfe;//灯亮一下 为了指示是否收到了数据 tradata();//翻译数据 } delay(); if(traflag==1)//翻译完成 { send();//发送 } delay(); if(sendok==1)//发送完成 { flag=0; traflag=0; recok=0; sendok=0; P1=0xff; timerinit(); ruptinit(); } //全部恢复初始 }
遥控器是一种用来远控机械的装置。现代的遥控器,主要是由集成电路电板和用来产生不同讯息的按钮所组成。而客车门遥控器是采用最新技术编码解码,以闪断方式控制门泵电磁阀以达到开关自动门的目的。 很多电器都采用红外遥控,那么红外遥控的工作原理是什么呢首先我们来看看什么是红外线。 人的眼睛能看到的可见光按波长从长到短排列,依次为红、橙、黄、绿、青、蓝、紫。其中红光的波长范围为062~076μm;紫光的波长范围为038~046μm。比紫光波长还短的光叫紫外线,比红光波长还长的光叫红外线。 红外线遥控就是利用波长为076~15μm之间的近红外线来传送控制信号的。 、 常用的红外遥控系统一般分发射和接收两个部分。 发射部分的主要元件为红外发光二极管。它实际上是一只特殊的发光二极管,由于其内部材料不同于普通发光二极管,因而在其两端施加一定电压时,它便发出的是红外线而不是可见光。 目前大量使用的红外发光二极管发出的红外线波长为940nm左右,外形与普通 5发光二极管相同,只是颜色不同。 红外发光二极管一般有黑色、深蓝、透明三种颜色。 判断红外发光二极管好坏的办法与判断普通二极管一样:用万用表电阻挡量一下红外发光二极管的正、反向电阻即可。 红外发光二极管的发光效率要用专门的仪器才能精确测定,而业余条件下只能用拉距法来粗略判定。 接收部分的红外接收管是一种光敏二极管。 在实际应用中要给红外接收二极管加反向偏压,它才能正常工作,亦即红外接收二极管在电路中应用时是反向运用,这样才能获得较高的灵敏度。 红外接收二极管一般有圆形和方形两种。 由于红外发光二极管的发射功率一般都较小(100mW左右),所以红外接收二极管接收到的信号比较微弱,因此就要增加高增益放大电路。 前些年常用μPC1373H、CX20106A等红外接收专用放大电路。最近几年不论是业余制作还是正式产品,大多都采用成品红外接收头。 成品红外接收头的封装大致有两种:一种采用铁皮屏蔽;一种是塑料封装。均有三只引脚,即电源正(VDD)、电源负(GND)和数据输出(VO或OUT)。红外接收头的引脚排列因型号不同而不尽相同,可参考厂家的使用说明。成品红外接收头的优点是不需要复杂的调试和外壳屏蔽,使用起来如同一只三极管,非常方便。但在使用时注意成品红外接收头的载波频率。 红外遥控常用的载波频率为38kHz,这是由发射端所使用的455kHz陶振来决定的。 在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈379 kHz≈38kHz。也有一些遥控系统采用36kHz、40kHz、56kHz等,一般由发射端晶振的振荡频率来决定。 红外遥控的特点是不影响周边环境、不干扰其它电器设备。由于其无法穿透墙壁,故不同房间的家用电器可使用通用的遥控器而不会产生相互干扰;电路调试简单,只要按给定电路连接无误,一般不需任何调试即可投入工作;编解码容易,可进行多路遥控。 由于各生产厂家生产了大量红外遥控专用集成电路,需要时按图索骥即可。因此,现在红外遥控在家用电器、室内近距离(小于10米)遥控中得到了广泛的应用。 多路控制的红外遥控系统 多路控制的红外发射部分一般有许多按键,代表不同的控制功能。当发射端按下某一按键时,相应地在接收端有不同的输出状态。 接收端的输出状态大致可分为脉冲、电平、自锁、互锁、数据五种形式。“脉冲”输出是当按发射端按键时,接收端对应输出端输出一个“有效脉冲”,宽度一般在100ms左右。“电平”输出是指发射端按下键时,接收端对应输出端输出“有效电平”,发射端松开键时,接收端“有效电平”消失。此处的“有效脉冲”和“有效电平”,可能是高、也可能是低,取决于相应输出脚的静态状况,如静态时为低,则“高”为有效;如静态时为高,则“低”为有效。大多数情况下“高”为有效。“自锁”输出是指发射端每按一次某一个键,接收端对应输出端改变一次状态,即原来为高电平变为低电平,原来为低电平变为高电平。此种输出适合用作电源开关、静音控制等。有时亦称这种输出形式为“反相”。“互锁”输出是指多个输出互相清除,在同一时间内只有一个输出有效。电视机的选台就属此种情况,其它如调光、调速、音响的输入选择等。 “数据”输出是指把一些发射键编上号码,利用接收端的几个输出形成一个二进制数,来代表不同的按键输入。 一般情况下,接收端除了几位数据输出外,还应有一位“数据有效”输出端,以便后级适时地来取数据。这种输出形式一般用于与单片机或微机接口。 除以上输出形式外,还有“锁存”和“暂存”两种形式。所谓“锁存”输出是指对发射端每次发的信号,接收端对应输出予以“储存”,直至收到新的信号为止;“暂存”输出与上述介绍的“电平”输出类似。用 AT89S52 自制电视红外遥控器红外遥控器发送数据时,是将二进制数据调制成一系列的脉冲信号红外发射管发射出去,红外载波为频率 38KHz 的方波,红外接收端在收到 38KHz 的载波信号时,会输出低电平,否则输出高电平,从而可以将"时断时续"的红外光信 号解调成一定周期的连续方波信号,再经过 1838 一体化红外接收头解调便可以恢复出原数据信号如图 1 所示 图1 红外接收头解调过程如图 2 所示 图2 解调后的"0"和"1"波形及单片机编码图 3 图 4 所示 图3 38K 方波 图 4 了解了红外接收头解调及遥控编码下面就可以对照图 5 编写编码程序了, 5 是遥控按键 1 的一段实际编码 图由 9ms 低电平 45ms 高电平的启始码,26 位系统码,及 8 位数据码,8 位数据反码,23ms 高电平及结束码组成 电路图 以下是遥控完整程序 / 项目: 自制红外电视遥控器(EE01 学习板演示程序) 作者:一线工人 网站:电子工程师之家 米之外也可以控制,为了拍摄方便才放这么近 视频演示: >
#include <reg52h>
#define uchar unsigned char
#define uint unsigned int
sbit IN1=P1^0;
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;
sbit key1=P2^0;
sbit key2=P2^1;
sbit key3=P2^2;
void delay(uint n)
{ uint x,y;
for(x=n;x>0;x--)
for(y=110;y>0;y--);
}
void forward()
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
void reverse()
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
}
void left()
{
IN1=0;
IN2=0;
IN3=1;
IN4=0;
}
void right()
{
IN1=1;
IN2=0;
IN3=0;
IN4=0;
}
void stop()
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
void RSINTR() interrupt 4
{
if(RI==1)
{
RI=0;
if(SBUF=='A')
reverse();
else if(SBUF=='B')
forward();
else if(SBUF=='C')
left();
else if(SBUF=='D')
right();
else if(SBUF=='E')
stop();
}
}
main()
{
SCON=0x50;//允许串口接收
TMOD=0x20;
PCON=0x80;
TH1=0xfd;
TL1=0xfd;
RI=0;
TR1=1;
EA=1;
ES=1;
while(1)
{
}
}
#include<reg52h>
#include<intrinsh>
#define uchar unsigned char
#define uint unsigned int
sbit lcden = P2^7;
sbit lcdrs = P2^6;
sbit lcdwr = P2^5;
sbit IR = P3^2;
uchar IRCOM[6];//数组,用于存储红外编码
uchar code table1[] = "remote control";
uchar code table2[] = "CODE:";
void delayms(uchar x)// 延时x014ms
{
uchar i;
while(x--)
for(i=0;i<13;i++){}
}
void delay(uchar x) //延时xms
{
uchar i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
/LCD部分/
void write_com(uchar com)
{
lcden = 0;
lcdrs = 0;
lcdwr = 0;
P0 = com;
delay(5);
lcden = 1;
delay(5);
lcden = 0; //别忘了lcden拉低
}
void write_date(uchar date)
{
lcden = 0;
lcdrs = 1;
lcdwr = 0;
P0 = date;
delay(5);
lcden = 1;
delay(5);
lcden = 0;
}
void lcd_init(void)
{
lcden = 0;
lcdrs = 0;
lcdwr = 0;
delay(5);
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
/main()/
void main(void)
{
uchar count=0;
IR = 1;
lcd_init();
write_com(0x80);
while(table1[count]!='\0')
{
write_date(table1[count]);
count++;
delay(5);
}
count = 0;
write_com(0x80+0x40);
while(table2[count]!='\0')
{
write_date(table2[count]);
count++;
delay(5);
}
IE = 0x81; //开中断
TCON = 0x01;//脉冲负边沿触发
while(1);
}
/红外中断/
void IR_time() interrupt 0
{
uchar i,j,TimeNum=0;//TimeNum用来计IR高电平次数 从而判断是0还是1
EX0 = 0; //关闭中断
delayms(5);
if(1 == IR)
{
EX0 = 1;
return;
}
while(!IR) //跳过9ms前导低电平
delayms(1);
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
while(IR) //跳过45ms的前导高电平
delayms(1);
while(!IR) //跳过056ms的低电平
delayms(1);
while(IR)
{
TimeNum++; //计时高电平时间从而判断读取的是0还是1
delayms(1);
}
if(TimeNum>=30)//按键按下时间过长 跳过
{
EX0 = 1;
return;
}
IRCOM[i] = IRCOM[i]>>1;
if(TimeNum >= 8) //8014ms 这时读取的是1;
{
IRCOM[i] = IRCOM[i]|0x80;
}
TimeNum = 0;
}
}
if(IRCOM[2]!=~IRCOM[3])//判断八位数据和八位数据反码是否相等
{
EX0 = 1;
return;
}
IRCOM[4] = IRCOM[2]&0x0f;//取低四位
IRCOM[5] = IRCOM[2]>>4; //IRCOM[5]取IRCOM[2]高四位
if(IRCOM[4] > 9) //转换成字符
{
IRCOM[4] = IRCOM[4] + 0x37;
}
else
IRCOM[4] = IRCOM[4] + 0x30;
if(IRCOM[5] > 9)
{
IRCOM[5] = IRCOM[5] + 0x37;
}
else
IRCOM[5] = IRCOM[5] + 0x30;
delay(5);
write_com(0x80 + 0x40 + 5);
write_date(IRCOM[5]);
write_date(IRCOM[4]);
EX0 = 1; //重新开启外部中断
}
题主是否想询问“arduino遥控跳出动态动画怎么办”?具体处理方法如下。
1、连接硬件:将Arduino连接到计算机,并连接遥控模块和LED灯带模块到Arduino。确保硬件连接正确。
2、编写程序:使用Arduino编程语言编写程序,通过读取遥控器输入的信号,控制LED灯带呈现不同的动态动画效果。使用Arduino的IRremote库来读取遥控器输入的信号,并使用FastLED库控制LED灯带的亮度和颜色。
3、上传程序:将程序上传到Arduino板子上即可。
以上就是关于如何自制遥控器来控制电机全部的内容,包括:如何自制遥控器来控制电机、51单片机的红外遥控小车设计和制作的C语言程序、如何编写程序让红外遥控器在stm32的lcd显示键值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)