51单片机的红外遥控小车设计和制作的C语言程序

 论文摘要:本文介绍一款红外线遥控小车,以AT89S51单片机为核心控制器,用L289驱动直流电机工作,控制小车的运行。本款小车具有红外线遥控手动驾驶、自动驾驶、寻迹前进等功能。本系统采用模块化设计,软件用C语言编写。转贴于 51论 文网 www.51lun-wen.cn  一、设计任务和要求  以AT98C51单片机为核心,制作一款红外遥控小车,小车具有自动驾驶,手动驾驶和循迹前进等功能。自动驾驶时,前进过程中可以避障。手动驾驶时,遥控控制小车前进、后退、左转、右转、加速等操作。寻迹前进时小车还可以按照预先设计好的轨迹前进。转贴于 51论 文网 www.51lun-wen.cn  二、系统组成及工作原理  本系统由硬件和软件两部分组成。硬件部分主要完成红外编码信号的发射和接受、障碍物检测、轨迹检测、直流电机运行的发生等功能。软件主要完成信号的检测和处理、设备的驱动及控制等功能。AT89S51单片机查询红外信号并解码,查询各个检测部分输入的信号,并进行相应处理,包括电机的正反转,判断是否遇到障碍物,判断是否小车其那金中有出轨等。系统结构框图如图1所示。转贴于 51论 文网 www.51lun-wen.cn图1 系统结构框图  三、主要硬件电路  1、遥控发射器电路  该电路的主要控制器件为遥控器芯片HT6221,如图2所示。HT6221将红外码调制成38KHZ的脉冲信号通过红外发射二极管发出红外编码。图2中D1是红外发射二极管,D2是按键指示灯,当有按键按下时D2点亮。

控器芯片HT6221,这个解码我刚研究过,是NEC协议,比较常用的,不过你要做小车我建议用PT2272/PT2262,他们接收发射与一体的,红外遥控可以帮你,不过其他的我就不会了。小车控制应该要用PWM电机控制吧。

急需基于51单片机的红外遥控开关的设计原理图和程序(c语言版)~

/*------------------------------------------------*/
#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit IR=P3^2; //红外接口标志

#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit DUAN=P2^6;//定义锁存使能端口 段锁存
sbit WEI=P2^7;// 位锁存
/*------------------------------------------------
全局变量声明
------------------------------------------------*/
unsigned char code dofly_DuanMa[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~F
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsigned char TempData[8]; //存储显示值的全局变量
unsigned char irtime;//红外用全局变量

bit irpro_ok,irok;
unsigned char IRcord[4];
unsigned char irdata[33];

/*------------------------------------------------
函数声明
------------------------------------------------*/

void Ir_work(void);
void Ircordpro(void);
/*------------------------------------------------
显示函数,用于动态扫描数码管
输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
如输入0表示从第一个显示。
Num表示需要显示的位数,如需要显示99两位数值则该值输入2
------------------------------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{
static unsigned char i=0;


DataPort=0; //清空数据,防止有交替重影
DUAN=1; //段锁存
DUAN=0;

DataPort=dofly_WeiMa[i+FirstBit]; //取位码
WEI=1; //位锁存
WEI=0;

DataPort=TempData[i]; //取显示数据,段码
DUAN=1; //段锁存
DUAN=0;

i++;
if(i==Num)
i=0;


}
/*------------------------------------------------
定时器0中断处理
------------------------------------------------*/

void tim0_isr (void) interrupt 1 using 1
{
irtime++; //用于计数2个下降沿之间的时间
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Timer1_isr(void) interrupt 3
{

TH1=(65536-2000)/256; //重新赋值 2ms
TL1=(65536-2000)%256;

Display(0,8); // 调用数码管扫描

}
/*------------------------------------------------
外部中断0中断处理
------------------------------------------------*/
void EX0_ISR (void) interrupt 0 //外部中断0服务函数
{
static unsigned char i; //接收红外信号处理
static bit startflag; //是否开始处理标志位

if(startflag)
{
if(irtime=33)//引导码 TC9012的头码,9ms+4.5ms
i=0;
irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
irtime=0;
i++;
if(i==33)
{
irok=1;
i=0;
}
}
else
{
irtime=0;
startflag=1;
}

}

/*------------------------------------------------
定时器0初始化
------------------------------------------------*/
void TIM0init(void)//定时器0初始化
{

TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
TH0=0x00; //重载值
TL0=0x00; //初始化值
ET0=1; //开中断
TR0=1;
}
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void Init_Timer1(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
//TH1=0x00; //给定初值
//TL1=0x00;
EA=1; //总中断打开
ET1=1; //定时器中断打开
TR1=1; //定时器开关打开
}
/*------------------------------------------------
外部中断0初始化
------------------------------------------------*/
void EX0init(void)
{
IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)
EX0 = 1; //使能外部中断
EA = 1; //开总中断
}
/*------------------------------------------------
键值处理
------------------------------------------------*/

void Ir_work(void)//红外键值散转程序
{

TempData[0]=dofly_DuanMa[IRcord[0]/16];
TempData[1]=dofly_DuanMa[IRcord[0]%16];
TempData[2]=dofly_DuanMa[IRcord[1]/16];
TempData[3]=dofly_DuanMa[IRcord[1]%16];
TempData[4]=dofly_DuanMa[IRcord[2]/16];
TempData[5]=dofly_DuanMa[IRcord[2]%16];
TempData[6]=dofly_DuanMa[IRcord[3]/16];
TempData[7]=dofly_DuanMa[IRcord[3]%16];
//Display(0,8); // 调用数码管扫描
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,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
value|=0x80;
if(j<8)
{
value>>=1;
}
k++;
}
IRcord[i]=value;
value=0;
}
irpro_ok=1;//处理完毕标志位置1
}

