基于89C51单片机的红外遥控器的设计_第1页
基于89C51单片机的红外遥控器的设计_第2页
基于89C51单片机的红外遥控器的设计_第3页
基于89C51单片机的红外遥控器的设计_第4页
基于89C51单片机的红外遥控器的设计_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 绪论1.1 常见的遥控反方式简介当今社会电子技术飞速发展,新型大规模遥控集成电路不断出现,遥控技术的发展变得日新月异。遥控装置的中心控制部件已从早期的分立元件、集成电路逐步发展到现在的单片微型计算机,智能化的程度大大的提高了。这些年来,遥控技术在工业生产、家用电器、安全保卫以及 人们的日常生活中得到了越来越广泛的使用。常见的遥控方式一般有如下几种类型:光控方式、声控方式、无线电遥控方式、红外遥控方式等等1。光控方式:简单的光控电路是利用光敏管受光后内阻发生变化使电子开关的状态发生变化,传感器有光敏二极管、光敏三极管、光敏电阻、光敏电池等。不同的光敏元件有着 不同的光谱。所以光控光源既可以是可见光,也可以是红外线等不可见光源1。声控方式:声控就是用声音去控制对象动作完成操作,一般采用驻极体话筒或压电陶瓷片作为传感元件来拾取声音2。一般采用超声波控制和声频控制:采用超声波控制时可以防止外界音频干扰。采用超声波控制时大多数用在玩具生产等。无线电遥控方式:无线遥控是指实现对被控目标的非接触遥远控制,在工业控制、航空航天、家电领域应用广泛3。无线遥控和无线传输系统与有线和红外设备相比提高了移动自由度。由此使无线遥控装置和无线传输系统在工业领域的应用越来越多。相对电缆连线的优点在于安装成本低(无需布线、不用地下工程、没有电缆槽),提高了灵活性并降低了维护成本2。 无线电遥控电路较为电路复杂,但它的控制距离很远。无线电遥控近可以控制零点几米,远则可以超越地球到达太空!遥控系统一般由发射器和接收器两部分组成。发射器一般由指令键、指令编码电路、调制电路、驱动电路、发射电路等几部分组成。接收器一般由接收电路、放大电路、解调电路、指令译码电路、驱动电路和执行电路几部分组成4。当接收机收到发射机发出的无线电波以后驱动电子开关电路工作。所以它的发射频率和接收频率必须是完全相同的。红外遥控方式:红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中5。 红外线又称红外光波,在电磁波谱中,光波的波长范围为0.01um1000um红外遥控是利用波长为0.76m-1.5m之间的近红外线来传递控制信号的5。它具有以下特点:1红外线的波长较无线电波的波长小的多,因此,红外遥控不会干扰其它家用电器和无线电设备。2.因为它为不可见光,所以对人得生活和环境影响很小。3它具有很强的隐蔽性和保密性,可用于防盗,警戒等安全保卫。4结构简单,制作方便,成本低廉,抗干扰能力强,工作可靠性高等优点。5信号无干扰,传输准确度高6.无需专门申请特定频率的使用执照;7具有移动通信设备所必需的体积小、功率低的特点;8传输速率适合于家庭和办公室使用的网络1.2 红外遥控的发展过程1.2.1 红外线的发现公元1666年牛顿发现光谱并测量出3,900埃7,600埃(400nm700nm)是可见光的波长。1800年4月24日英国伦敦皇家学会的威廉赫歇尔发表太阳光在可见光谱的红光之外还有一种不可见的延伸光谱,具有热效应。他所使用的方法很简单,用一支温度计测量经过棱镜分光后的各色光线温度,由紫到红,发现温度逐渐增加,可是当温度计放到红光以外的部份,温度仍持续上升,因而断定有红外线的存在。在紫外线的部份也做同样的测试,但温度并没有增高的反应。紫外线是1801年由RITTER用氯化银感光剂所发现的。底片所能感应的近红外线波长是肉眼所能看见光线波长的两倍,用底片可以记录到的波长上限是13,500埃,如果再加上其它特殊的设备,则最高可以达到20,000埃,再往上就必须用物理仪器侦测了6。上个世纪的60年代初期,欧美等一些发达的国家就开始研究遥控技术,其主要是用于民用。但是当时技术比较落后,要就环境也不是很理想所以遥控技术的发展显得十分缓慢。到了70年代后大规模集成电路和计算机的出现,给遥控技术发展带来了动力,此时遥控技术得到了快速的发展。在遥控方式上大体经历了从有线到无线的超声波、再到红外线、这样几个阶段。无论采用那一种控制方式,能把信号准确无误的传输出去,最后得到令人满意的控制效果才是最重要的。起初的无线遥控采用的是电磁波来传输信号,但由于电磁波互相干扰,同时也影响到其它电器的运行,因此最后逐渐采用超声波和红外线来传输信号。但使用超声波传输信号时频带比较窄,所能携带的信息也不是很多,受到干扰时引起误动作。所以最后研究者把希望寄托于红外线,经研究证明红外线遥控是较为理想的是光控方式,逐渐采用红外线的遥控方式取代了超声波遥控方式,出现了红外线多功能遥控器,成为当今时代的主流,得到了越来越广泛的应用6。红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力,所以,在设计家用电器的红外线遥控器时,不必要像无线电遥控器那样,每套(发射器和接收器)要有不同的遥控频率或编码(否则,就会隔墙控制或干扰邻居的家用电器),所以同类产品的红外线遥控器,可以有相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。这对于大批量生产以及在家用电器上普及红外线遥控提供了极大的方面。由于红外线为不可见光,因此对环境影响很小,再由红外光波动波长远小于无线电波的波长,所以红外线遥控不会影响其他家用电器,也不会影响临近的无线电设备6。红外线在频谱上居于可见光之外,所以抗干扰性强,具有光波的直线传播特性,不易产生相互间的干扰,是很好的信息传输媒体,信息可以直接对红外光进行调制传输7。1.2.2 红外遥控器的基本原理红外遥控的发射电路是采用红外发光二极管来发出经过调制的红外光波;红外接收电路由红外接收器接收信号,它们将红外发射器发射雕红外光转换为相应的电信号,再送后置放大器8 9。 发射电路一般由指令键、单片机、指令编码系统、调制电路、驱动电路、发射电路等几部分组成。当按下指令键或推动操作杆时,指令编码电路产生所需的指令编码信号,指令编码信号对载体进行调制,再由驱动电路进行功率放大后由发射电路向外发射经调制定指令编码信号1 9。接收电路一般由接收电路、放大电路、调制电路、指令译码电路、驱动电路、执行电路等几部分组成1。接收电路将发射器发出的已调制的编码指令信号接收下来,并进行放大后送解调电路,解调电路将已调制的指令编码信号解调出来,即还原为编码信号。指令译码器将编码指令信号进行译码,最后由驱动电路来驱动执行电路实现各种指令的操作控制10 11。2 AT89C51介绍2.1简介89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器。89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。2.2 AT89C51主要性能(1) 4KB可改编程序Flash存储器 ,用于存放程序,一些原始数据和表格 (2) 三级程序存储器保密(3) 128 X 8字节内部RAM(4)4个8位并行I/O口,即可用作输入有可以用作输出(5) 2个16位定时器/计数器(6) 5个中断源,两个中断优先级的中断控制系统(7) 一全双工的串行I/O,用于实现单片机之间或单片机和PC机间的串口通信(8) 片内时钟振荡器和时钟产生电路(9)寿命:1000写/擦循环(10)数据保留时间:10年(11)全静态工作:0Hz-24MHz(12)低功耗的闲置和掉电模式AT89C51是用静态逻辑来设计的,其工作频率可下降到0Hz,并提供两种可用软件来选择的省电方式空闲方式和掉电方式。在空闲方式中,CPU停止工作,而RAM、定时器/计数器、串行口和中断系统都继续工作。在掉电方式中,片内振荡器停止工作,由于时钟被“冻结”,一切功能暂停,只保存片内RAM中的内容,直到下一次硬件复位为止4。2.3 AT89C51的引脚及功能2.3.1 AT89C51管脚和结构功能89C51单片机的管脚如图2.1所示:图2.1 89C51单片机的管脚89C51单片机的功能结构图如图2.2所示:图2.2 89C51单片机的功能结构图2.3.2主要引脚:VCC:电源端 VSS:接地端XTAL2 :接外部晶体和微调电容的一个引脚。在89C51片内它是振荡电路反相放大的输出端,振荡电路的频率就是晶体的固有频率。若采用外部时钟电路,则该角悬空。XTAL1:接外部晶体和微调电容的另一个引脚。在单片机内部,它是上述振荡器的反相放大器的输人端。采用外部振荡器时,此引脚输入外部时钟脉冲4。输入/输出引脚 P0.0 P0.7、P10.P1.7、P2.0 P2.7 和P3.0P3.7。P0端口(P0.0 P0.7): P0是一个8位漏极开路型准双向I/O端口。作为漏极开路的输出口用时,每位能驱动8个LS型个TTL负载。当作输入口使用时,应先向口锁存器写入1,此时P0口全部引脚悬空,又可作高阻抗输入端用。在访问外部程序和数据存储器时,它是分时多路转换的地址(低8位)/数据总线,在访问期间激活了内部的上拉电阻4。P1端口(P1.0 P1.7): P1是一个带有内部上拉电阻的8位双向I/O端口。P1的输出缓冲器可驱动4个TTL输入。对端口写1时,通过内部的上拉电阻把端口拉到高电位,这时可用作输入口。作输入口时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流4。P2端口 (P2.0P2.7): P2是一个带有内部上拉电阻的8位双向I/O端口。P2的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。对端口写1时,通过内部的上拉电阻把端口拉到高电位,这时可用作输入口。P2作输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流。在访问外部程序存储器和16位地址的外部数据存储器(如执行MOVX DPTR指令)时,P2送出高8位地址。在访问8位地址的外部数据存储器(如执行MOVX Ri , A指令)时,P2口引脚上的内容(就是专用寄存器(SFR)区中P2寄存器的内容),在整个访问期间不会改变4。P3端口(P3.0P3.7): P3 是一个带有内部上拉电阻的8位双向I/O端口。P2的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。对端口写1时,通过内部的上拉电阻把端口拉到高电位,这时可用作输入口。P3作输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流4。在AT89C51中,P3端口还用于一些专门功能,这些兼用功能如下:(1) P3.0 RXD(串行输入口)(2) P3.1 TXD(串行输出口)(3) P3.2 /INT0(外部中断0)(4) P3.3 /INT1(外部中断1)(5) P3.4 T0(记时器0外部输入)(6) P3.5 T1(记时器1外部输入)(7) P3.6 /WR(外部数据存储器写选通)(8) P3.7 /RD(外部数据存储器读选通)(9) P3口同时为闪烁编程和编程校验接收一些控制信号2.4 振荡器特性 XTAL1和XTAL2分别作为反向放大器的输入端和输出端。该反向放大器可以配置片内振荡器。石晶振荡和陶瓷振荡也均可采用。如采用外部时钟源驱动器件,XTAL2当处于空闲状态。由于输入至内部的时钟信号要经过一个二分频触发器,因此对外部时钟信号的脉宽没有任何要求,但是必须保证脉冲高低电平要求的宽度4 12。2.5 芯片擦除整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合, ALE管脚处于低电平10ms 来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行4。2.6 Protues开发环境简介用单片机开发出的产品,要实现它的功能,除了一些必要的硬件设备,软件也是必不可少的。单片机需要汇编语言源程序一般码有两种方法编写,一种是用C语言形式,另一种是用汇编程序。随着单片机开发技术的不断发展,普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,protues软件是目前最流行用于MCS-51仿真的单片机的软件,protues一出现就得到一些仿真厂商和用户的认可,它强大的仿真平台既方便又实用得到了广泛的支持。protues提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案。学习并熟练掌握这一软件的操作对于使用51系列单片机的爱好者来说是必不可少的,如果你使用C语言编程,那么protues几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。 2.7 C语言和汇编语言在开发单片机时的优点和缺点汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高。但是不同的CPU,其汇编语言可能有所差异,所以不易移植13。C语言是一种结构化的高级语言。其优点是可读性好,坚固性高,移植容易,能有效利用片上的RAM空间,能提供常用的标准函数库,以供用户直接使用,有严格的句法检查,错误很少,可容易地在高级语言的水平上迅速地被排掉,是普遍使用的一种计算机语言所以在本次在单片机设计中,将采用C语言作为程序语言。3 设计方案3.1发射和接受端结构图根据任务书的要求,当按下遥控按钮时,单片机产生相应的控制脉冲,由红外发光二极管发射出去。用单片机制作一个红外电器遥控器,可以控制8个二极管的发光。红外发射部分结构图如图3.1所示:单片机按键控制红外发射图3.1红外发射部分结构图当按下遥控按钮时,单片机产生相应的控制脉冲,由红外发光二极管发射出去。前八个按键按下第几个键,LED等从上到下逐个闪烁,最后停留在第几个LED灯处亮,后八个按键按下第几个键,LED等从下到上捉个闪烁发光,最后停留在第几个指定发光灯位置。红外接收部分结构图如3.2所示:单片机8个发光二极管闪烁发光红外接收图3.2红外接收部分结构图当红外接收器接收到控制脉冲后,经单片机处理由显示设备LED显示出当前按键的序号。3.2 红外遥控电路设计由于本次设计是为实现红无线外遥控功能,所以红外发射模块和红外接收模块必须单独设计。3.2.1 发射电路部分控制按键选择本次设计使用的电器元件较少,控制的LED灯也不是很多,所以采用简单的44集成键盘的16个键即可达到要求。频率发生选择采用一个12M晶体震荡器即可发出满足要求的频率。红外线的发射过程如下图:图3.3红外线的发射过程本遥控发射器采用码分制遥控方式,码分制红外遥控就是指令信号产生电路以不同的脉冲编码(不同的脉冲数目及组合)代表不同的控制指令14。在确定选择AT89C-51作为本设计发射电路核心芯片和集成键盘作为控制键后,加上一个简单红外发射电路和12M晶体震荡器便可实现红外发射。下图3.4为本红外遥控设计核心部分之一的发射电路原理图:图3.4发射电路原理图其中芯片端口P0.0至P0.7接44集成键盘的8个引脚,键盘上的16个键分别对8个LED灯进行控制,端口RST为单片机的复位脚,采用简单的RC上复位电路,端口P1.0作为红外线遥控码的输出口,用于输出40kHz载波编码,端口XTAL2和端口XTAL1接12MHz晶振. 晶体三极管主要用于放大电路中起放大作用,本设计采用的是一个NPN型的三级管9014,为了得到更大的放大倍数,采用了类似共射级接法9。因为从P1.0口出来的为高电压,而三级管9014不能承受此电压,所以选用了一个阻值较大的电阻对三级管9014起分压作用,从而缓冲了加到它上的电压。3.2.2接收部分单片机的选择接收端的设计所用到的输入输出端口不多,所以与发射部分一样,,用AT89C51单片机即可完成本设计,较其他单片机而言他具有较强的实用性和方便性。显示设备选择对于本次设计的遥控器接收电路来讲,在需要配置一些指示灯的前提下,只显示灯的亮灭就可以了,故用LED就够了。它具有成本低廉,配置灵活,与单片机接口方便,不需要专用的驱动程序,在设计程序时也非常简单的特点。红外遥控接收器的接收过程如下图所示:图3.5红外遥控接收器的接收过程接收端电路原理图如下: 图3.6红外遥控接收端电路原理图其中芯片端口P1.0至P1.7接8个LED灯,用来显示接收信号处理的结果。当红外接收器接收到发射端传来的控制脉冲后,经单片机处理由显示设备LED灯显示出当前按键的序号。P3.2接HOO38红外接收头,用来接收发射端的红外信号。HS0038工作频率为38 kHz,能对收到遥控信号进行放大、整形、检波、解调,得到TTL电平的编码信号,再送给单片机,单片机进行解码后并执行相关控制程序,它对外有3个引脚:VS、GND和1个脉冲信号输出引脚,使用方便,性能可靠14。4 编码与解码方法 4.1发射部分编码操作就是发射部分微处理器按照遥控指令把预先存储在ROM中的程序逐段调至RAM中暂时保存,以供逐步执行微处理器首先对输入的信号脉冲进行识别、处理然后执行相应的操作,完成所要求的每一种控制功能15。编码流程图如下:图4.1.编码流程图红外遥控信号采用自定义编码的方式,由发射端的单片机完成对此自定义编码的调制,当某一个被控电器的某一个按键开关被按下时,单片机先读出键值信号,然后单片机进行调制后,再调制成38kHz方波由红外线发光管发身出去16。HS0038红外接收器的红外接收频率为38 kHz,故采用占空比为1/3的38 kHz矩形波作为载波信号,其周期t=26s17。用低电平与高电平的波形宽度均等于0.26 ms的方波表示载波信号“1”,即高低电平的宽度均相当于10个38 kHz脉冲的宽度;用低电平的宽度为0.52 ms,高电平的宽度为026ms的方波表示载波信号“0”,即高低电平的宽度分别相当于10个和20个38 kHz脉冲的宽度18。用这种方法发射时,只需将发射的“1”或“0”与38 kHz载波信号相与即可。下图为二进制的编码和调制过程:图4.2二进制信号的调制帧结构的定义:引导码用户码控制码截止码19。在发送字节的开始先通过单片机发送20个脉冲(每个脉冲周期26s)作为传输开始,接着发送8位数据(字节高位在前,低位在后),高4位表示用户码,低4位表示控制码,最后发送10个脉冲的低电平作为传输结束20。图5为红外遥控数据帧格式。用户码是图4.3红外遥控数据帧格式对每个接收系统的标识,通过对用户码的检验,每个遥控器按键只能被其中一个接收器识别,从而控制相应的设备,有效地防止了多个设备之间的串扰。由于有4位用户码,所以系统理论上可以控制16个设备。图4.3红外遥控数据帧格式4.2 接收部分解码操作就是判断遥控指令或本机控制指令属于本系统的哪种控制功能,以便查找出相应的控制子程序21。然后在控制子程序指挥下处理数据并向接口电路输出控制信息,以实现各种控制功能24。一体化红外接收头HS0038的解调可理解为:接收到红外脉冲串时,输出低电平,否则输出高电平,显然输出的信号极性与发送信号的相反,所以解码时要将接收到的信号经过反向才能和发送信号编码一致23。当接收端接收到表示传输开始的同步帧后,接收单片机进入解码过程,解码采用软件抽样判决25。从上升沿开始,以15个脉冲为判决门限,在门限时刻读得低电平时,即可判定为编码“1”;在门限时刻读得高电平时,即可判定为编码“0”,解码1位后,需等到下一位的上升沿到来,再计数15个脉冲后,判断读得的电平是高还是低,进行解码24。如图4.4所示。接收完1帧信号后,接收单片机首先判断收到的用户码是否和自己的用户码一致,如果不一致,刚接收到的信号不可用,将进入下次数据的接收准备,直到一致为止。如果一致,则将对刚收到的控制码进行读取,并实现对相应的控制程序的调用,产生相应控制信号,对电器设备完成控制操作25。4.4解码波形示意图5 遥控发射及接收控制程序流程图5.1 红外遥控器发射程序图遥控发射部分的程序流程图如图5.1所示。首先初始化,然后按下其中一个键,单片机获取该键得信号号发出相应的控制信号。图5.1红外遥控器发射程序图 主程序的按键子程序流程如图5.2所示,首先初始化程序,然后调用键扫描处理子程序,再判断控制键是否按下,若有控制键按下则进行逐行扫描,按照P口值查找键号.最后按照键号转至相应的发射程序。图5.2发射部分按键子程序流程图5.2 红外遥控器接收流程图遥控接收部分的程序流程图如图5.3所示。首先初始化,单片机处理并判断接收到的控制信号,若获取按键的信号后执行相应的操作。图5.3红外遥控器接收主程序流程图 红外遥控器接收部分由信号接收子程序和信号解码执行子程序组成, 信号接收子程序负责初始化,不停地查询有无红外信号。信号解码执行子程序主要负责解码和执行解码信号。信号接收子程序流程图如图5.4所示信号解码执行子程序流程图如图5.5所示。图5.4信号接收子程序流程图图5.5信号解码执行子程序流程图6 仿真及结果图本设计采用protues软件仿真,仿真电路如图6.1所示:图6.1仿真电路图7 总结随着毕业的日子即将到来,毕业设计也基本上落定。在进行了长达三个月时间的摸索与实验,使我不仅仅很好的掌握了单片机入门软件与硬件的常用设计与功能,还使得我清楚的认识到对于一项设计研究制作过程必要的详细设计步骤和具体实现方法是很关键也是比不可少的,更是必须要掌握的。虽然开始对单片机设计比较陌生,设计过程中也遇到很多问题,但通过翻阅图书资料,与老师交流,与同学沟通学习,最终都迎刃而解。不过由于自己能力有限,当中的缺点还是无可非议的存在着。当然这次毕业设计中,宝贵的经验是我们最大的收获。本次设计不仅增强了我认识和处理问题的能力,不仅丰富了我大脑知识,明白了理论结合实践的含义,而且大大的提高了自己的动手能力和团队合作能力,最主要的是在大学生活中最好的一次培训,对进入社会奠定了很好的基础。总之,这次设计从硬件设计,电路设计,软件编写和调试,我都投入了大量的时间与心血。真是曾今为编写程序烦恼过,为某一个要求功能无法实现焦急过,为能不能顺利完成本次设计忧虑过,但最后还是一步步的走下去了,并且取得成功,这种成功的喜悦终生难忘。附录(程序清单)发射端程序:#include static bit OP; /红外发射管的亮灭static unsigned int count; /延时计数器static unsigned int endcount; /终止延时计数static unsigned char Flag; /红外发送标志char iraddr1; /十六位地址的第一个字节char iraddr2; /十六位地址的第二个字节void SendIRdata(char p_irdata);void delay();char getkey() P1=0xfe; if(!P1_4)return 1; if(!P1_5)return 2; if(!P1_6)return 3; if(!P1_7)return 4; P1=0xfd; if(!P1_4)return 11; if(!P1_5)return 12; if(!P1_6)return 13; if(!P1_7)return 14; P1=0xfb; if(!P1_4)return 21; if(!P1_5)return 22; if(!P1_6)return 23; if(!P1_7)return 24; P1=0xf7; if(!P1_4)return 31; if(!P1_5)return 32; if(!P1_6)return 33; if(!P1_7)return 34; P1=0xfF;P3_3=0; if(!P1_4)return 41; / if(!P1_5)return 42; / if(!P1_6)return 43; / if(!P1_7)return 44; / if(!P3_6)return 45; / if(!P3_7)return 46; / return 0;void main(void) char key; count = 0; Flag = 0; OP = 0; P3_4 = 1; EA = 1; /允许CPU中断 TMOD = 0x11; /设定时器0和1为16位模式1 ET0 = 1; /定时器0中断允许 P1=0xff; TH0 = 0xFF; TL0 = 0xE6; /设定时值0为38K 也就是每隔26us中断一次 TR0 = 1;/开始计数iraddr1=0xff; iraddr2=0xff;do key=getkey(); if(key=1)SendIRdata(0x12);/set if(key=11)SendIRdata(0x0b);/exit if(key=25|key=35)SendIRdata(0x1a);/+ if(key=15)SendIRdata(0x1e);/- if(key=6)SendIRdata(0x0e);/ if(key=16)SendIRdata(0x1d);/ MRCif(key=26)SendIRdata(0x1f);/ M- if(key=36)SendIRdata(0x1b);/ M+ if(key=32)SendIRdata(0x00);/0 if(key=22)SendIRdata(0x01);/1 if(key=23)SendIRdata(0x02);/2if(key=24)SendIRdata(0x03);/3 if(key=12)SendIRdata(0x04);/4 if(key=13)SendIRdata(0x05);/5 if(key=14)SendIRdata(0x06);/6 if(key=2)SendIRdata(0x07);/7 if(key=3)SendIRdata(0x08);/8if(key=4)SendIRdata(0x09);/9 if(key=21)SendIRdata(0x2A);/% if(key=5)SendIRdata(0x2B);/X if(key=33)SendIRdata(0x2C);/. if(key=34)SendIRdata(0x2D);/= if(key=31)SendIRdata(0x2E);/ if(key=41)SendIRdata(0x2F);/ if(key=42)SendIRdata(0x30);/ if(key=43)SendIRdata(0x31);/ if(key=44)SendIRdata(0x32);/ if(key=45)SendIRdata(0x33);/ if(key=46)SendIRdata(0x34);/ while(1); /定时器0中断处理 void timeint(void) interrupt 1 TH0=0xFF; TL0=0xE6; /设定时值为38K 也就是每隔26us中断一次 count+; void SendIRdata(char p_irdata) int i; char irdata=p_irdata; /发送9ms的起始码 endcount=223; Flag=1; count=0; P3_4=0; dowhile(countendcount); /发送4.5ms的结果码 endcount=117; Flag=0; count=0; P3_4=1; dowhile(countendcount); /发送十六位地址的前八位 irdata=iraddr1; for(i=0;i8;i+) /先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平) endcount=10; Flag=1; count=0; P3_4=0; dowhile(countendcount); /停止发送红外信号(即编码中的高电平) if(irdata-(irdata/2)*2) /判断二进制数个位为1还是0 endcount=15; /1为宽的高电平 else endcount=41; /0为窄的高电平 Flag=0; count=0;P3_4=1; dowhile(count1; /发送十六位地址的后八位 irdata=iraddr2; for(i=0;i8;i+) endcount=10; Flag=1; count=0; P3_4=0; dowhile(countendcount); if(irdata-(irdata/2)*2) endcount=15; else endcount=41; Flag=0; count=0; P3_4=1; dowhile(count1; /发送八位数据 irdata=p_irdata; for(i=0;i8;i+) endcount=10; Flag=1; count=0; P3_4=0; dowhile(countendcount); if(irdata-(irdata/2)*2) endcount=15; else endcount=41; Flag=0; count=0; P3_4=1; dowhile(count1; /发送八位数据的反码 irdata=p_irdata; for(i=0;i8;i+) endcount=10; Flag=1; count=0; P3_4=0; dowhile(countendcount); if(irdata-(irdata/2)*2) endcount=15; else endcount=41; Flag=0; count=0; P3_4=1; dowhile(count1; endcount=10; Flag=1; count=0; P3_4=0; dowhile(countendcount); P3_4=1; Flag=0;void delay() int i,j; for(i=0;i400;i+) for(j=0;j8 /time0,100us,红外遥控#define TIME0TL (65536-100*JINGZHEN/12)&0xff)#define TIME1TH (65536-5000*JINGZHEN/12)&0xff00)8 #define TIME1TL (65536-5000*JINGZHEN/12)&0xff)#define uchar unsigned char#define uint unsigned intuchar code table = 0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00;code uchar BitMsk=0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,;uint IrCount=0,Show=0,Cont=0;uchar IRDATBUF32,s20;uchar IrDat5=0,0,0,0,0;uchar IrStart=0,IrDatCount=0;void timer1int (void) interrupt 3 using 3 /定时器1EA=0;TH1 = TIME1TH; TL1 = TIME1TL;Cont+;if(Cont10)Show=1;EA=1;void delayms(uint z)uint i,j;for(i=z;i0;i-)for(j=124;j0;j-);void display(uchar dat)uchar tempdat,i;tempdat = dat&0x0f0;if(tempdat=0)/左移到某灯亮tempdat = dat&0x0f;for(i=0;i=tempdat;i-)P1 = tablei;delayms(1000);void timer0int (void) interrupt 1 using 1 /定时器0uchar i,a,b,c,d;EA=0;TH0 = TIME0TH; TL0 = TIME0TL;if(IrCount500)IrCount=0;if(IrCount300&IrStart0)IrStart=0;IrDatCount=0;IrDat0=IrDat1=IrDat2=IrDat3=0;IrCount=0;if(IrStart=2)IrStart=3;for(i=0;iIrDatCount;i+)if(i5&b16&b0&IrDatCount31) IrStart=2;TH0 = TIME0TH;TL0 = TIME0TL;EA=1;return; if(IrCount114&IrCount0)IrDatCount+;IrCount=0;TH0 = TIME0TH;TL0 = TIME0TL;EA=1;main()TMOD |= 0x011;TH0 = TIME0TH;TL0 = TIME0TL;ET0=1;TR0=1;ET1=1;TR1=1;IT0 = 1;/下降沿EX0 = 1;/initLCM();EA=1;for(;)if(Show=1)Show=0;Cont=0;switch (IrDat3) case 0x12:/ON/C display(0x01); break; case 0x0b:/ display(0x05); break; case 0x1a:/+ break; case 0x1e:/- break; case 0x0e:/ break; case 0x1d:/MRC break; case 0x1f:/M- break; case 0x1b:/M+ break; case 0x00:/0 if(IrDat2=0xff)display(0x16); break; case 0x01:/1 display(0x12); break; case 0x02:/2 display(0x13); break; case 0x03:/3 display(0x14); break; case 0x04:/4 display(0x06); break; case 0x05:/5 display(0x07); break; case 0x06:/6 display(0x08); break; case 0x07:/7 display(0x02); break; case 0x08:/8 display(0x03); break; case 0x09:/9 display(0x04); break; case 0x2A:/% display(0x11); break; case 0x2B:/X break; case 0x2C:/. display(0x17); break

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论