51单片机红外解码程序

合集下载

基于单片机红外线测距的51程序

基于单片机红外线测距的51程序

#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define ulong unsigned longsbit RS=P2^0; //LCD命令/数据端sbit RW=P2^1; //LCD读/写端sbit LCDE=P2^2; //LCD使能端sbit MCP_CS=P2^3; //MCP3001与AT89S52的管脚接线定义sbit MCP_DO=P2^4;sbit MCP_CLK=P2^5;uint measure;uchar flag; //Busy标志uchar code dis[]={"Measure Start"}; //显示uchar code dis1[] = {"Distance:"}; //显示表头uchar code dis2[] = {"0123456789.cm"}; //显示代码uchar code dis3[]={"Out Measure!"}; //显示uchar dis_buf[6]; //显示缓冲区void L_delay(void); //短延时void delay_ms(uint n); //延时函数uint read_MCP(void); //读MCP3001void init_1602(void); //1602初始化函数void busy(void); //LCD忙标志判断函数void dat_wrt(uchar dat); //写数据子函数void cmd_wrt(uchar cmd); //写命令子函数uint distance(void); //距离计算函数void lcd_start(uchar start); //设定显示位置函数void LCD_Clear(void); //LCD清屏函数uchar dat_adj(uint dat1); //显示数据调整函数void print(uchar *str); //字符串显示函数void disp(uint dat); //显示子函数uint average(void); //算术平均滤波程序/****************************主函数*******************************/main(){init_1602();print(dis); //显示测量开始delay_ms(1000);while(1){measure=distance();disp(measure); //显示高度delay_ms(100);}}/**************************延时函数**************************/void delay_ms(uint n){uint j;while(n--){for(j=0;j<125;j++);}}/***************************短延时****************************/void L_delay(void){uchar i;for(i=0;i<5;i++)_nop_();}/************************读MCP3001函数*************************/uint read_MCP(void){uchar i;uint temp=0;MCP_CS=1;L_delay();MCP_CS=0; //CS置低,开始采样数据for(i=0;i<13;i++) //读转换的10位数据{MCP_CLK=0;L_delay();MCP_CLK=1;temp<<=1;if(MCP_DO==1)temp|=0x01;}MCP_CS=1;temp&=0x03ff; //获取有效转换值return(temp);}/************************LCD忙标志判断函数*******************/void busy(void){flag=0x80; //赋初值高位为1 禁止while (flag&0x80) //读写操作使能位禁止时等待继续检测{P0=0xff;RS=0; //指向地址计数器RW=1; //读LCDE=1; //信号下降沿有效flag=P0; //读状态位高位为状态LCDE=0;}}/************************写数据子函数************************/void dat_wrt(uchar dat){busy(); //检测读写操作使能吗LCDE=0;RS=1; //指向数据寄存器RW=0; //写P0=dat; //写数据LCDE=1; //高电平有效LCDE=0;}/*************************写命令子函数************************/ void cmd_wrt(uchar cmd){LCDE=0;busy(); //检测读写操作使能吗P0=cmd; //命令RS=0; //指向命令计数器RW=0; //写LCDE=1; //高电平有效LCDE=0;}/***********************距离计算函数***************************/ uint distance(void){uint temp1;temp1=average();if((temp1>160)&(temp1<960)) //在正常测量范围?{temp1=13569/(temp1+7)-4; //转换测量数据}else{temp1=0x00ff; //超出测量范围,返回错误标志}return(temp1);}/************************算术平均滤波程序**********************/uint average(void){uchar i;uint av_dat;ulong ave=0;for(i=0;i<10;i++) //连续读取10个数据值{ave+=read_MCP(); //读转换数据L_delay();}av_dat=(uint)(ave/10); //求平均值return(av_dat);}/*************************1602初始化函数************************/void init_1602(void){cmd_wrt(0x01); //清屏cmd_wrt(0x0c); //开显示,不显示光标,不闪烁cmd_wrt(0x06); //完成一个字符码传送后,光标左移,显示不发生移位cmd_wrt(0x38); //16×2显示,5×7点阵,8位数据接口}/************************设定显示位置函数************************/void lcd_start(uchar start){cmd_wrt(start|0x80);}/************************LCD清屏函数****************************/void LCD_Clear(void){cmd_wrt(0x01); //写入清屏指令delay_ms(1);}/************************显示数据调整函数************************/uchar dat_adj(uint dat1){uchar i;dis_buf[0]=(uchar)(dat1/10); //十位dis_buf[1]=(uchar)(dat1%10); //个位dis_buf[2]=11;dis_buf[3]=12;if(dis_buf[0]==0)i=1;return(i);}/**************************字符串显示函数**************************/ void print(uchar *str){while(*str!='\0') //直到字符串结束{dat_wrt(*str);str++; //指向下一个字符}}/***************************显示子函数****************************/ void disp(uint dat){uchar temp,j;if(dat!=0x00ff){temp=dat_adj(dat);LCD_Clear();lcd_start(0x00);print(dis1); //显示文字lcd_start(0x45+temp); //确定显示起始位置for(j=temp;j<4;j++) //写显示数据dat_wrt(dis2[dis_buf[j]]);}else{LCD_Clear();lcd_start(0x42+temp); //确定显示起始位置print(dis3);}}。