/*------------------------------------------------
主函数
------------------------------------------------*/
void main(void)
{
EX0init(); //初始化外部中断
TIM0init();//初始化定时器
Init_Timer1();

while(1)//主循环
{
if(irok) //如果接收好了进行红外处理
{
Ircordpro();
irok=0;
}

if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
{
Ir_work();
}
}
}

51P3^2是外部中断,红外接收管接这个引脚就能接收到数据然后显示在数码管上

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

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


#include
#include

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_();
}
}
}

#17788713913# 基于stc89c51单片机做一个遥控小车 同时配备的1602上显示'happy birthday' 4位数码管上显示'1215' - ******
#养戴# 硬件:STC89C51+1602+数码管+315M接收模块+315M遥控器 软件:按动遥控器上某键,此时主板接收到该控制信号,执行程序控制1602和数码管显示相应内部即可.

#17788713913# 单片机 关于红外线遥控小车. 帮我把这三幅图具体说明哈 过程. ******
#养戴# 第一幅图:一个电源,一个指示部分,一个红外信号输入部分,一个电机驱动部分. 第二幅图:一个按键部分. 第三幅图:一个电源,一个红外反射检测部分,一个指示部分,一个电机驱动部分.

#17788713913# 我想做一个避障的小车,用红外与51单片机,请教一下各位高手 ******
#养戴# 这个可以不用,接收那边用三极管进行信号放大和施密特整形,发射那边一直开着就行,只要这边接收到信号后就自动停车,然后在往别的方向走,这样就实现了避障.

#17788713913# 我要做一个基于51单片机的智能避障小车,而且要显示行走距离,要怎么做?要用到什么器件?什么原理? - ******
#养戴# 可以通过轮轴转圈数来计数(可以通过感应端口扫描实现),然后乘以轮胎的周长就是行走路程.至于避障可以通过红外实现.

#17788713913# 想做51单片机的红外避障智能小车,不知要做什么工作,有什么注意事项? - ******
#养戴# 红外收发、测距算法、电机控制算法.实现控制部分、传感部分、避障算法.流程是输入信息->处理信息->输出信息.基本就这些,如果不想从硬件做起,建议到淘宝买辆小车玩玩....

#17788713913# c51单片机应用和c语言程序设计中怎么写小车机器人红外探测避障 - ******
#养戴# 红外探测避障,可以利用红外发二极管与红外接收二极管,市面上也有组装在一起的对管.发射管发射红外线,收到障碍物阻挡反射回来,被接收管接收,不同的距离,接受管的都通率不同,因此可以检测接收管的导通率来确定障碍物的距离,单片机再控制小车避开障碍物

#17788713913# 想用单片机做个无线遥控红外避障小车需要什么 - ******
#养戴# 红外线探头,超声波测距等等,具体要看你需要什么样的功能,向哪个方向走是你控制的需求,并不是红外线探测器就有这个功能的,不明白可在+ 8464 7734 8

#17788713913# 用AT89C52单片机如何进行智能小车的操控 - ******
#养戴# 你这题太大了,哈!这样吧!你先把智能小车说清楚要做些什么,那你这问题才可就你这小车中的动做回答了,我这简单回你一点你现这小车上想做的事,这芯片大多能完成,如一片不够可上二片或多片,这功能不够还可换更强功能的.一直到你这小车达到你的要求为止.也就是说单片机和别的器件(行动,检测,......器件)一起就可更快的完成操作你这小车

