51单片机红外解码程序
- 格式:pdf
- 大小:1.59 MB
- 文档页数:6
51单片机红外遥控解码程序类别:单片机/DSP 阅读:2975编者按:以下是网友编写的遥控解码程序!一种用延时等待的解码方法,比较容易理解,但缺点是占用CPU运行时间,第二种方法用定时器和外中断的解码方法,初学不易理解,但优点也很明显,第二种方法如果能解决连发解码就比较完美,更完善的红外遥控解码程序,请参考本站TOPA V-2008,TOP51-2005所配程序。
解码方法一;//单片机接收红外解读程序\\;硬件结构:8951,P0口数码管段码,P2.0-P2.3为位,P1为8个LED;P3.2为红外接收头,P2.7蜂鸣器,晶振12M;适用UPD6121 6122芯片接收;---------------------------------------------------------ORG 0000HAJMP MAIN ;转入主程序ORG 0003H ;外部中断P3.2脚INT0入口地址AJMP INT ;转入外部中断服务子程序(解码程序);以下为主程序进行CPU中断方式设置MAIN: SETB EA ;打开CPU总中断请求SETB IT0 ;设定INT0的触发方式为脉冲下降沿触发SETB EX0 ;打开INT0中断请求AJMP $;以下为进入P3.2脚外部中断子程序,也就是解码程序INT: CLR EA ;暂时关闭CPU的所有中断请求MOV R6,#10SB: ACALL YS1 ;调用882微秒延时子程序JB P3.2,EXIT ;延时882微秒后判断P3.2脚是否出现高; 电平如果有就退出解码程序DJNZ R6, SB ;重复10次,目的是检测在8820微秒内;如果出现高电平就退出解码程序;以上完成对遥控信号的9000微秒的初始低电平信号的识别。
JNB P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲ACALL YS2 ;延时4.74毫秒避开4.5毫秒的结果码MOV R1,#1AH ;设定1AH为起始RAM区MOV R2,#4;PP: MOV R3,#8JJJJ: JNB P3.2,$ ;等待地址码第一位的高电平信号LCALL YS1 ;高电平开始后用882微秒的时间尺去判断信;号此时的高低电平状态MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中JNC UUU ;如果为0就跳转到UUULCALL YS3;UUU: MOV A,@R1 ;将R1中地址的给ARRC A ;将C中的值0或1移入A中的最低位MOV @R1,A ;将A中的数暂时存放在R1中DJNZ R3,JJJJ ;接收地址码的高8位INC R1 ;对R1中的值加1,换下一个RAMDJNZ R2,PP ;接收完16位地址码和8位数据码和8位数据反; 码,存放在1AH/1BH/1CH/1DH的RAM中MOV A,1CH ;比较数据码和数据反码是否正确?CPL AXRL A,1DH ;将1CH的值取反后和1DH比较不同则无效丢弃,核对数据是否准确JNZ EXITMOV DPTR,#TAB ;表头地址送指针MOV A,1DHANL A,#0FH ;相与,得到低四位码MOVC A,@A+DPTRMOV 1EH,A ;查表得表码存入1EHMOV A,1DHSWAP AANL A,#0FHMOVC A,@A+DPTRMOV 1FH,A ;查表得高四位码存入1FMOV R7,#20HDISP:MOV P0,1FH ;送数码管显示CLR P2.1ACALL YS2SETB P2.1MOV P0,1EHCLR P2.2ACALL YS2SETB P2.2MOV P1,1DH ;将按键的键值通过P1口的8个LED显示出来!CLR P2.7 ;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功LCALL YS2SETB P2.7 ;蜂鸣器停止DJNZ R7,DISPEXIT: SETB EA ;允许中断RETI ;退出解码子程序YS1: MOV R4,#20 ;延时子程序1,精确延时882微秒D1: MOV R5,#20DJNZ R5,$DJNZ R4,D1RETYS2: MOV R4,#10 ;延时子程序2,精确延时4740微秒D2: MOV R5,#235DJNZ R5,$DJNZ R4,D2RETYS3: MOV R4,#2 ;延时程序3,精确延时1000微秒D3:MOV R5,#248DJNZ R5,$DJNZ R4,D3RETTAB: DB 0C0H,0DEH,0A2H,8AH,9CH,89H,81H,0DAH,80H,88H,90H,85H,0E1H,86H,0A1H,0B1H;数据表,0-9-A-FEND解码方法二你的解码程序和我现在用的解码程序大体是一样的,我自己实际做了一下,发现按下遥控器,接收到红外信号后,数码管闪的厉害。
1模块详细设计结果描述1.1基本原理REMOTE模块是针对NEC标准的遥控发射信号设计的。
共占用MCU两个资源:INT0和TIMER0。
通过INT0接收遥控信号,侦测脉冲信号的起止点。
通过TIMER0计算脉冲信号的时间长度。
根据时间的长短可识别出各种码值,从而可判断出是否是电磁干扰,或码值是否有效。
1.2扇出无。
1.3硬件接口请查阅“TOP LOAD SYSTEM MCU BOARD REV:01” 的原理图。
2源程序清单2.1源程序:下面所列为REMOTE模块的程序清单,(文件名:REMOTE.ASM)$INCLUDE(REMOTE.INC)CSEG AT EX_ADDR ;ADDR=03H FOR EXTERN INTERUPTER 0;ADDR=13H FOR EXTERN INTERUPTER 1LJMP EX_SERVERCSEG AT ET_ADDR ;ADDR=0BH FOR TIMER0 INTERUPTER;ADDR=1BH FOR TIMER1 INTERUPTERLJMP ET_SERVER;;;************************************************************************;;;* NAME: REMOTE_INIT *;;;* PURPOSE: Initial the Remote peripheral-INT0,TIMER1 *;;;* FUNCTION: Be called when system reset *;;;* OUTPUT: ET0,EX0,IT0,TMOD,REMMODE,REMCONT,REMV ALID,RPTV ALID *;;;* RAM:ACC,DPTR,TEMPDATA,LOWCONT *;;;* Excuting: Be called After main(){ *;;;*C-Declare: void REMOTE_INIT(void); *;;;************************************************************************RSEG ?PR?REMOTE?REMOTE INBLOCKREMOTE_INIT:SETB ET_ENABLE ;T0 enableSETB EX_ENABLE ;INT0 OR INT1 enableSETB EX_TRIG ;INT0 OR INT1MOV A,TMOD ;Set T0ANL A,#TMOD_MOD1ORL A,#TMOD_MOD2MOV TMOD,AMOV REMMODE,#0HMOV REMCONT,#0HCLR REMV ALIDCLR REMTEMPCLR RPTVALIDRET;;;************************************************************************ ;;;* NAME: EX_SERVER * ;;;* PURPOSE: Analyse and calculate remote wave,get the valid wave. * ;;;* FUNCTION: wil be called When rmeote wave is received. * ;;;* return REMMDOE,REMCONT * ;;;* SCOPE:NONE. * ;;;* INPUT:REMMODE,REMCONT,REMV ALID,RPTV ALID * ;;;* OUTPUT:REMMODE,REMCONT * ;;;* RAM:ACC,DPTR,TEMPDATA,LOWCONT * ;;;* Time(MAX): 80T+100us * ;;;* Excuting: Be called in INT0 interrupt * ;;;* Ref.Flowchart: REMOTE.wmf * ;;;************************************************************************ RSEG ?PR?REMOTE?REMOTE INBLOCKEX_SERVER:PUSH ACCPUSH DPHPUSH DPLPUSH PSWJB POWER_EN,SERVER1JB EX_TRIG,SERVER1SETB EX_TRIGLJMP EX_RSETALLSERVER1:MOV A,#DELAY100USDELAY_LOOP:DEC AJNZ DELAY_LOOPMOV DPTR,#MODETABMOV A,REMMODESUBB A,#9HJNC EX_RSETMOV A,REMMODERL AJMP @A+DPTRMODETAB:AJMP CODEMODE0AJMP CODEMODE1AJMP CODEMODE2AJMP CODEMODE3NOPNOPNOPNOPAJMP EX_RSETALLNOPNOPCODEMODE0:JB REM_RECEIVE,EX_RSETCLR TI_CTRLMOV TCON_HIGH,#PT1200_HIGH1MOV TCON_LOW,#PT1200_LOW1SETB TI_CTRL ;Start T0 1.72ms timer.MOV TEMPDATA,#80HAJMP EX_RSETCODEMODE1:JB REM_RECEIVE,EX_RSETAJMP EX_RTNCODEMODE2:JB REM_RECEIVE,EX_RTNCLR TI_CTRLMOV A,TCON_HIGHCLR CSUBB A,#R4500_lOWJC CHK_REPEA TSUBB A,#RANGE4500JNC EX_RSETALLMOV TCON_HIGH,#0H ;Timer=4.5ms,the leader code validMOV TCON_LOW,#R1125_PRESETB TI_CTRL ;Start timer.MOV REMMODE,#3H ;turn to mode3AJMP EX_RTNCHK_REPEA T:MOV A,TCON_HIGHCLR CSUBB A,#R2250_lOW1JC EX_RSETALLSUBB A,#RANGE2250JNC EX_RSETALLJB REMTEMP,SET_MODE5 ;Timer=2.25msJNB RPTVALID,EX_RSETSET_MODE5:MOV TCON_HIGH,#PT1200_HIGH ;The repeat leader code validMOV TCON_LOW,#PT1200_LOWSETB TI_CTRL ;Start 1.125ms timerMOV REMMODE,#5H ;turn to mode5AJMP EX_RTNEX_RSETALL:CLR REMV ALIDCLR REMTEMPCLR RPTVALIDEX_RSET:MOV REMMODE,#0HMOV REMCONT,#0HEX_RTN:POP PSWPOP DPLPOP DPHPOP ACCRETICODEMODE3:JB REM_RECEIVE,EX_RSETCLR TI_CTRLMOV A,TCON_HIGHMOV TCON_HIGH,#0HMOV TCON_LOW,#R1125_PRESETB TI_CTRLCJNE A,#R1125_HIGH,MOD3_LPWR ;TCON_HIGH=0,跳转DATA_CHK,检查TCON_LOW。
51单片机红外遥控格力空调程序#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit key1=P3^4;//按键控制开机sbit key2=P3^5;//按键控制关机sbit key3=P3^6;//按键控制温度+sbit key4=P3^7;//按键控制温度-sbit out=P1^5;//发送IO口uchar wd1[15]={0x00,0x08,0x04,0x0c,0x02,0x0a,0x06,0x0e,0x01,0x09,0x05,0x0d,0x03,0x0b,0x07};uchar wd2[15]={0x0a,0x06,0x0e,0x01,0x09,0x05,0x0d,0x03,0x0b,0x07,0x0f,0x00,0x08,0x04,0x0c};uchar x=12;//开机28度/************晶振11.0592MHz**************/ void delay(uint xms){uint i,j;for(i=xms;i>0;i--) //i=xms即延时约xms毫秒for(j=112;j>0;j--);}void delay560us(void) //560us延迟函数{uint j;for(j=63;j>0;j--);}void delay4500us(void) //4.5ms延迟函数{uint j;for(j=516;j>0;j--);}void khz_2(uint num) //38KHZ脉冲占空比1:2{for(;num>0;num--){out=~out;}}void send0_a(void) //发送0{khz_2(42) ;//khz_3(21) ;out=1;delay560us();}void send1_a(void) //发送1 {khz_2(42) ;out=1;delay560us();delay560us();delay560us();}void leadcode_a(void) //发送引导码{khz_2(690) ;out=1;delay4500us();}/***************************关机****************************/void close( uchar a,uchar b,uchar c,uchar d) {uint i;leadcode_a();send1_a();for(i=0;i<7;i++)send0_a();if(a)send1_a();elsesend0_a();if(b)send1_a();elsesend0_a();if(c)send1_a();elsesend0_a();if(d)send1_a();elsesend0_a();send0_a();send0_a();send0_a();for(i=0;i<5;i++)send0_a();send1_a();for(i=0;i<6;i++)send0_a();send1_a();send0_a();send1_a();send0_a();send0_a();send1_a();send0_a();khz_2(42) ;out=1;delay(20);}void close1(uchar e,uchar f,uchar g,uchar h ) {uchar i;for(i=0;i<13;i++)send1_a();send0_a();send0_a();for(i=0;i<12;i++)send0_a();if(e)send1_a();elsesend0_a();if(f)send1_a();elsesend0_a();if(g)send1_a();elsesend0_a();if(h)send0_a();elsesend1_a();khz_2(42) ;out=1;delay(1000);/*******************************************//****************开机************************/}void open(uchar a,uchar b,uchar c,uchar d ){uint i;leadcode_a();send1_a();send0_a();send0_a();send1_a();for(i=0;i<4;i++)send0_a();if(a)send1_a();elsesend0_a();if(b)send1_a();elsesend0_a();if(c)send1_a();elsesend0_a();if(d)send1_a();elsesend0_a();send0_a();send0_a();send0_a();send0_a();for(i=0;i<5;i++)send0_a();send1_a();for(i=0;i<6;i++)send0_a();send1_a();send0_a();send1_a();send0_a();send0_a();send1_a();send0_a();khz_2(42) ;out=1;delay(20);}void open1(uchar e,uchar f,uchar g,uchar h) {uchar i;for(i=0;i<13;i++)send0_a();send1_a();send0_a();send0_a();for(i=0;i<12;i++)send0_a();if(e)send1_a();elsesend0_a();if(f)send1_a();elsesend0_a();if(g)send1_a();elsesend0_a();if(h)send1_a();elsesend0_a();khz_2(42) ;out=1;delay(1000);}void keyscan(){uchar a,b,c,d,e,f,g,h;if(key1==0){delay(10);if(key1==0){while(!key1);if(wd1[x] & 0x08)a=1;elsea=0;if(wd1[x] & 0x04)b=1;elseb=0;if(wd1[x] & 0x02)c=1;elsec=0;if(wd1[x] & 0x01)d=1;elsed=0;if(wd2[x] & 0x08) e=1;elsee=0;if(wd2[x] & 0x04)f=1;elsef=0;if(wd2[x] & 0x02)g=1;elseg=0;if(wd2[x] & 0x01)h=1;elseh=0;open(a,b,c,d);open1(e,f,g,h);}}if(key2==0){delay(10);if(key2==0){while(!key2);if((wd1[x] & 0x08)) a=1;elsea=0;if((wd1[x] & 0x04))b=1;elseb=0;if((wd1[x] & 0x02))c=1;elsec=0;if((wd1[x] & 0x01))d=1;elsed=0;if((wd2[x] & 0x08))e=1;elsee=0;if((wd2[x] & 0x04))elsef=0;if((wd2[x] & 0x02))g=1;elseg=0;if((wd2[x] & 0x01))h=1;elseh=0;close(a,b,c,d);close1(e,f,g,h);}}if(key3==0){delay(10);if(key3==0){while(!key1);x++;if((wd1[x] & 0x08)) a=1;elseif((wd1[x] & 0x04))b=1;elseb=0;if((wd1[x] & 0x02))c=1;elsec=0;if((wd1[x] & 0x01))d=1;elsed=0;if((wd2[x] & 0x08)) e=1;elsee=0;if((wd2[x] & 0x04))f=1;elsef=0;if((wd2[x] & 0x02))g=1;elseg=0;if((wd2[x] & 0x01))h=1;elseh=0;open(a,b,c,d);open1(e,f,g,h);}}if(key4==0){delay(10);if(key4==0){while(!key1);x--;if((wd1[x] & 0x08))a=1;elsea=0;if((wd1[x] & 0x04))b=1;elseb=0;if((wd1[x] & 0x02))c=1;elsec=0;if((wd1[x] & 0x01))d=1;elsed=0;if((wd2[x] & 0x08)) e=1;elsee=0;if((wd2[x] & 0x04))f=1;elsef=0;if((wd2[x] & 0x02))g=1;elseg=0;if((wd2[x] & 0x01))h=1;elseh=0;open(a,b,c,d);open1(e,f,g,h);}}}void init(){key1=1;key2=1;key3=1;key4=1;out=1;}void main(){init();while(1){keyscan();}}。
// c51红外解码、超声波测距程序#include <reg52.h>#define uchar unsigned char#define uint unsigned int#define count 4uchar data IRcode[4]; //定义一个4字节的数组用来存储代码uchar table[4];uchar enled[4]={0x1f,0x2f,0x4f,0x8f};uchar CodeTemp,temp,tt; //编码字节缓存变量uchari,j,k,temp,timeH,timeL,succeed_flag,flag,h,h1,h2,a,key,key1,key2; //延时用的循环变量uint distance,distance1,time; //距离,timesbit IRsignal=P3^2; //HS0038接收头OUT端直接连P3.2(INT0)sbit come=P3^3;sbit d=P1^1;//发送码sbit BZ=P1^0;sbit s=P3^7;//38ksbit ss=P3^6;//38kuchar m;// 开关控制//sbit n=P2;//电机反转code unsigned charseg7code[10]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28}; //显示段码/**************************** 定时器0中断************************/void timer0() interrupt 1{TH0=(65536-count)/256;TL0=(65536-count)%256;s=~s;//产生38K信号ss=~ss;//tt++;//发送超声波个数}/**************************** 延时0.9ms子程序************************/void Delay0_9ms(void){uchar j,k;for(j=18;j>0;j--)for(k=20;k>0;k--);}/***************************延时1ms子程序**********************/void Delay1ms(void){uchar i,j;for(i=2;i>0;i--)for(j=230;j>0;j--);}/***************************延时4.5ms子程序**********************/ void Delay4_5ms(void){uchar i,j;for(i=10;i>0;i--)for(j=225;j>0;j--);}/**************************** 解码延时子程序************************/ void Delay(void){uchar i,j,k;for(i=100;i>0;i--)for(j=100;j>0;j--)for(k=3;k>0;k--);}/**************************** 显示延时子程序************************/ void ledDelay(unsigned int tc) //延时程序{unsigned int i,j;for(i=0;i<10;i++)for(j=0;j<tc;j++);}/************************************************ ****************///定时器1中断,用做超声波测距无回波void timer1() interrupt 3{TR1=0;ET1=0;EX1=0;TH1=0;TL1=0;}/***********************显示程序*********************/ void Led(int date) //显示函数{ int i;table[0]=date/1000;table[1]=date/100%10;table[2]=date/10%10;table[3]=date%10;date=0;for(i=0;i<120;i++){P2=enled[i%4]&m;//P2口高四位控制数码管,低位陪分控制继电器P0=seg7code[table[i%4]]; //取出千位数,查表,输出。
程序源代码、电路原理图、电路器件表当按下APP界面上的相关按键时(前进、左转、右转、后退、停止、左旋(当选择红外循迹用)、右旋(当选择红外跟随用)),手机会通过蓝牙发出相关的指令。
这些指令会被安装在智能小车上的蓝牙模块(HC-05)接收到,并通过串口转发给智能小车的处理器。
智能小车的处理器通过解析这些命令后,再根据这些命令的内容,控制智能小车前进、前进、左转、右转、后退、停止、红外循迹功能、红外跟随功能。
51单片机智能小车蓝牙遥控+红外循迹+红外跟随程序流程图如下:51单片机智能小车蓝牙遥控+红外循迹+红外跟随控制协议如下:前:$1,0,0,0,0,0,0,0,0,0#(文本)0x24 0x31 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x23(十六进制)左:$3,0,0,0,0,0,0,0,0,0#(文本)0x24 0x33 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x23(十六进制)后:$2,0,0,0,0,0,0,0,0,0#(文本)0x24 0x32 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x23(十六进制)右:$4,0,0,0,0,0,0,0,0,0#(文本)0x24 0x34 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x23(十六进制)停:$0,0,0,0,0,0,0,0,0,0#(文本)0x24 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x23(十六进制)左旋(当选择红外循迹用):$0,1,0,0,0,0,0,0,0,0#(文本)0x24 0x30 0x2C 0x31 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x23(十六进制)右旋(当选择红外跟随用):$0,2,0,0,0,0,0,0,0,0#(文本)0x24 0x30 0x2C 0x32 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x23(十六进制)下文主要提供了51单片机智能小车蓝牙遥控+红外循迹+红外跟随完整程序源代码、电路原理图以及电路器件表。