51单片机红外解码资料+源代码

51单片机红外解码资料+源代码

位地 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H 址
源代码如下: #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7;
uchar irtime; //红外时间 uchar startflag; //启动接收 uchar irdata[33]; uchar bitnum; uchar irreceiveok; //红外接收完毕 uchar ircode[4]; uchar irprosok; uchar disp[8]; uchar code smg_du[]={
发射器发射的的信号为
接收器接收到的信号为
即 9ms 低电平后 4.5ms 高电平作为起始码,之后接受到两次 8 位客户码,一次八位数据码,和一次八位数据反码。
遥控器在按键按下之后周期性的发出同一种 32 位二进制编 码周期约为 108ms,一组码持续时间随本身的“0”“1”个数不同
而不同。大约在 45~63ms 之间,当一个键按下 36ms,振荡器使芯 片激活,将发射一组 108ms 的编码脉冲这 108ms 编码脉冲由一个 起始码(9ms),一个结束码(4.5ms),低八位地址码(9~18ms), 高八位地址码(9~18ms),八位数据码(9~18ms),和这八位数据 码反码(9~18ms),如果按下超过 108ms 仍未松开,接下来发射 的代码(连发代码)将仅有起始码(9ms)和结束码(2.5ms)组 成。
解码的关键是如何识别零和一: “0”和“1”都是以 0.56ms 低电平开始的,不同的是高电平 宽度不同,“0”为 0.56ms“1”为 1.168ms,所以必须根据高电平 宽度来区别“0”和“1”。 如果从 0.56ms 低电平过后,开始延时,0.56ms 后,若读到的 电平为低,说明该位为零,反之则为一,可靠其间,延时必须比 0.56ms'长一些,又不能超过 1.12ms,否则如果该位为零,读到的 已是下一位高电平,因此取(1.12+0.56)/2=0.84ms 最为可靠,一 般取 0.84ms 左右均可。根据码的格式,应该等待 9ms 起始码和 4.5ms 结束码完成后才能读码。 备注:定时器/计数器控制寄存器 TCON 位序 D7 D6 D5 D4 D3 D2 D1 D0 号 位符 TF1 TR1 TF0 IR0 IE1 IT1 IE0 IT0 号

51单片机设计的红外线遥控器电路图及工作原理

51单片机设计的红外线遥控器电路图及工作原理

51单片机设计的红外线遥控器电路图及工作原理你家里是否有一个电视机遥控器或者空调机遥控器呢?你是否也想让它遥控其他的电器甚至让它遥控您的电脑呢?那好,跟我一起做这个“红外遥控解码器”。

该小制作所需要的元件很少:单片机TA89C2051一只,RS232接口电平与TTL电平转换心片MAX232CPE 一只,红外接收管一只,晶振11.0592MHz,电解电容10uF4只,10uF 一只,电阻1K1个,300欧姆左右1个,瓷片电容30P2个。

发光二极管8个。

价钱不足20元。

电路图及原理:主控制单元是单片机AT89C2051,中断口INT0跟红外接受管U1相连,接收红外信号的脉冲,8个发光二极管作为显示解码输出(也可以用来扩展接其他控制电路),U3是跟电脑串行口RS232相连时的电平转换心片,9、10脚分别与单片机的1、2脚相连,(1脚为串行接收,2脚为串行发送),MAX232CPE的7、8脚分别接电脑串行口的2(接收)脚、3(发送脚)。

晶振采用11.0592MHz,这样才能使得通讯的波特率达到9600b/s,电脑一般默认值是9600b/s、8位数据位、1位停止位、无校验位。

电路就这么简单了,现在分析具体的编程过程吧。

如图所示,panasonic遥控器的波形是这样的(经过反复测试的结果)。

开始位是以3.6ms低电平然后是3.6ms高电平,然后数据表示形式是0.9ms低电平0.9ms 高电平周期为1.8ms表示“0”,0.9ms低电平2.4ms高电平周期为3.3ms表示“1”,编写程序时,以大于3.4ms小于3.8ms高电平为起始位,以大于2.2ms小于2.7ms高电平表示“1”,大于0.84ms小于1.11ms高电平表示“0”。

因此,我们主要用单片机测量高电平的长短来确定是“1”还是“0”即可。

定时器0的工作方式设置为方式1:mov tmod,#09h,这样设置定时器0即是把GATE置1,16位计数器,最大计数值为2的16次方个机器周期,此方式由外中断INT0控制,即INT0为高时才允许计数器计数。

51单片机红外遥控解码程序

51单片机红外遥控解码程序

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解码方法二你的解码程序和我现在用的解码程序大体是一样的,我自己实际做了一下,发现按下遥控器,接收到红外信号后,数码管闪的厉害。

51单片机-毕业设计基于单片机设计的红外线遥控器

51单片机-毕业设计基于单片机设计的红外线遥控器