#17788713913# 51单片机红外避障小车教程 - ******
#养戴# 你好,我以前参加过飞思卡尔智能小车竞赛,程序已经找不到了,但我可以给你一些建议.寻路或者避障,主要由光电和摄像头两种,如果你采用光电去做,你需要了解一写光电传感器,距离传感器的知识.如果你选择摄像头去做,你需要了解一些AD转换,图像处理的知识 C程序应该包括电机驱动,舵机驱动,当前传感器状态识别/当前图像处理等内容

#17788713913# 设计单片机小车 - ******
#养戴# 跟人走可以实现,至少我已经实现了,用到一个传感器,也就是人体热释红外传感器,专门检测人体发出的红外线,做成的模块可以调节灵敏度.另外一个传感器就是电子罗盘,装在小车上,小车就可以知道东西南北的方向和角度了.在小车上装一步进电机,步进电机带动检测模块做360°旋转,数步进电机的步数,就知道在那个角度检测到有人,通过步进电机、电子罗盘、热释红外就可以让小车往有人的方向跑,假如不想撞到人的话,就加超声波或者光电开关壁障即可.

  • 51单片机红外遥控控制小车?
  • 答:没有人把程序写出来就可以正常运行的,都是需要调试的。慢慢调试好就可以了。首先调试红外发送的数据,接收端是否能正常接收,例如可以先把红外解码做好。然后就是小车的驱动是否正常,即用固定的数据写进去,小车是否能按预期...

  • 51单片机红外遥控程序是什么?
  • 答:51单片机红外遥控程序是什么?  我来答 1个回答 #热议# 为什么孔子像会雕刻在美最高法院的门楣之上?信必鑫服务平台 2022-11-16 · TA获得超过5006个赞 知道顶级答主 回答量:28.6万 采纳率:100% 帮助的人:253万 我也...

  • 我无线电不懂,红外写过51单片机的收发程序,可我不会制作遥控器...
  • 答://NEC 编码红外遥控器解码程序 5 // // 2011-3-26 #include<stdio.h> #include<intrins.h> #include<reg51.h> #define TIMERH 0xed //宏定义定时器高位为237 #define TIMERL 0xed //宏定义定时器低位为237 ...

  • 51单片机做循迹小车的红外对管能识别的范围是多少,怎样安置红外对管之...
  • 答:车头放一排,7个左右。识别距离也就1-3cm吧,可以通过电流微调。1.5-2cm左右放一对红外对管

  • 跪求寻迹小车c程序, 用89c51单片机控制的 用tcrt5000红外反射式光电传感 ...
  • 答:ri1=P2^7;} void hhig(uint y)//前进函数 { pro=y;//变量y是改变小车速度这里范围是0--39 moto1=1;moto2=0;} void back(uint z)//后退函数 { pro=z;//改变z 可改变行驶速度 moto1=0;moto2=1;...

  • 单片机 智能小车 课程设计
  • 答:摘要:本课题组设计制作了一款具有智能判断功能的小车,功能强大。小车具有以下几个功能:自动避障功能;寻迹功能(按路面的黑色轨道行驶);趋光功能(寻找前方的点光源并行驶到位);检测路面所放置的铁片的个数的功能;计算并显示所走的路程和行...

  • 51单片机红外循迹小车属于闭环控制嘛
  • 答:51单片机红外循迹小车属于闭环控制。51单片机红外循迹小车用的直流电机,驱动电路。该设计用的是H桥驱动电路,再加上达林顿管,还有红外线。

  • 用51单片机制作学习型红外遥控器的原理
  • 答:用51单片机制作学习型红外遥控器的原理 主要是C程序方面很难写出来??发射模块的程序思路怎么写???最好有C程序addby2004的是一个接受时的解码的过程吧??假如我要的遥控器是自己做的而且是用51单片机根据按键的不同发射... 主要是...

  • 我自已有一辆遥控小车 我想用单片机做个红外线小车 我这车有用吗_百 ...
  • 答:这种可以用于很多品牌的遥控车被大量做成掩膜的控制电路了。虽说内部是单片机的可能性是有的,但是是一种裁剪的内核,一次烧写完成,不能更改,类似早年间可编程器件的熔丝工艺。掩膜的特点,在PCB板上被点了个大黑点。不能...

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

    为传递更多家电数码信息,若有事情请联系
    数码大全网