控器芯片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°旋转,数步进电机的步数,就知道在那个角度检测到有人,通过步进电机、电子罗盘、热释红外就可以让小车往有人的方向跑,假如不想撞到人的话,就加超声波或者光电开关壁障即可.