ping primary school fire safety systems to e nha nce fire safety, prote ction of public property and t he life and property safety of teacher s and students, school fire safety into day-to-day ma nagement, is devel opi ng the following fire safety system. 1, strengt hen fire safety educati on of the whole school. Accordi ng to the re quireme nts of the Fire S ervices A ct, so t hat everyone has of keeping fire control safety, pr otecting fire control facilities, fire preve ntion, reports of fire学生毕业设计(论文)报告系别:专业:班号:学生姓名:学生学号:设计(论文)题目:基于单片机设计的红外线遥控器指导教师:设计地点:起迄日期:ping primary school fire safety systems to e nha nce fire safety, prote ction of public property and t he life and property safety of teacher s and students, school fire safety into day-to-day ma nagement, is devel opi ng the following fire safety system. 1, strengt hen fire safety educati on of the whole school. Accordi ng to the re quireme nts of the Fire S ervices A ct, so t hat everyone has of keeping fire control safety, pr otecting fire control facilities, fire preve ntion, reports of fire常州信息职业技术学院电子与电气工程学院毕业设计论文毕业设计(论文)任务书专业电子信息工程班级电子085 姓名傅浩一、课题名称:基于单片机设计的红外线遥控器二、主要技术指标:1.遥控距离:0~10m2.额定工作电压:直流3V(普通5号干电池2节);红外光平均辐照度≥40μW/cm2;指向性(辐照度为20μW/cm2)≥30度3.欠压条件下(直流2.4v):红外光平均辐照度≥20μW/cm2,指向性(辐照度为10μW/cm2)≥30度三、工作内容和要求:1.以AT89C2051单片机作为核心,综合应用了单片机中断系统、定时器、计数器等知识,应用红外光的优点2.遥控发射器通过对红外光发射频率的控制来区别不同的操作3.遥控接收器通过对红外光接收频率的识别,判断出控制操作,来完成整个红外遥控发射、接收过程四、主要参考文献:[1] 梅丽凤,王艳秋,张军等. 单片机原理及接口技术,北京:清华大学出版社,2004年.[2] 戴峻峰,付丽辉. 多功能红外线遥控器的设计,传感器世界.2002,8(12):16~18.[3] 李光飞,楼然苗,胡佳文等. 单片机课程设计实例指导,北京:北京航空航天出版社,2004年.[4] 苏长赞. 红外线与超声波遥控,北京:人民邮电出版社.1995年.学生(签名)2010 年 5 月7 日指导教师(签名)2010 年5 月10 日教研室主任(签名)2010 年5 月10 日系主任(签名)2010 年5 月12 日ping primary school fire safety systems to e nha nce fire safety, prote ction of public property and t he life and property safety of teacher s and students, school fire safety into day-to-day ma nagement, is devel opi ng the following fire safety system. 1, strengt hen fire safety educati on of the whole school. Accordi ng to the re quireme nts of the Fire S ervices A ct, so t hat everyone has of keeping fire control safety, pr otecting fire control facilities, fire preve ntion, reports of fire毕业设计(论文)开题报告设计(论文)题目基于单片机设计的红外线遥控器一、选题的背景和意义:随着社会的发展、科技的进步以及人们生活水平的逐步提高,各种方便于生活的遥控系统开始进入了人们的生活。

红外收发模块51单片机程序部分

红外收发模块51单片机程序部分

深圳市技新电子科技有限公司www.jixin.pro红外收发模块51单片机程序部分V1.0.0.0红外收发模块51单片机程序部分1、红外收发原理介绍1.1红外接收头决定了通信的频率是38KHZ红外通信模块发射红外光的频率是38KHZ,这个频率是由红外接收探头决定的,市场上还有其他频率的产品这里不讨论。

技小新的红外收发模块上面用的接收头就是这种38KHZ 的,型号是IRM-3638T。

红外发射的探头没有这个频率限制,所以可以用单片机自由控制。

1.2红外通信的流程单片机A控制红外发光管,发射38KHZ频率的光,同时遵守一定的通信规则,比如电影里常见的“摩斯密码”。

红外接收头连接着单片机B,红外接收头收到红外光后会输出一连串的高低电平到单片机B,单片机B根据“摩斯密码”的规则解码。

这样就完成了一次红外通信。

1.3红外载波调制的约定我们使用的通信方式叫做载波调制。

(1)由于发射频率是38KHZ,很容易得出发射一个信号的周期是26.3uS.(2)对于发射端:“载波发射”一个周期是,发光8.77uS+不发光17.53uS。

“载波不发射”一个周期是,26.3uS不发光。

(3)对于接收端:如果收到了一个“载波发射”信号,输出低电平26.3uS。

如果收到了一个“载波不发射”信号(其实就是没有收到信号),输出高电平26.3uS。

真正使用时候要发送一连串的“载波发射”和“载波不发射”,这样接收端输出的是连续的脉冲。

(注意,仅仅一个“载波发射”并不能让接收端正确输出。

)1.4NEC_upd6121红外通信协议。

这是很多遥控器厂商都在使用的协议。

它的协议约定如下:(1)引导码:342个连续“载波发射”+171个“载波不发射”。

接收端的反应是9mS的低电平+4.5mS的高电平。

