版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、红外遥控通信系统现在家电产品大部分配有红外线遥控器,在PC上也有红外传输的接口,有些鼠标加了红外控制接口,变成了无线鼠标。所以说使用红外已经是一种非常广泛的通信方式。红外通信知识的概述。实验内容简介实验目的1、掌握红外通信系统的知识。2、学会对接收到的红外信号进行解码操作。3、学会如何使用单片机来控制红外发射器发射红外信号。4、了解NEC码的编码方式等相关知识。实验要求1、使用开发板上的红外发射器TSAL6200模拟一个采用NEC码的红外遥控器进行红外信号的发射。2、红外的编码使用开发板上的矩阵键盘实现(按键扫描实验)。3、开发板通过红外接收模块(HS0038)完成红外数据的接受,同时进行解码
2、等操作。4、MCU对解码后的数据进行处理,将其显示在数码管上。简单硬件需求分析1、一般的红外通信系统都由发射与接收两个部分组成,所以我们需要一个发送红外信号的发射器和一个红外接收器,由于我们需要对接收到的红外信号进行解码,然后送给单片机进行处理,所以选择的接收器应该可以解码出单片机可以直接处理的数据。2、选择一个MCU对红外发射器进行控制,得到想要的红外数据。3、由于我们实验需要显示接收到的红外数据,所以需要一个显示器件,数码管就能够满足显示的需求。开发板设计· HS0038模块:HS0038是一个直接输出MCU可以处理的数字信号,所以在电路连接中,可以直接将它的OUT引脚接在单片机
3、的I/O口上,进行红外数据的处理,但是在我们的开发板上,不仅接在了I/O口上,同时也将其接在了8259A中断控制器上,这样做,可以让我们在编写程序时有多种做法。1 / 18这里的OUT引脚默认情况下为高电平的,这是上拉电阻所起到的作用。· TSAL6200模块:该器件是一个红外发射器,发射器的一端接在5V电源上,另一段接在PNP型三极管的发射极上,三极管主要起到一个电流放大的作用。这里的IR_OUT信号通过电阻接在电源上,除了让IR_OUT信号线在默认情况下输出高电平的作用外(IR_OUT=1红外发射管不工作),还起到了分压的作用,因为TSAL6200的正向压降只有1.35V(详细内
4、容见TSAL6200)。在默认情况下,由于IR_OUT为高电平,所以三极管的基极是高电平,此时三极管不导通,TSAL6200没有工作,不会发射红外信号,只有当IR_OUT信号输出低电平时,才会有红外信号发出。· 8259A中断控制器模块:8259A中断控制器是分为奇地址以及偶地址(主要通过8259A的A0引脚进行控制):它们分别是0x6001、0x6000。由于这里我们只用到单片8259A,所以SP/EN引脚接高电平表示为单片,CAS0CAS2是级联使用的,单片8259A时这些引脚都无用,所以直接悬空了。1、INT引脚:这里我们用8051控制8259,由于8259有中断请求时INT引
5、脚变为高电平,而8051中断外部中断只有下降沿和低电平触发方式,为了满足两者之间的兼容性,使用该信号与地线接在或非门上,实现一个反向的功能。2、INTA引脚处理:由于8051没有中断应答引脚,所以这里我们要借助8051的RD引脚和8259的INT引脚模拟出中断应答信号,由于中断应答也是变为低电平有效,而8051的RD为低电平有效,开发板的设计如下:RD信号线通过一个与非门之后,再和INT一起接在另一个与非门的输入端,然后与非门的输出端接在8259A的26号引脚INTA#上作为中断响应的应答信号。(注:由于需要将RD信号线取反,我们使用一个与非门实现了一个非门的功能,这样做可以节约成本,因为一个
6、74LS00芯片上包含了多个与非门。与非门的输入引脚接相同的信号就相当是给这个信号取反。)各个部件与MCU的连接:IR_IN(P1.2)与红外接收器的OUT引脚相连,单片机可从该引脚获取红外数据信息;IR_OUT(P1.3与红外发射器相连)单片机对此引脚进行控制,可以改变TSAL6200的工作状态,以达到进行红外数据的发送功能;P3.3引脚是单片机的外部中断1引脚,与中断控制器8259A相连,单片机的P0口是8位数据的传输线,分别与8259A的数据线相连;单片机的P1.0和P1.1用来当I2C总线,使用软件进行I2C的模拟,详细内容可见IIC。程序流程分析1、先进行初始化操作,包括数码管驱动芯
7、片CH452、数码管、定时器0、定时器1、8259A中断控制器的初始化。2、当有按键时,会产生8259A中断,在中断服务函数中,把1赋给Flag1,用来标志有键按下,并且进行按键值的查找,并用一个全局变量Keycode记录按键值。3、主程序中检测到Flag1=1后(为了不影响接收程序,此时先关闭按键中断的允许位,等本次发送过程结束再打开允许位),就会调用红外发送程序,发送的内容为引导码、地址码以及命令,对于同一个遥控器件来说,它们的地址码应该是不变的,我们这里的地址码应该为0x40bd。(如下图所示:)从图中我们可以看出,命令码(command,data code)发送两次,第一次发送的是原码
8、,第二次发送的是反码,这样是为了提高红外传输过程的可靠性。需要注意的是,不管是地址码还是数据码,都是先发送最低有效位。4、在发送程序中,先发送引导码,由9ms的高电平和4.5ms的低电平组成,由下图所示:引导码发送完毕之后,紧接着就会发送4个字节的数据,包括地址码和命令码,数据编码格式如下图所示:0.56ms的高电平和0.56ms的高电平代表数据0,0.56ms的高电平和1.12ms的低电平代表数据1。5、接收过程应该和发送过程是"同时"的,在红外发送程序执行的过程中,当红外接收器HS0038接收到红外信号后,在红外信号出现上升沿(程序中设置了IT1=1),会产生8259A
9、中断,此时我们可以在中断服务程序中进行解码操作,获取红外数据。6、解码操作时,先进行引导码的判断,由于HS0038会将接收到的红外信号反向,所以引导码就变成了9ms的低电平和4.5ms的高电平,第一次产生8259A中断是在9ms之后,下一次中断产生则是在发送数据位的0.56ms之后,所以两次中断之间的时间间隔应该为4.5ms左右,如果时间在这个范围之内,则说明引导码判断成功,同样的方法我们可以判断产生两次中断时间间隔来判断接收到的数据。程序代码分析/*头文件*/#include <reg52.h>#include <absacc.h>#include <INTRI
10、NS.H>#include "8259a.h"#include "ch452.h"/*变量的定义*/ sbit Ir_out=P13; /红外发射引脚unsigned int Count1=0; /用于计数、判断时间使用unsigned char Ir_Code=0x00,Flag=0,Keycode=0xff,Flag1=0; /Flag1用来标志有按键按下了,Flag用来判断是否需要发送红外载波信号,Keycode用来记录按键值LeadCode=0,Data=0x00,DataNum=0,FirstNum=0,ReceiveData8=0; /
11、LeadCode用来标记引导码判断是否成功,Data用来接收红外数据,DataNum表示已经接收了多少位数据了,FirstNum表示是否为第一次产生中断,ReceiveData用来存储数码管显示的数据 unsigned char Code4=0x02,0xbd; /用来存放将要发送的数据,前两位为地址码,固定的,后两位数据为命令码,互为相反unsigned char Keytable44 = 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00; /键值查找表
12、 /*延时函数*/void Delayus(unsigned int x) while(x-); /*/*红外发射的部分*/void Send_Data(unsigned char Data) /发送八位数据的函数 unsigned char i; for(i=0;i<8;i+) Flag=1; /置Flag为1,表明需要发送红外载波 TR0=1; /打开定时器0 Count1=0; /计数值赋为.0 while(Count1<20); /判断是否已经发送了0.56ms的高电平 Flag=0;Ir_out=1;Count1=0; /此时不需要再发送红外载波了,Flag=0 if(D
13、ata&0x01) /取数据的最低位进行发送 while(Count1<63); /数据为1则发送1.68ms 的低电平 else while(Count1<20); /数据为0则发送1.68ms 的低电平 TR0=0; /关闭定时器0 Data=Data>>1; /要传送的数据右移,取下一位 void Send(unsigned char * Code) /开始发送,先发引导码 Flag=1; /打开定时器0产生38KHZ的红外载波并计数 TR0=1; Count1=0; while(Count1<345); /判断是否已经发送了9ms的高电平 Flag
14、=0; /此时发送低电平,定时器0只用来定时作用 Ir_out=1; /关闭红外发射 Count1=0; while(Count1<174); /判断是否已经发送了4.5ms低电平 TR0=0; Ir_Code=*Code; /Ir_Code用来存放当前要发送的数据 Send_Data(Ir_Code); /调用发送八位数据的函数,先发送地址码 Ir_Code=*(Code+1); Send_Data(Ir_Code); Ir_Code=*(Code+2); Send_Data(Ir_Code); /再发送命令码的源码 Ir_Code=*(Code+3); Send_Data(Ir_Co
15、de); /然后发送命令码的反码 /*/*并显示的部分*/void Display() /显示接收到的红外数据 CH452_Write(CH452_DIG7 | ReceiveData7); /数码管的DIG7、DIG6显示命令码的反码CH452_Write(CH452_DIG6 | ReceiveData6);CH452_Write(CH452_DIG5 | ReceiveData5); /数码管的DIG5、DIG4显示命令码的源码 CH452_Write(CH452_DIG4 | ReceiveData4); CH452_Write(CH452_DIG3 | ReceiveDat
16、a3); /数码管的DIG3、DIG2、DIG1、DIG0显示2个字节的地址码CH452_Write(CH452_DIG2 | ReceiveData2);CH452_Write(CH452_DIG1 | ReceiveData1);CH452_Write(CH452_DIG0 | ReceiveData0); /*/*红外接收解码*/void Receive(void) switch(DataNum) /判断已经接收到多少为数据,对已经接收到的数据进行校验 case 8: ReceiveData0=Data&0x0f; /由于数码管只能显示0f之间的数值,所以要将8位的数进行拆分 R
17、eceiveData1=Data>>4; if(ReceiveData0!=0x02|ReceiveData1!=0x00) /由于前十六位为地址码,对于同一个发射器,应该将其的地址码设为一个固定不变的,解码时,判断接收到的数据是否与规定的地址码相同,不同则表示接收到的数据错误,将变量赋为初始值,准备接收下一次的红外信号 LeadCode=0; Data=0x00; DataNum=0; FirstNum=0; break; case 16: ReceiveData2=Data&0x0f; ReceiveData3=Data>>4; if(Recei
18、veData2!=0x0d|ReceiveData3!=0x0b) LeadCode=0;Data=0x00; DataNum=0; FirstNum=0; break; case 24: ReceiveData4=Data&0x0f; ReceiveData5=Data>>4; break; case 32: ReceiveData6=Data&0x0f; / 判断命令码是否相反,不是则不正确 ReceiveData7=Data>>4; if(ReceiveData4!=ReceiveData6|ReceiveData5!=ReceiveData7)
19、DataNum=0; Data=0x00; FirstNum=0; LeadCode=0; break; void Decode(void) /解码函数 TR1=0; /此时关闭定时器 switch(LeadCode) /在没有判断引导码的情况下,先判断引导码是否正确 case 0: if(TH1>=0x12&&TH1<=0x15) /判断时间是否为4.5ms左右,是则说明此时接收到的的确是引导码,LeadCode设为1,下一次进入时,则进行数据的判断 LeadCode=1; break; case 1: if(TH1>=0x03&am
20、p;&TH1<=0x05) /1.12ms左右表示接收到的数据为0 Data>>=1;DataNum+; else if(TH1>=0x06&&TH1<=0x08) /2.24ms左右表示接收到的数据为1 Data>>=1;Data|=0x80;DataNum+; else /两个时间范围都不是,则表示接收到的数据不正确,重新开 DataNum=0;FirstNum=0;LeadCode=0; Receive(); break; if(DataNum=32) /当数据接收完之后,将变量赋为原值,以便下一次接收 Da
21、taNum=0;FirstNum=0;LeadCode=0; TH1=0x00; / 判断一次数据之后,/TH1、TL1赋为0x00,重新进行计数,用于下次判断时间 TL1=0x00; TR1=1; /*/*初始化*/void Init8259a() /8259A的初始化 ADR_8259AE=ICW1; /写入初始化命令字 ADR_8259AO=ICW2; ADR_8259AO=ICW4; ADR_8259AO=OCW1; /写入操作命令字 ADR_8259AE=OCW2; void Init() /初始化函数 Init8259a(); /调用8259A中断控制器的初始化 TMO
22、D=0x12; /定时器0工作方式2、计时,定时器1工作方式1、计时 TH0=230; /定时器0初始值为230,即26us中断发生一次 TL0=230; TH1=0x00; /定时器1的初始值 TL1=0x00; ET0=1; /定时器中断允许位打开 EX1=1; /外部中断1允许 IT1=1; /外部中断1为上下降沿触发 EA=1; /总中断允许位打开 /*/*主程序*/void main() CH452_Write(CH452_SYSON2); /打开CH452的数码管显示和按键扫描的功能 CH452_Write(CH452_BCD); /启动CH452的自动解码功能 CH452_Wri
23、te(CH452_DIG0 | 0); /数码管初始显示0 Init(); /调用初始化函数 Delayus(500); /延时一段时间 while(1) Delayus(100); if(Flag1) /已经有按键被按下了,准备发送红外数据 ADR_8259AO=0xfd; /写OCW1此时不再接收按键的中断 Code2=Keycode; /命令码的原码 Code3=Keycode; /命令码的反码 Send(Code); /调用红外发送函数,传递的参数为数据的首地址 Display(); /显示内容 ADR_8259AO=0xfB; /打开8259A的按键中断,关闭8259A的红外/ 中断 Flag1=0; /清除按键标志位 Delayus(500); /*中断服务函数*/void Timer1_Isr(void) interrupt 1 /定时器0中断服务程序,产生/38KHZ的红外信号 Co
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 云存储服务合同协议2026年存储
- 2026年医疗用地土地流转经营合同协议
- 2026年医药冷链仓库租赁合同
- 商铺租赁合同2026年税务承担
- 2026年2026年干货供应合同协议
- 家装修介绍教学课件
- 2026届新高考英语冲刺复习 读后续写-逆推
- 家政服务员安全卫生课件
- 家务培训课件
- 培训讲座心理课件
- 2025年宁波市数据局直属事业单位公开招聘工作人员笔试历年典型考题(历年真题考点)解题思路附带答案详解
- 2025秋苏少版七年级上册美术期末测试卷(三套)
- 2026年及未来5年市场数据中国EPP保温箱行业市场调研及投资战略规划报告
- 2025锦泰财产保险股份有限公司招聘理赔管理岗等岗位54人(公共基础知识)综合能力测试题附答案解析
- 2025浙江宁波象山县水质检测有限公司招聘及对象笔试历年参考题库附带答案详解
- 光伏屋面施工专项安全方案
- 2026年黑龙江农业工程职业学院单招综合素质考试题库附答案
- 四川农商银行2026年校园招聘1065人考试题库附答案
- 2026年度交通运输部所属事业单位第三批统一公开招聘备考笔试试题及答案解析
- 2025秋学期六年级上册信息科技期末测试卷附答案(苏科版)
- 广西壮族自治区公安机关2026年人民警察特殊职位招聘195人备考题库及1套完整答案详解
评论
0/150
提交评论