(2)数据“0”表示为:21个连续“载波发射”+21个连续“载波不发射”。

接收端的反应是:0.56mS的低电平+0.56mS的高电平。

(3)数据“1”表示为:21个连续“载波发射”+64个连续“载波不发射”。

51单片机红外遥控格力空调程序

51单片机红外遥控格力空调程序

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

51单片机红外遥控解码,很详细(汇编语言,C语言等)

51单片机红外遥控解码,很详细(汇编语言,C语言等)
//k[i]=TH0;
//i++;
if(TH0<3)
b=1;
else b=0;
TH0=0;
TL0=0;
}
uchar hw_key()
{
uchar j,m;
//i=0;
hw_start(); //等待低电平到来
hw_pulse();
for(j=0;j<24;j++) //测试用户码脉冲宽度
{
hw_pulse();
}
for(j=0;j<8;j++) //测试键码脉冲宽度
{
hw_pulse();
if(b==1)
m=(m<<1)|1;
else
m<<=1;
}
return m; //键码
}
while(in==0); //高电平到了,
TR0=0; //关闭定+;
TH0=0;
TL0=0;
TR0=1; //高电平到了,启动定时器1,测试高电平宽度
while(in==1); //低电平到了,
TR0=0; //关闭定时器1,高电平宽度测试完
请注意甄别内容中的联系方式诱导购买等信息谨防诈骗
51单片机红外遥控解码,很详细(汇编语言,C语言等)
单片机源程序如下:
#include
#define hw_hs0038_ENTITY
#include "hw_hs0038.h"
sbit in=P3^2;
//uchar i=0;
//uchar k[2];
bit bdata b=0;
/*
void timer0(void) interrupt 1 using 1

STC单片机51简单的红外遥控发射程序C语言

STC单片机51简单的红外遥控发射程序C语言
for (j=0;j<43;j++) {s1=1;s1=1;Delay13us();} //高电平0.565ms无载波
}
void H(){ //红外1; 以低电平0.565ms,高电平1685表示1
uchar j;
for (j=0;j<43;j++) {s1=~s1;Delay13us();} //低电平0.565ms载波,模拟38KHZ
{
uint j;
while(1){
Delay3000ms();
//以下开始发送
for (j=0;j<692;j++) {s1=~s1;Delay13us();}//载波发送9ms的起始码
for (j=0;j<346;j++) {s1=1;Delay13us();} //无载波发送4.5ms的结果码
for (j=0;j<173;j++) {s1=1;Delay13us();} //2.25ms
for (j=0;j<44;j++) {s1=~s1;Delay13us();}//结束位
for (j=0;j<7400;j++) {s1=1;Delay13us();} //在延时96.2ms到108ms,在发送连发码
for (j=0;j<692;j++) {s1=~s1;Delay13us();}//载波发送9ms的起始码
for (j=0;j<173;j++) {s1=1;Delay13us();} //2.25ms
for (j=0;j<44;j++) {s1=~s1;Delay13us();}//结束位

51单片机红外解码、超声波测距程序(详细解释程序)

51单片机红外解码、超声波测距程序(详细解释程序)

// 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]]; //取出千位数,查表,输出。

51单片机红外接收解码程序(详细解析)

51单片机红外接收解码程序(详细解析)

51单片机红外接收解码程序接收以S52单片机作为接收系统。

以S52的P3.3口作为接收端口,该端口是外部中断1。

这个接受程序是以XC866作为红外发送控制系统,接收程序如下:#include<reg52.h>//头文件#include<intrins.h>#define uchar unsigned char//宏定义#define uint unsigned intsbit HWRx=P3^3;//位声明code uchar Table[]=//共阴数码管0-9 a-f - 表{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};uchar Table_Data[8]={0,0,0,0,0,0,0,0};//用于显示的数组uchar Table_Rx[67];//用于存储判断接收是1或0的参数void Delay();//延时子函数void Display(uchar *lp,uchar lc)//显示{uchar i;//定义变量P2=0;//端口2为输出,关闭P1=P1&0xF8;//将P1口的前3位输出0,对应138译门输入脚,全0为第一位数码管for(i=0;i<lc;i++)//循环显示,采用动态扫描{P2=Table[lp[i]]; //查表法得到要显示数字的数码段if(lp[i]>0x7f)P2+=0x80;Delay();//延时P2=0;//清0端口,准备显示下位if(i==7)//检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到第四位数据break;P1++;//点亮下一位数码管}}void main()//主函数{EA=1;//首先开启总中断EX1=1;//开启外部中断1IT1=1;//设置成下降沿触发方式while(1)//一直显示,其它由中断处理{Display(Table_Data,8);}}void Delay()//延时时间大约为31us,晶振12M{uchar i=13;while(i)i--;}void Delay_ms(uint z) //延时时间约为1ms*X晶振为12M{uint x=0,y=0;for(x=z;x>0;x--)for(y=54;y>0;y--);}void hongwai()interrupt 2//外部中断1 ,INT1(P3^3)连接红外线接收IC数据脚{uchar i,j,tmp;EX1=0;//关闭中断j=33;//传送一组数包括引导码1位,4个八位数据,总共33位i=0;//从第一维数组开始Delay_ms(10);if(HWRx){//然后再检测红线接收脚是有数据招收,有继续,没有则退出EX1=1;return;}while(j--){//循环接收33位数据,为何我们用到66位数组,我们可以不接收高电平时间常数,只接低电平常数就//可以判断1或0了,在这里我们都接收,还有一点要知道,接收波形是反向,在没有接收时端口为高电平tmp=0;Table_Rx[i]=1;//时间量从1开始while(!HWRx) //检测高低电平的变化,这里检测的是高电平{Table_Rx[i]++;//没变继续加1Delay();//家一个延时防止,计数值一下子就加满了tmp++;//加1if(tmp==250)break;}i++;tmp=0;Table_Rx[i]=1;//时间量从1开始while(HWRx)//检测高低电平的变化,这里检测的是低电平{Table_Rx[i]++; //没变继续加1Delay();//同上tmp++;//加1,用于判断是1还是0的,低电平来了if(tmp==250)break;}i++;}P1=0xf8;i=200;//加入循环延时,抗干扰while(i)//在有接收数据的时候显示一个H{tmp=255;while(tmp){tmp--;P2=0x76;}i--;}tmp=0;for(i=3;i<19;i++,i++)//处理发送的数据{tmp>>=1;//右移一位,接收低位在前if(Table_Rx[i]>30)//检测低电平时间超过30就确认为1 tmp+=0x80;}Table_Data[0]=tmp/16;//分开2位以16进制显示,用显示发送的数据Table_Data[1]=tmp%16;tmp=0;for(i=19;i<35;i++,i++)//同上{tmp>>=1;if(Table_Rx[i]>30)tmp+=0x80;}Table_Data[2]=tmp/16;Table_Data[3]=tmp%16;tmp=0;for(i=35;i<51;i++,i++){tmp>>=1;if(Table_Rx[i]>30)tmp+=0x80;}Table_Data[4]=tmp/16;Table_Data[5]=tmp%16;tmp=0;for(i=51;i<67;i++,i++){tmp>>=1;if(Table_Rx[i]>30)tmp+=0x80;}Table_Data[6]=tmp/16;Table_Data[7]=tmp%16;EX1=1;//刚进中断时关闭了分控,现在要打开}。

基于51单片机的红外遥控

基于51单片机的红外遥控

基于51单片机的红外遥控红外遥控是无线遥控的一种方式,本文讲述的红外遥控,采用STC89C52单片机,1838红外接收头和38k红外遥控器。

1838红外接收头:红外遥控器:原理:红外接收的原理我不赘述,百度文库上不少,我推荐个网址,这篇文章写得比较清楚,也比较全面,我主要讲下程序的具体意思,在了解原理的基础上,我们知道,当我们在遥控器上每按下一个键,遥控器上的红外发射头都会发出一个32位的编码(32位编码分成4组8位二进制编码,前16位为用户码和用户反码,后16位为数据码和数据反码,用户码表示遥控器类型,数据码表示按键编码),不同的键对应不同的编码,红外接收头接收到这个编码后,发送给单片机,再进行相关操作。

源程序1:(这个程序的功能是将用户码和用户反码,数据码和数据反码显示在1602液晶上,因为遥控器买回来是不会说明按键对应什么码值,所以先自己测试,确定每个按键的码值)#include<reg52.h>#include<stdio.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned char#define _Nop() _nop_()#define TURE 1#define FALSE 0/*端口定义*/sbit lcd_rs_port = P3^5; /*定义LCD控制端口*/sbit lcd_rw_port = P3^6;sbit lcd_en_port = P3^4;#define lcd_data_port P0///////////////////////////////////void delay1 (void)//关闭数码管延时程序{int k;for (k=0; k<1000; k++);}////////////////////////////////////uchar code line0[16]={" user: "};uchar code line1[16]={" data: "};uchar code lcd_mun_to_char[16]={"0123456789ABCDEF"};unsigned char irtime;//红外用全局变量bit irpro_ok,irok;unsigned char IRcord[4];//用来存放用户码、用户反码、数据码、数据反码unsigned char irdata[33];//用来存放32位码值void ShowString (unsigned char line,char *ptr);//////////////////////////////////////////////void Delay(unsigned char mS);void Ir_work(void);void Ircordpro(void);void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数{irtime++;}void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数{static unsigned char i;static bit startflag;if(startflag){if(irtime<63&&irtime>=33)//引导码TC9012的头码i=0;irdata[i]=irtime;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是初值TH0=0x00;//reload valueTL0=0x00;//initial valueET0=1;//开中断TR0=1;}void EX0init(void){IT0 = 1; // Configure interrupt 0 for falling edge on /INT0 (P3.2)EX0 = 1; // Enable EX0 InterruptEA = 1;}void Ircordpro(void)//红外码值处理函数(关键函数){unsigned char i, j, k=1;unsigned char cord,value;for(i=0;i<4;i++){//处理4个字节for(j=1;j<=8;j++){ //处理1个字节8位cord=irdata[k];value=value>>1;if(cord>7) value=value|0x80; //大于某值为1k++;}IRcord[i]=value;value=0;}irpro_ok=1;//处理完毕标志位置1}///////////////////////////////////////////void lcd_delay(uchar ms) /*LCD1602 延时*/{uchar j;while(ms--){for(j=0;j<250;j++){;}}}//////////////////////////////////////////////void lcd_busy_wait() /*LCD1602 忙等待*/{lcd_rs_port = 0;lcd_rw_port = 1;lcd_en_port = 1;lcd_data_port = 0xff;_Nop();_Nop();_Nop();_Nop();while (lcd_data_port&0x80);lcd_en_port = 0;}///////////////////////////////////////////////void lcd_command_write(uchar command) /*LCD1602 命令字写入*/ {lcd_busy_wait();lcd_rs_port = 0;lcd_rw_port = 0;lcd_en_port = 0;lcd_data_port = command;_Nop();_Nop();_Nop();_Nop();_Nop();_Nop();lcd_en_port = 1;_Nop();_Nop();_Nop();_Nop();_Nop();_Nop();lcd_en_port = 0;}/////////////////////////////////////////void lcd_system_reset() /*LCD1602 初始化*/{lcd_delay(20);lcd_command_write(0x38);lcd_delay(100);lcd_command_write(0x38);lcd_delay(50);lcd_command_write(0x38);lcd_delay(10);lcd_command_write(0x08);lcd_command_write(0x01);lcd_command_write(0x06);lcd_command_write(0x0c);}//////////////////////////////////////////////////void lcd_char_write(uchar x_pos,y_pos,lcd_dat) /*LCD1602 字符写入*/ {x_pos &= 0x0f; /* X位置范围0~15 */y_pos &= 0x01; /* Y位置范围0~ 1 */if(y_pos==1) x_pos += 0x40;x_pos += 0x80;lcd_command_write(x_pos);lcd_busy_wait();lcd_rs_port = 1;lcd_rw_port = 0;lcd_en_port = 0;lcd_data_port = lcd_dat;_Nop();_Nop();_Nop();_Nop();_Nop();_Nop();lcd_en_port = 1;_Nop();_Nop();_Nop();_Nop();_Nop();_Nop();lcd_en_port = 0;}void main(void){uchar i;lcd_system_reset(); /* 初始化LCD1602 */lcd_data_port = 0xff;for(i=0;i<16;i++) lcd_char_write(i,0,line0[i]);for(i=0;i<16;i++) lcd_char_write(i,1,line1[i]);EX0init(); // Enable Global Interrupt FlagTIM0init();while(1){//主循环if(irok){Ircordpro();irok=0;}if(irpro_ok){ /*遥控成功接收*/lcd_char_write(8,0,lcd_mun_to_char[IRcord[0]/0x10]);lcd_char_write(9,0,lcd_mun_to_char[IRcord[0]%0x10]);lcd_char_write(11,0,lcd_mun_to_char[IRcord[1]/0x10]);lcd_char_write(12,0,lcd_mun_to_char[IRcord[1]%0x10]);lcd_char_write(8,1,lcd_mun_to_char[IRcord[2]/0x10]);lcd_char_write(9,1,lcd_mun_to_char[IRcord[2]%0x10]);lcd_char_write(11,1,lcd_mun_to_char[IRcord[3]/0x10]);lcd_char_write(12,1,lcd_mun_to_char[IRcord[3]%0x10]);}//将码值显示在液晶上}}源程序2:(在知道了按键编码的基础上,我们便可以加入判断,判断哪个键被按下,进而执行相关操作)我只修改main函数,其他与源程序1相同sbit led1=P1^0;sbit led2=P1^1;sbit led3=P1^2;sbit led4=P1^3;sbit led5=P1^4;//发光二极管控制端定义void main(void){uchar i;lcd_system_reset(); /* 初始化LCD1602 */lcd_data_port = 0xff;for(i=0;i<16;i++) lcd_char_write(i,0,line0[i]);for(i=0;i<16;i++) lcd_char_write(i,1,line1[i]);EX0init(); // Enable Global Interrupt FlagTIM0init();while(1){//主循环if(irok){Ircordpro();irok=0;}if(irpro_ok){ /*遥控成功接收*/switch(IRcord[2])//为什么判断IRcord[2],因为这个里面存放的是数据码{case 0x0c: led1=0;//按0键,灯1亮break;case 0x18: led2=0; //按1键,灯2亮break;case 0x5e: led3=0; //按2键,灯3亮break;case 0x08: led4=0; //按3键,灯4亮break;case 0x1c: led5=0; //按4键,灯5亮break;}}}}附连接图。

51单片机红外遥控程序

51单片机红外遥控程序
;=================================================
;遥控执行部份
IR_GOTO
;这里还要判断1AH和1BH两个系统码或用户码,用于识别不同的遥控

;MOV A,1AH
;CJNE A,#xxH,IR_ERROR ;用户码1不对则退出
;MOV A,1BH
单片机采用外部中断INTI管脚和红外接收头的信号线相连,中断方式为边沿触发方式。并用定时器0计算中断的间隔时间,来区分前导码、二进制的“1”、“0”码。并将8位操作码提取出来在数码管上显示。
// 解码值在Im[2]中,当IrOK=1时解码有效。
/* 51单片机红外遥控解码程序 */
//用遥控器对准红外接收头,按下遥控器按键,在数码管前两位上就会显示对应按键的编码
MOV R7,#202
DELAY882_A
NOP
NOP
DJNZ R7,DELAY882_A
RET
;=============================1000
DELAY1000 ;1.085x ((229x4)+5)=999.285
MOV R7,#229
DELAY1000_A
NOP
NOP
DJNZ R7,DELAY1000_A
上述“0”和“1”组成的
32位二进制码经
38kHz的载频进行二次调制以提高发
射效率,达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空
间发射,如图
3所示。

3遥控信号编码波形图
UPD6121G产生的遥控编码是连续的
32位二进制码组,其中前
16位为用
户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。该芯片的用

51单片机解码红外遥控器原理

51单片机解码红外遥控器原理

51单片机解码红外遥控器原理电视遥控器使用的是专用集成发射芯片来实现遥控码的发射,如东芝TC9012,飞利浦SAA3010T等,通常彩电遥控信号的发射,就是将某个按键所对应的控制指令和系统码(由0和1组成的序列),调制在38KHz的载波上,然后经放大、驱动红外发射管将信号发射出去。

不同公司的遥控芯片,采用的遥控码格式也不一样。

较普遍的有两种,一种是NEC标准,一种是PHILIPS 标准。

NEC标准:遥控载波的频率为38KHz(占空比为1:3);当某个按键按下时,系统首先发射一个完整的全码,如果键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。

一个完整的全码=引导码+用户码+用户码+数据码+数据反码。

其中,引导码高电平4.5ms,低电平4.5ms;系统码8位,数据码8位,共32位;其中前16 位为用户识别码,能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。

后16 位为8 位的操作码和8位的操作反码,用于核对数据是否接收准确。

收端根据数据码做出应该执行什么动作的判断。

连发代码是在持续按键时发送的码。

它告知接收端,某键是在被连续地按着。

NEC标准下的发射码表示发射数据时0用“0.56ms高电平+0.565ms低电平=1.125ms”表示,数据1用“高电平0.56ms +低电平1.69ms=2.25ms”表示即发射码“0”表示发射38khz的红外线0.56ms,停止发射0.565ms,发射码“1”表示发射38khz 的红外线0.56ms,停止发射1.69ms需要注意的是:当一体化接收头收到38kHz 红外信号时,输出端输出低电平,否则为高电平。

所以一体化接收头输了的波形是与发射波形是反向的,如图PHILIPS标准:载波频率为38KHz;没有简码,点按键时,控制码在1和0之间切换,若持续按键,则控制码不变。

一个全码=起始码‘11’+控制码+用户码+用户码,如图所示。

(完整版)基于51单片机的红外遥控器解码设计毕业论文

(完整版)基于51单片机的红外遥控器解码设计毕业论文

第1章红外解码系统分析第1节设计要求整个控制系统的设计要求:被控设备的控制实时反应,从接收信号到信号处理及对设备控制反映时间应小于1s;整个系统的抗干扰能力强,防止误动作;整个系统的安装、操作简单,维护方便;成本低。

红外载波、编码电路设计要求:单片机定时器精确产生38KHz红外载波;根据控制系统要求能对红外控制指令信号精确编码并迅速发送。

红外解码电路设计要求:精确接收红外信号,并对所接收信号进行解码、放大、整形、解调等处理,最后输出TTL电平信号;对非红外光及边缘红外光抗干扰能力强。

设备扩展模块设计要求:直流控制交流;抗干扰能力强;反应迅速不产生误动作;能承受大电流冲击。

第2节总体设计方案2.1 方案论证驱动与开关方案一:采用晶闸管直接驱动。

其优点是体积小,电路简单,外围元件少。

但控制电流小,大电流晶闸管成本高,并且隔离性能差。

方案二:采用三极管驱动继电器。

其体积大,外围元件多。

优点是控制电流大,隔离性能好。

根据实际情况,拟采用方案二。

2.2 总体设计框图经过上述方案的分析选择,得出系统硬件由以下几部分组成:电视红外遥控器,51单片机最小系统,接收放大于一体集成红外接收头,1602液晶显示驱动电路。

整体设计思路为:根据扫描到不同的按键值转至相对应的ROM表读取数据。

确认设备及菜单选择键后AT89S2将从ROM读取出来的值,按照数据处理要求从P2.5输出控制脉冲与T0产生的38KHz的载波(周期是26.3μs)进行调制,经NPN三极管对信号放大驱动红外发光管将控制信号发送出去。

红外数据接收则是采用HS0038一体化红外接收头,内部集成红外接收、数据采集、解码的功能,只要在接收端INT0检测头信号低电平的到来,就可完成对整个串行的信号进行分析得出当前控制指令的功能。

然后根据所得的指令去操作相应的用电器件工作,如图1-1所示。

图1-1 电路设计整体框图第2章红外解码硬件电路设计第1节单片机及其硬件电路设计1.1 单片机的介绍AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

51单片机红外解码程序
1、红外遥控系统
通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图1所示。

发射部分包括键盘矩阵、编码调制、LED红外发送器;
接收部分包括光、电转换放大器、解调、解码电路。

下面,我们将使用下面两种设备:
另外,使用51单片机进行解码。

2、原理图
从原理图看出,IR的data脚与51的PD2(P3.2)相连。

2、红外发射原理
要对红外遥控器所发的信号进行解码,必须先理解这些信号。

a) 波形
首先来看看,当我们按下遥控器时,红外发射器是发送了一个什么样的信号波形,如下图:
由上图所示,当一个键按下超过22ms,振荡器使芯片激活,将发射一组108ms
的编码脉冲(由位置1所示)。

如果键按下超过108ms仍未松开,接下来发射的
代码(连发代码由位置3所示)将仅由起始码(9ms)和结束码(2.5ms)组成。

下面把位置1的波形放大:
由位置1的波形得知,这108ms发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(用户编码)(9ms~18ms),高8位地址码(用户编码)(9ms~18ms),8位数据码(键值数据码)(9ms~18ms)和这8位数据的反码(键值数据码反码)(9ms~18ms)组成。

b) 编码格式
遥控器发射的信号由一串0和1的二进制代码组成.不同的芯片对0和1的编码有所不同。

通常有曼彻斯特编码和脉冲宽度编码。

XS-091遥控板的0和1采用PWM方法编码,即脉冲宽度调制。

下图为一个发射波形对应的编码方法:
放大0和1的波形如下图:
这种编码具有以下特征:以脉宽为0.565ms、间隔0.56ms、周期为1.125ms 的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms 的组合表示二进制的“1”。

3、红外接收原理
a) 波形
红外接收头将38K载波信号过虑,接收到的波形刚好与发射波形相反:
放大,位定义0和位定义1波形如下:
4、解码原理及算法
注:代码宽度算法:
16位地址码的最短宽度:1.12×16=18ms 16位地址码的最长宽度:
2.24ms×16=36ms
可以得知8位数据代码及其8位反代码的宽度和不变:(1.12ms+2.24ms)×8=27ms
所有32位代码的宽度为(18ms+27ms)~(36ms+27ms)
对于红外线遥控对于很多电子爱好者来讲,都感觉到非常神奇,看不到,摸不着,但能实现无线遥控,其实控制的关键就是我们要用单片机芯片来识别红外线遥控器发出红外光信号,即我们通常所说的解码。

单片机得知发过来的是什么信号,然后再做出相应的判断与控制,如我们按电视机遥控器的频道按钮,则单片机会控制更换电视频道,如按的是遥控器音量键,则单片机会控制增减音量。

解码的关键是如何识别“0”和“1” !!
从位的定义我们可以发现“0”、“1”均以 0.56ms的低电平开始,不同的是高电平的宽度不同!,“0”为0.56ms,“1”为1.68ms,所以必须根据高电平的宽度区别“0”和“1”。

如果从0.56ms低电平过后,开始延时,0.56ms以后,若读到的电平为低,说明该位为“0”,反之则为“1”,为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为“0”,读到的已是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右均可。

根据码的格式,应该等待9ms的起始码和4.5ms的结果码完成后才能读码。

5、实例代码:
注意一下几点:
1. 从上面“红外接收头与单片机连接原理图”来看,红外接收头的型号脚是与51的int0相连,所以需要使用INT0(外部中断0).
2. 由于解码过程中涉及到延时,为精确起见,我们选择使用定期时1来计时。

系统初始化时,我们设置IRIN为高电平,同时把IT0设置成1,即下降沿(负跳变)触发中断。

这是用于接收波形的引导码是从低电平开始的(如上面接收波形所示)。

这样,当按下按键时,红外接收到信号,IRIN则发生从预先设置的高电平跳为低电平,从而产生中断。

2. 解码--中断程序interr_ir(void)
首先,第一步把EX0关中断,这步至关重要,因为一个接收波形许多的下降沿,这样会产生干扰中断。

接下来,使用定期时0延时9ms,跳过开始码。

注意,延时后,需要检测一下干扰信号。

下一步,while(!IRIN); 等待4.5ms高电平的到来,再延时4.5ms,跳过结果。

引导码过后,开始读码,执行GetCode():
32位数据码,分4次读取,所以执行4次GetCode(),读取一个字节数据过程如下:
源码copy to clipboard打印?
1. 从上述位定义看,位0和位1都是0.56ms的低电平过后,高电平开始延时。

所以,读码的第一步while(!IRIN);是等待这个0.56ms的低电平之后的高电平。

2. 从高定平到后开始延时0.84ms
3. 判断0.84ms的波形高电平还是低电平。

若仍然是高电平证明,该位为“1”,否则为“0”。

到这里读码结束。

3. 校验
由于32位数据码中,后两个字节是键数据码和健数据反码。

可以通过这两个字节数来实行校验。

即,把前一个字节去反判读是否等于后一字节。

好了,到这里解码程序已经完成了。

呵呵。

小Jay很有满足感。

相关文档
最新文档