单片机课程设计红外遥控_第1页
单片机课程设计红外遥控_第2页
单片机课程设计红外遥控_第3页
单片机课程设计红外遥控_第4页
单片机课程设计红外遥控_第5页
已阅读5页,还剩52页未读, 继续免费阅读

下载本文档

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

文档简介

单片机课程设计课题名称: 基于单片机的多功能红外遥控设计使用仪器及编号:Proteus7.5仿真软件【摘要】本课题将通过Proteus软件来绘制原理图,然后设计一个红外遥控器:原理图分为两个部分,发送数据方和接收数据方,其间的硬件连接方式为无线的红外遥控功能,利用红外遥控功能需要对数据进行编码和解码。通过按不同的按键来使蜂鸣器产生不同的音调,另外有播放音乐的功能;并且还可以控制DA转换电路产生方波,同时可以改变它的频率。本次课程设计的主要目的是为了锻炼学生独立思考、合作解决问题以及动手操作能力;也旨在对本门课程的巩固与提高。这次设计的任务是能掌握单片机电路设计的基本方法以及能正确的使用仿真软件对单片机线路进行调试。本设计是由硬件单片机和软件汇编语言进行结合产生的一个实际的产品,从教学的要求上实现了从理论到实践的过程。【关键词】:单片机、红外遥控目录TOC\o"1-5"\h\z\o"CurrentDocument"一、 绪论 11.1红外遥控背景及目的 12.国内外研究状况 2\o"CurrentDocument"二、 课程设计的目的 2\o"CurrentDocument"三、 课程设计需要的元器件清单 3\o"CurrentDocument"四、 51单片机原理介绍 3ATB8C51单片机简介 3时钟电路 5复位电路 6\o"CurrentDocument"五、 红外遥控原理及简介 65.1..红外遥控原理 6数据格式 7编码与解码 7\o"CurrentDocument"六、 软件设计 86.1.程序流程图 86.2Proteus仿真电路图 106.3仿真结果及硬件实现的功能 11\o"CurrentDocument"七、 设计遇到的问题及解决方法 12\o"CurrentDocument"八、 设计的总结、改进意见与展望 12\o"CurrentDocument"九、 心得体会 13\o"CurrentDocument"十、参考文献 13十一、附件:程序清单 141红外编码程序 1411.2红外解码程序 1811.3针对遥控器的解码 29一、绪论1.1红外遥控背景及目的遥控技术发展只有几十年的历史:本世纪20年代,才刚刚出现无线电遥控的雏形。那时,人们试图将遥控技术应用于无人驾驶飞机和舰船上,但由于技术不够完善而未能成功。二次世界大战以后,遥控技术发展迅速,并逐渐在军事、国防、工农业生产以及科学技术等方面得到广泛的应用。到现今,随着电子技术的飞速发展,新型大规模遥控集成电路的不断出现,使得遥控技术有了日新月异的发展。遥控装置的中心控制部件已从早期的分立元件逐步发展到集成电路、大规模集成电路、超大规模集成电路,智能化程度大大提高。近年来,遥控技术在工业生产、家用电器、安全保卫以及人们的日常生活中使用越来越广泛。在无线遥控领域,目前常用的遥控方式主要有超声波遥控、红外线遥控、无线电遥控等。由于红外遥控的设计制作简单方便,易于操作,因而成为遥控的主要方式,在国防、军事、生产、建设和日常生活中有极广泛的应用。为此,在前人研究的基础上设计出了一种红外遥控多通道控制系统的设计方法。研究表明,采用该方法设计的红外遥控控制系统控制方便,适用于含有较多受控电器的场合,可实现多路多功能控制。红外通信以红外线作为通信载体,通过红外线在空中的传播来传输数据,它由红外发射器和红外接收器来完成。在发射端,发送的数字信号经过适当的调制编码后,送入电光变换电路,经红外发射管转变为红外光脉冲发射到空中;在接收端,红外接收器对接收到的红外光脉冲进行光电变换,解调译码后恢复出原信号。红外通信作为一种数据传输手段,可以在很多场合应用,如家电产品、娱乐设施的红外遥控,水、电、煤气耗能计量的自动抄表等。红外通信有着成本低廉、连接方便、简单易用和结构紧凑的特点,因此在小型的移动设备中获得了广泛的应用。通过红外接口,各类移动设备可以自由进行数据交换。红外接口是目前在世界范围内被广泛使用的一种无线连接技术,被众多的硬件和软件平台所支持;通过数据电脉冲和红外光脉冲之间的相互转换实现无线的数据收发。1.2国内外研究状况自从1800年英国天文学家F-W-赫歇尔发现红外辐射至今,红外技术的发展经历了将近两个世纪。从那时开始,红外辐射和红外元件、部件的科学研究逐步发展,但发展比较缓慢,直到1940年前后才真正出现现代的红外技术。当时,德国研制成硫化铅和几种红外透射材料,利用这些元、部件制成一些军用红外系统,如高射炮用导向仪、海岸用船舶侦察仪、船舶探测和跟踪系统,机载轰炸机探测仪和火控系统等等。其中有些达到实验室试验阶段,有些已小批量生产,但都未来得及实际使用。此后,美国、英国、前苏联等国竞相发展。特别是美国,大力研究红外技术在军事方面的应用。目前,美国将红外技术应用于单兵装备、装甲车辆、航空和航天的侦察监视、预警、跟踪以及武器制导等各个领域。红外技术发展的先导是红外探测器的发展。1800年,F-W-赫歇尔发现红外辐射时使用的是水银温度计,这是最原始的热敏型红外探测器。1830年以后,相继研制出温差电偶的热敏探测器、测辐射热计等。在1940年以前,研制成的红外探测器主要是热敏型探测器。19世纪,科学家们使用热敏型红外探测器,认识了红外辐射的特性及其规律,证明了红外线与可见光具有相同的物理性质,遵守相同的规律。它们都是电磁波之一,具有波动性,其传播速度都是光速、波长是它们的特征参数并可以测量。20世纪初开始,测量了大量的有机物质和无机物质的吸收、发射和反射光谱,证明了红外技术在物质分析中的价值。30年代,首次出现红外光谱代,以后,它发展成在物质分析中不可缺少的仪器。40年代初,光电型红外探测器问世,以硫化铅红外探测器为代表的这类探测器,其性能优良、结构牢靠。50年代,半导体物理学的迅速发展,使光电型红外探测器得到新的推动。到60年初期,对于1〜3、3〜5和8〜13微米三个重要的大气窗口都有了性能优良的红外探测器。在同一时期内,固体物理、光学、电子学、精密机械和微型致冷器等方面的发展,使红外技术在军、民两用方面都得到了广泛的应用。二、课程设计的目的通过这次课程设计,实现了以学生为主体、教师为主导的实验教学理念,使学生加强对单片机原理应用的理解,学会查寻资料、方案比较,以及设计计算等环节。进一步提高分析解决实际问题的能力,创造一个动脑动手、独立开展仿真电路实验的机会,锻炼分析、解决单片机应用的实际本领,真正实现由课本知识向实际能力的转化;通过典型电路的设计与制作,加深对基本原理的了解,增强学生的实践能力,增强学生的团结协作的能力;本次设计还是对本门课程的巩固与提高并真正的实现了从理论到实践的过渡。由本次课程设计的题目可知是关于红外遥控功能的研究,因此对于此方面的知识也进行了开拓了解。三、 课程设计需要的元器件清单AT89C51单片机两块蜂鸣器一个PC机一台(安装有Proteus7.5软件)按键板一块DAC0832一块示波器两台电源若干红外遥控指示灯一对四、 51单片机原理介绍4.1AT89C51单片机简介AT89C51有PDIP,PLCC,TQFP三种封装方式,其中最常见的就是采用40PIN封装的双列直接PDIP封装,下面有AT89C51的基本结构图(见图4-1)。芯片共有40个引脚(见图4-2),引脚的排列顺序为从靠芯片的缺口左边那列逆时针数起,依次为1,2,3,4・・・40,其中芯片的1脚顶上有一个凹点(见图4-2)。在单片机的40个引脚中,电源引脚2根,外接晶体振荡器引脚2根,控制引脚4根以及4组8为可编程I/O引脚32根。主电源引脚(2根)VCC:电源输入,接+5V电源GND:接地线外接晶振引脚(2根)XTAL1:片内晶振电路的输入端XTAL2:片内晶振电路的输出端控制引脚(4根)RST/VPP:复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。ALE/PROG:地址所存允许信号。PSEN:外部存储器读选通讯信号。EA/VPP:程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。可编程输入/输出引脚(32根)AT89C51单片机有4组8为可编程I/O口,分别为P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。每一根引脚都可以编程,比如用来控制电机、交通灯等,开发产品时就是利用这些可编程引脚来实现我们想要的功能。图4-1AT89C51基本结构图F1.口匚1 40JVccPl.1匚2 39JPO.O/ADOF1.2C3 332FO.1/AD1F1.3匚4 371FO.2/AD2F1.4匚5 3&1FO.3/AD3P1.5C6 35]PO.4/AD4P1.&C7 34JPO.5/AD5P1.7C8 33JFD.&/ADGBESETCH 32JFO.T/AD7KKE/F3.0匚10 311EA/VppTKE/F3.1匚11 301ALE/FEJOGTN70/P3.2匚12 酒]PSENIHTI/P3.3匚13 MJP2.7/AD15T0/P3.4匚14 27JP2.&/AD14T1/F3.5匚15 2&3F2.5/AD13TO7F3.&匚16 251F2.4/AD12RD/F3.7匚17 241P2.3/AD11KTAL2匚1S 23]FA2/AD10KTAL1匚19 22JP2.1/AD9FDIF Vee匚20 21JP2.0/AD8图4-2AT89C51单片机引脚配置图(1) P0□:8位双向I/O口线,名称为P0.0-P0.7(2) P1口:8位准双向I/O口线,名称为P1.0-P1.7(3) P2□:8位准双向I/O口线,名称为P2.0-P2.7(4) P3□:8位准双向I/O口线,名称为P3.0-P3.74.2时钟电路XTAL1和XTAL2引脚分别为单片机内反相放大器的输入/输出端,其频率范围为1.2〜12MHz。XTAL2又是内部时钟发生器的输入端,这个内部反相器可与外部元件组成的振荡器(见图4-3)。采用石英晶体振荡器时,C=(3010)pF;在任何情况下,振荡器始终驱动内部时钟发生器向主机提供时钟信号,因为时钟发生器的输入是个二分频触发器,所以对外部振荡信号的脉宽无特殊要求,但必须保证高低电平的最小宽度。XTAL2JITLTL日1i:L¥材XTALLAT89C51图4-3单片机振荡电路4.3复位电路单片机的复位电路都是靠外部电路来实现的,在时钟电路工作后,只要单片机的复位引脚(RET)上出现2个机器周期以上的高电平,单片机就实行初始化复位,其复位电路见图3-4。复位脉冲信号使PC指针指向0000H单元;复位脉冲信号使SFR得到固定的初始值。五、红外遥控原理及简介5.1红外遥控原理红外线是一种电磁波,具有与无线电波及可见光一样的本质。人的眼睛能看到的可见光按波长从长到短排列,依次为红、橙、黄、绿、青、蓝、紫。其中红光的波长范围为0.62〜0.76um;紫光的波长范围为0.38〜0.46um。比紫光波长还短的光叫紫外线,比红光波长还长的光叫红外线。红外线的波长在0.76〜100um之间,位于无线电波与可见光之间。红外线遥控就是利用波长为0.76〜1.5um之间的近红外线来传送控制信号的。红外线遥控器是以红外线发光LED,发射波长940nm的红外线不可见光,来传送信号。整个遥控器系统分为发射端及接收端两部分,发射端经过红外线发射LED送出红外线控制信号,这些信号经过红外线接收模块接收端接收进来,并对其控制信号做译码而做相对的动作输出完成遥控的功能。红外线遥控器已被广泛使用在各种类型的家电产品上,它的出现给使用电器提供了很多的便利。红外遥控系统一般由红外发射装置和红外接收设备两大部分组成。红外发射装置又可由键盘电路、红外编码芯片、电源和红外发射电路组成。红外接收设备可由红外接收电路、红外解码芯片、电源和应用电路组成。通常为了使信号能更好的被传输发送端将基带二进制信号调制为脉冲串信号,通过红外发射管发射。常用的有通过脉冲宽度来实现信号调制的脉宽调制(PWM)和通过脉冲串之间的时间间隔来实现信号调制的脉时调制(PPM)两种方法。在同一个遥控电路中通常要使用实现不同的遥控功能或区分不同的机器类型,这样就要求信号按一定的编码传送,编码则会由编码芯片或电路完成。对应于编码芯片通常会有相配对的解码芯片或包含解码模块的应用芯片。在实际的产品设计或业余电子制作中,编码芯片并一定能完成我们要求的功能,这时我们就需要了解所使用的编码芯片到底是如何编码的。只有知道编码方式,我们才可以使用单片机或数字电路去定制解码方案。下面收集整理的一些常用遥控编码芯片的编码方式和常用一体化接收芯片的引脚示意图。5.2数据格式数据格式包括了引导码、用户码、数据码和数据码反码,编码总共占32位。数据反码是数据码反相后的编码,编码时可用于对数据的纠错。示意图如图5-1。注意:第二段的用户码也可以在遥控应用电路中被设置成第一段用户码的反码。5.3编码与解码(1)0和1的编码遥控器发射的信号由一串0和1的二进制代码组成.不同的芯片对0和1的编码有所不同。通常有曼彻斯特编码和脉冲宽度编码。本次设计采用脉冲宽度调制,其)码和1码如图5-2所示(以遥控接收输出的波形为例)。0码由0.56ms低电平和0.56ms高电平组合而成.脉冲宽度为1.12ms.1码由0.56ms低电平和1.68ms高电平组合而成.脉冲宽度为2.24ms。在编写解码程序时.通过判断脉冲的宽度,即可得到0或1。当我们按下遥控器的按键时,遥控器将发出一串二进制代码,我们称它为一帧数据。根据各部分的功能。可将它们分为5部分,分别为引导码、地址码、地址码、数据码、数据反码。遥控器发射代码时.均是低位在前。高位在后。引导码的低电平为9ms,高电平为4.5ms。当接收到此码时.表示一帧数据的开始。单片机可以准备接收下面的数据。地址码由8位二进制组成,共256种,地址码重发了一次。主要是加强遥控器的可靠性,如果两次地址码不相同,则说明本帧的数据有错误,应丢弃,不同的设备可以拥有不同的地址码。因此,同种编码的遥控器只要设置地址码不同,也不会相互干扰。本次设计将两个地址码统称为用户码,为了方便起见都设为0。在同一个遥控器中,所有按键发出的地址码都是相同的。数据码为8位,可编码256种状态,代表实际所按下的键。数据反码是数据码的各位求反,通过比较数据码与数据反码,可判断接收到的数据是否正确。如果数据码与数据反码之间的关系不满足相反的关系,则本次遥控接收有误.数据应丢弃。在同一个遥控器上.所有按键的数据码均不相同。六、软件设计6.1程序流程图流程图如图6-1和图6-2。图6-1为编码流程图,开机时单片机进行初始化操作,一切都回归到原始位置,这时单片机开始扫描键盘是否有按键按下,然后发出相应的脉冲。图6-2为解码流程图,接收方单片机则进行等待,一旦收到引导电平就开始进行接受信号并进行相应的解码,通过P1口使蜂鸣器发出对应的音符,通过DA转换电路输出波形。

开始图6-1红外编码流程图图6-2红外解码流程图6.2Proteus仿真电路图由于电路图版面过于大,所以我将一个完整的原理图分成两个部分来演示,两个部分由U1单片机的P3.0口的IR引脚和U2单片机的P3.2口的IR引脚连接进行数据传输,在实际硬件中是通过无线的红外遥控连接的。原理图第一部分是红外遥控发送方,通过单片机将数据编码成不同的脉冲宽度再从IR口将其传输出去。如图6-3所示,其是由一个AT89C51单片机的P1.1口到P1.7口对应连接到一个遥控键盘上,为遥控键盘输入口;P3.0口为红外遥控发送口连接到接收方单片机的P3.2口,用来传输数据。第一部分主要功能就是对按键进行相应的编码,然后通过IR端即P3.0口发送。原理图第二部分是红外遥控接收方,利用单片机内部定时器判断脉冲宽度解码成对应二进制码。如图6-4所示:如上所述,单片机U2的P3.2口作为脉冲输入口并控制产生外部中断,而P1.4口用来与蜂鸣器连接,产生声音;单片机U2的P0口以及P2.7、P3.6与DAC0832连接产生方波。图6-3仿真原理电路图1:红外遥控发送方

U2MTWJZ点一ASTPtiIJIADl网明>D2PO3MD3网4AD4即EUADfliFVHMC&MT1AD?2Q互31pSemU2MTWJZ点一ASTPtiIJIADl网明>D2PO3MD3网4AD4即EUADfliFVHMC&MT1AD?2Q互31pSemALEEAP2D!ABP21而P2.2TA1I3P5.3/A11P2,4W12P2.W13P?HM14P2.7W15PgP1.1Pi?Pl.SP1.4PiSPl.ftP1.7哼g#口P3.1/TXD知卧NTQPliMWTlP34TQ凹"PSftMft:P37/RDAT99C51PROGRAM^•JE.HJLLULl_|□此示波器为方波显示器此示波器为按键码脉冲显示器图6-4仿真原理电路图2:红外遥控接收方6.3仿真结果及硬件实现的功能根据设计原理,我们按下不同按键会产生不同的作用:按键板的1到8是简易的电子琴功能,分别发出do、re、mi、fa、so、la、xi的音调,为了便于观察按键的脉冲,我们用一个示波器连接到IR端口,如图6-5是按键4对应的脉冲图形。9键则是报警并停止工作。*键为演奏音乐,乐谱可在程序中自行修改;0键产生方波频率也可在程序中修改参数改变波形,#键可控制方波频率,并可自行设置增加上限和减少下线。图6-5仿真过程中按键4对应的脉冲七、设计遇到的问题及解决方法在大课程设计的设计过程中,遇到的问题还不少,主要问题还是在源程序编写的过程中,而硬件方面由于电路图不是很复杂,就问题不大。着重说一下源程序方面的问题:第一,时序问题很难掌握,这个要求对汇编语言掌握很熟练,每一步都要很清楚要执行的是什么功能,产生的结果是什么;第二,对单片机功能的掌握,怎样设置才能使其正常工作;第三,软件硬件之间的结合使寻找问题变得困难,我们既可以修改硬件,也可以修改软件,在具体的实际中要看具体情况,硬件需要付出财力,而软件则需要付出运行速度,所以必须结合实际来看。解决问题的方法:现在仿真软件为我们设计提供了很大方便,我们不需要不断修改硬件而是在仿真通过以后直接产生硬件,这样会很便捷,省时省力。源程序出现问题,我们就用单步执行的方法,通过对照寄存器的值,来寻找错误,这个方法很有效。还有对单片机的设置可以通过查看其他的典型的例子,经典程序还有查阅资料可以慢慢解决。解决的关键是要能把软件和硬件对应,解决一些配置管脚还有值的问题。八、设计的总结、改进意见与展望(1)总结:经过这次单片机大作业的设计,并且通过查阅其他不同于课本的资料书以后,对知识有了更深的理解。在设计以及在撰写报告时,我认为需要更多的是耐心与细心以及对整个过程的认真态度,这样才能学到东西。设计的基础是理论,只有理论扎实了,才能做更深层次的东西。这次课程设计主题是红外遥控设计,主要围绕单片机及红外遥控原理、发声原理、源程序编写开展的。对设计人要求有扎实的理论基础,有够硬的实际操作能力与分析能力以及遇到问题解决的能力。总之这次大作业设计让我受益匪浅。(2)改进意见:通过这次课程设计我觉得有一些自己的想法,我认为老师可以提前给一些方案以供其他学生参考,同时老师也可以给学生一些资料比如往年学生的样本或者一些技术性的资料。当然这也可以老师安排上课时间进行一下培训,或许大家做出来的会更好。(3)展望:我希望以后的课程设计如果工作量不是太大,可以要求一个人一组,这样大家都可以得到锻炼,其实说起来是一组的人一起做,可是大学3年以来,我发现学校里说是一组有多人的,也基本是一个人做,其他人就是所谓的“抱大腿”,我觉得这样不好。我认为只有努力了,有所收获才是在学校我们应该做的事情,而有时候甚至什么都没做的却比努力做的学生成绩要好,这样不是就使大家的积极性降低了,如何能既培养合作能力,又能避免有些投机取巧的做法,真的是一个很难的问题。九、心得体会经过将近两星期的课程设计周,当调试出来自己想要的音乐时,还是很有成就感的。但是在这次课程设计的设计过程中,感觉自己所学的知识还是很欠缺,这次是大家一起做出来的东西,每个人都有自己的分工,这也同时培养了我们怎样才能通过团队各取所长,更好地实现任务、要求。从开始的连具体的方案都在迷茫,到最后在老师的提示下完成时,我感觉,自己的努力没有白费。在课程设计之前,通过各个渠道查找资料后分析验证,经过多次的修改和整理,才作了如上的设计思路。但在实际操作中,出现了比较大的问题,不过通过老师的指点和自己努力的调试,还是解决了问题。最后的是调试问题:理论的计算在实际电路上有时候并不能实现要求,需要耐心与细心,才能慢慢调试出满意的电路。这次的课程设计我感觉收获很多,首先我将单片机的知识又加深了一些,其次是培养了我的动手操作能力、分析问题、解决问题的能力。同时我也明白了,不论是学习,工作还是为人处世,认真便是成功的法宝,如果浮躁,遇见问题就放弃,我觉得是很难把事情做成功的。总之我感觉这次大作业设计很有意义,或许是我即将迈入社会的一个过渡。不止是知识层面,对于做人我也是有很深的体会。同时也特别感谢老师的细心教导,让我们学到很多东西。十、参考文献[1]单片机原理及其接口技术/胡汉才编著.一北京:清华大学出版社,2004(第二版)⑵单片机原理与应用/赵德安等.编著.一北京:机械工业出版社,2004MCS-51单片机原理及应用/赵晓安等编著.一天津:天津大学出版社,2001.3(第一版)单片机原理实用教程:基于Proteus虚拟仿真/徐爱钧编著.一3版.一北京:电子工业出版社,2014.7MCS_51单片机原理及应用/康维新主编.一北京:中国轻工业出版社,2009.1十一、附件:程序清单11.1红外编码程序:#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint#defineuintlongunsignedlongsbitp3_0=P3人0;sbitp2_1=P2人1;//sbitout=PSW人7; 〃位的等同方式//sfrcy=PSWA7;sbitp1_0=P1A0;//?sbitp1_1=P1A1;sbitp1_2=P1A2;sbitp1_3=P1A3;bitout;uintkeyvalue=0x00,flag_key=0,value1,value2,keycount=0,i,j,flag_set=0,flag_press=0;〃根据键盘定义的键的码值ucharcodekeycode[4]={0x7f,0xbf,0xdf,0xef};ucharcodeportvalue[16]={0x0a,0x00,0x0f,0x0a,0x07,0x08,0x09,0x0b,0x04,0x05,0x06,0x0c,0x01,0x02,0x03,0x0f};ucharcodewy[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};〃红外数据部分;ucharuser1=0x00,user2=0x00;〃用户码标志位0和1uintcount=0,endcount=0;uintirdata=0;voiddeltime(void);〃函数声明voidkey_scan(void);voidsendirdata(void);main(void)//主函数{EA=1;//允许CPU中断TMOD=0x11;//设定时器0和1为16位模式1允许所有中断,两个定时器工作在定时模式ET0=1;〃定时器0中断允许p3_0=1;P1=0xff;//悬空状态TH0=0xFF;TL0=0xE4;//2人16=65536-28us/(12/12M)=0xffe4每隔26us中断一次TR0=0;//运行控制器;GATE=0TR0=0禁止T0计数while(1){key_scan();〃扫描按键函数,看有没有按键按下下边有子函数if(flag_press==1){flag_press=0;TR0=1;sendirdata();}}voidkey_scan(void)//子函数:扫描按键函数,看有没有按键按下{for(i=0;i<=3;i++){P1=keycode[i];if(p1_3==0)//键盘第一列{keycount=i*4+0;flag_key=1;break;}if(p1_2==0){keycount=i*4+1;flag_key=1;break;}if(p1_1==0){keycount=i*4+2;flag_key=1;break;}if(p1_0==0){keycount=i*4+3;flag_key=1;break;}}if(flag_key==1){flag_key=0;value1=P1;deltime();value2=P1;if(value1==value2){keyvalue=portvalue[keycount];flag_set=1;flag_press=1;}wh=e(f-aglseu{Va-ue2npl;if(va-uelITva-ue2)

f-aglse-3voidde-ume(vo.d){uinik;for(k3kAH20_k+i={)voidHmeoinKVo.d)inierrupi1{thohoxff;TLOHOXEy1、、沛ffl宜Bf甘38K成郅湖®ffl26us-fl-果—咨COU2.++)voidsencnrdaar()、、^®^^}s^陈93.0口萍甫uchars=0,datapd=0;〃发送9ms起始码的低电平,这里设置了一个346,如果每隔26us中断一次,那么9ms就是346次endcount=346;p3_0=0;count=0;do{}while(count<endcount);〃发送4.5ms的结果码高电平endcount=173; //173通过接收端得测试得到的数据count=0;p3_0=1;do{}while(count<endcount);〃发送用户码1 由于已经设置了用户码分别为0和0所以这里直接发送,这里连发//16个位0。〃如果用户码不一样,这里就要进行修改了。for(s=0;s<=15;s++){///下面发送0.56ms低电平和0.56ms高电平 21和64为计算电平时间的数据endcount=21;count=0;p3_0=0;while(count<endcount);endcount=21;count=0;p3_0=1;do{}while(count<endcount);}〃发送数据,21和64为计算电平时间的数据irdata=keyvalue;for(s=0;s<=7;s++){datapd=irdata&wy[s];if(datapd==0){endcount=21;count=0;}else{endcount=64;count=0;}p3_0=0;do{}while(count<endcount);〃发送公共的0.56ms高电平endcount=21;count=0;p3_0=1;do{}while(count<endcount);}〃发送数据反向irdata=keyvalue;for(s=0;s<=7;s++){datapd=irdata&wy[s];if(datapd==0){endcount=64;count=0;}else{endcount=20;count=0;}p3_0=0;do{}while(count<endcount);〃发送公共的0.56ms高电平endcount=20;count=0;p3_0=1;do{}while(count<endcount);}TR0=0;//不允许计数11.2红外解码程序COUNTEQU30H;定时计数数值FLAG_USER1EQU45H;用户码位置1FLAG_USER2EQU46H;用户码位置2SAVEDATAEQU47H;数据保存位置ORG0000HLJMPMAINORG0003HLJMPEXTER0INTORG000BHLJMPTIMER0INTORG001BHLJMPSONGORG1000HMAIN:MOVP1,#0MOVTMOD,#01H;定时器0模式1MOVTH0,#0FFH;定时100usMOVTL0,#9CHSETBEA;允许中断SETBIT0;外部中断0边沿触发万式,负跳变有效SETBET0SETBET1;允许中断SETBEX0MOVR0,52H;接收的数据8个一组所存放的起始位置MOV52H,#00H;先进行清零MOV53H,#00HMOV54H,#00HMOV55H,#00HMOV51H,#00H;中间数据存储单兀

MOVCOUNT,#00H;@30H=00HMOVR1,#08H;设定接收的数据8个一组MOVR2,#02H;设定接收的数据组为4个。CLRPSW.5;数据接收标志CLRPSW.1;数据处理标志MOVFLAG_USER1,#00H;设定用户码为0.MOVR4,#78HMOVR3,#02HMOV26H,R3 ;@R3=@26HLOOP:JNBPSW.1,$;判断是否进行数据处理。为1则进行处理,反之等待LCALLDATACHULI;数据处理。主要进行用户码判断以及数据和数据反码的判断;用户码判断,根据编码,用户码1和用户码2均为0,所以这;里我们只判断用户码1和接受的用户码数据CLRPSW.1;清零等待下一组数据的接收MOVA,SAVEDATAENDLOOP:;@47H=ALJMPLOOP;外部中断0部分,将数据转化为不同的音调EXTER0INT:CLRP1.4MOVTH0,#0FFHMOVTL0,#9CH;定时100usSETBTR0;允许T0计数SETBET0;允许定时器溢出中断MOV30H,#00H;30H为计数值RETI

TIMER0INT:;定时100us;定时100usMOVTL0,#9CHINC30H ;注意,count要在外部中断开始后设定初始值为0;;起始码的判断,计数数值在85-95之间,采集端口是否发;生变化,发生变化了,可以认为可以接受数据了SETBP3.2MOVC,P3.2JBPSW.5,DATARECEIVEPD;如果为1,表明可以进入数据接收判;断位置,否则还是引导码处的判断JNCENDTIMER0INTMOVA,30H ;在试验中了解到,COUNT=115为9ms的数值;0.56ms和1.68ms对应的count分别为6和16CLRCSUBBA,#90JCENDTIMER0INT ;如果C为1,说明不符合引导码的9ms,直接退出,;否则符合引导时间,准备接受数据SETBPSW.5CLRTR0SETBPSW.5CLRTR0MOVR1,#08HMOV51H,#00HMOVR0,#52HMOVR2,#04HLJMPENDTIMER0INT;以免接收数据;表示要接收的数据8个一组;中间数据存储清零;总共接收4组DATARECEIVEPD:;数据接收JNCENDTIMER0INT织为1,表明状态发生变化,可以对计数值进行判断接收;的位是0还是1CLRTR0MOVA,30HCLRTR0 ;清除TR0即关掉定时器0SUBBA,#10 ;以10为分界线,小于10则为0,大于10我们认为接收的;是1JCORECEIVE ;小于8为0则跳到接收位0处SETBC ;CY=1MOVA,51H ;接收位为1RRCAMOV51H,ALJMPWENDPDORECEIVE:CLRC ;接收位为0MOVA,51HRRCAMOV51H,AWENDPD:DJNZ:R1,ENDTIMER0INTMOVR1,#08HMOV@R0,51H ;重点:重复2次,确保值写到单兀里MOV@R0,51H ;@R0=@51HINCR0MOV51H,#00H ;@51H=00HDJNZR2,ENDTIMER0INT ;若不为0说明4组数据还未接收完则跳转到终端结束CLRPSW.5SETBPSW.1ENDTIMER0INT:

RETI;中断返回DATACHULI:MOVA,52HRETI;中断返回DATACHULI:MOVA,52HCLRCSUBBA,FLAG_USER1JNZENDDATACHULI;以设置其他MOVA,54HANLA,55HJNZENDDATACHULIMOVA,54HMOVSAVEDATA,ASUBBA,#0JZSQ2;与用户码进行比较,本用户码设置的是0,当然也可;判断数据接收的是否正确;将数据保存起来;判断保存的值是否为0MOVA,SAVEDATASUBBA,#15JZADJMOVA,SAVEDATASUBBA,#9JZMUSICMOVA,SAVEDATASUBBA,#11JZADJT2MOVA,SAVEDATALJMPQNEXT:MOV52H,#00H ;先进行清零MOV53H,#00HMOV55H,#00HENDDATACHULI:RETADJ:LJMPADJ1 ;功能应用程序部分SQ2:LJMPSQADJT2:LJMPADJT;基本单位延时子程序:DELAY:MOVR7,#02H;fosc=12MHz时延时187毫秒JNBPSW.5,D2CLRP1.4CLRTR1LJMPNEXTD2: MOVR0,#187JNBPSW.5,D3CLRP1.4CLRTR1LJMPNEXTD3: MOVR3,#248DJNZR3,$JNBPSW.5,D4CLRP1.4CLRTR1LJMPNEXTD4: DJNZR0,D3DJNZR7,D2DJNZR6,DELAY ;决定节拍RET;音乐产生程序SETBEA;写入口控制字,16位定时方式;开中断SETBET1MOV30H,#00H;取简谱码指针NEXT1:MOVA,30H ;简谱码指针装入入MOVDPTR,#TABLE2;从TABLE处取简谱码MOVCA,@A+DPTRMOVR2,A;取得的简谱码暂存于R2JZEND0;是否取到结束码00H?ANLA,#0FH;不是,则取节拍码MOVR6,A;节拍码存于R6MOVA,R2;将简谱码装入ASWAPA;高、低4位交换ANLA,#0FH;取音符码JNZSING;取得的音符码是否为0?CLRTR1;是则不发音LJMPD1;跳转到D1SING:DECA;取得的音符码减1(不含0)MOV22H,A;存入22H单元RLA;乘2MOVDPTR,#TABLE1;到TABLE1中取相对的高位字节值MOVCA,@A+DPTRMOVTH1,A;取得的高位字节装入TH0和21H单元MOV24H,AMOVA,22H;再装入取得的音符码RlA;乘2INCA;加1MOVCA,@A+DPTR;到TABLE1中取相对的低位字节值

MOVTL1,AMOV23H,ASETBTR1;取得的高位字节装入TL0MOVTL1,AMOV23H,ASETBTR1;取得的高位字节装入TL0和20H单元D1: LCALLDELAYINC30HJNBPSW.5,NEXT1CLRP1.4CLRTR1LJMPNEXTEND0: CLRTR1LJMPMUSICSONG: PUSHACCPUSHPSWMOVTL1,23HMOVTH1,24HCPLP1.4POPPSWPOPACCRETI;基本单位时间1/4拍;取简谱码指针加1延时187毫秒;取下一个码;停止T0;重复循环;重设定时初值;恢复现场;中断返回;波形产生部分ADJT:JBP1.2,ADJT1MOVA,R4ADDA,#10MOVR4,ACJNER4,#0FAH,SQSETBP1.2LJMPSQADJT1:MOVA,R4SUBBA,#10MOVR4,ACJNER4,#0,SQCLRP1.2LJMPSQSQ:MOVDPTR,#7FFFH;DAC0832地址SQ1:MOVA,#0MOVX@DPTR,ALCALLDELAY1MOVA,R4MOVX@DPTR,ATIM1:LCALLDELAY2DJNZR3,TIM1MOVR3,26HJNBPSW.5,SQ1LJMPNEXTADJ1:JBP1.1,ADJ11MOVR3,26HINCR3MOV26H,R3CJNER3,#10,SQSETBP1.1LJMPSQADJ11:MOVR3,26HDECR3CJNER3,#01H,SQCLRP1.1LJMPSQ;电子琴部分Q:MOVTMOD,#01HCLRET0MOV60H,SAVEDATAMOVA,60HRLAMOV60H,AMOVDPTR,#TABLEMOVCA,@A+DPTRMOV21H,AMOVTH0,AINC60HMOVA,60HMOVDPTR,#TABLEMOVCA,@A+DPTRMOV20H,AMOVTL0,AMOVR5,#0F0HSETBTR0TIM:JNBTF0,$CLRTF0PUSHACCPUSHPSWMOVTL0,20HMOVTH0,21HCPLP1.4POPPSWPOPACCMOVA,SAVEDATADJNZR5,TIMCLRP1.4LJMPNEXT;音符对应的定时器初值表:TABLE1:DW64260,64400,64521,64580DW64684,64777,64820,64898DW64968,65030,65058,65110DW65157,65178,65217;音符节拍表:TABLE2:DB44H,54H,64H,44HDB44H,54H,64H,44HDB64H,74H,88HDB64H,74H,88HDB82H,92H,82H,72H,64H,44HDB82H,92H,82H,72H,64H,44HDB44H,84H,48HDB44H,84H,48HDELAY1:MOVR6,#01HDD1:MOVR7,#64HDD2:NOPNOPNOPDJNZR7,DD2DJNZR6,DD1RETDELAY2:MOVR6,#01HDD3:MOVR7,#64HDD4:NOPNOPNOPDJNZR7,DD4DJNZR6,DD3RETTABLE:DB00H,00H,0FCH,44H,0FCH,0ACH,0FDH,09HDB0FDH,34H,0FDH,82H,0FDH,0C8H,0FEH,06HDB0FEH,22H,00H,00H,0FEH,22HEND11.3 针对遥控器的解码程序:#include<reg52.h> 〃包含单片机寄存器的头文件#include<intrins.h>〃包含_nop_()函数定义的头文件sbitIR=P3"2; //将IR位定义为P3.2引脚sbitRS=P2"0; //寄存器选择位,将RS位定义为P2.0引脚sbitRW=P2”1; 〃读写选择位,将RW位定义为P2.1引脚sbitE=P2”2; 〃使能信号位,将E位定义为P2.2引脚sbitBF=P0”7; 〃忙碌标志位,,将BF位定义为P0.7引脚sbitBEEP=P3"6;//蜂鸣器控制端口P36unsignedcharflag;unsignedcharcodestring]]=("1602IR-CODETEST");unsignedchara[4]; 〃储存用户码、用户反码与键数据码、键数据反码//a是定义的数组,a0和a1是用户码和地址码,//a2和a3是数据码和数据反码也就是对应的键值,unsignedintLowTime,HighTime;//储存高、低电平的宽度unsignedcharTHA;unsignedcharTHB;*****************************************************un函数功能:延时1ms***************************************************/unsignedintcodetab[]=//这个是每个音标对应的计数值{64580,64684,64777,64820,64898,64968,64400,65058};voiddelay1ms(){unsignedchari,j;for(i=0;i<10;i++)for(j=0;j<33;j++);}/*****************************************************函数功能:延时若干毫秒入口参数:n***************************************************/voiddelay(unsignedcharn){unsignedchari;for(i=0;i<n;i++)delay1ms();/*********************************************************/voidbeep() 〃蜂鸣器发声函数(unsignedchari;unsignedcharbemp;unsignedcharkey;bemp=a[2];〃把a2赋值给bemp,通过筛选bemp的值来确定key的值,再用key的值查表得到不同音标的计数值switch(bemp)(case0x0c:key=0;break;case0x18:key=1;break;case0x5e:key=2;break;case0x08:key=3;break;case0x1c:key=4;break;case0x5a:key=5;break;case0x42:key=6;case0x52:key=7;break;}THA=tab[key]/256;THB=tab[key]%256;TR1=1;for(i=0;i<150;i++)(while(TF1==0);TF1=0;BEEP=!BEEP;TH1=THA;TL1=THB;}BEEP=0; 〃关闭蜂鸣器TR1=0;delay(250); 〃延时}*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。result=1,忙碌;result=0,不忙***************************************************/unsignedcharBusyTest(void)(bitresult;RS=0; 〃根据规定,RS为低电平,RW为高电平时,可以读状态RW=1;E=1; //E=1,才允许读写_nop_(); //空操作_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间result=BF;//将忙碌标志电平赋给resultE=0;returnresult;}/*****************************************************函数功能:将模式设置指令或显示地址写入液晶模块入口参数:dictate***************************************************/voidWriteInstruction(unsignedchardictate)(while(BusyTest()==1);//如果忙就等待RS=0; 〃根据规定,RS和R/W同时为低电平时,可以写入指令RW=0;E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,//就是让E从0到1发生正跳变,所以应先置〃0〃nop_();_nop_(); //空操作两个机器周期,给硬件反应时间P0二dictate; 〃将数据送入P0口,即写入指令或地址_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; 〃当E由高电平跳变成低电平时,液晶模块开始执行命令}*****************************************************函数功能:指定字符显示的实际地址入口参数:x***************************************************/voidWriteAddress(unsignedcharx)(WriteInstruction(x|0x80);〃显示位置的确定方法规定为"80H+地址码x”}/*****************************************************函数功能:将数据(字符的标准ASCII码)写入液晶模块入口参数:y(为字符常量)***************************************************/voidWriteData(unsignedchary)(while(BusyTest()==1);RS=1; //RS为高电平,RW为低电平时,可以写入数据RW=0;E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,//就是让E从0到1发生正跳变,所以应先置〃0〃P0=y; 〃将数据送入?0口,即将数据写入液晶模块_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}*****************************************************函数功能:对LCD的显示模式进行初始化设置***************************************************/voidLcdInitiate(void)(delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间WriteInstruction(0x38);//显示模式设置:16X2显示,5X7点阵,8位数据接口delay(5); 〃延时5msWriteInstruction(0x38);delay(5);WriteInstruction(0x38);delay(5);

WriteInstruction(0x0C);//显示模式设置:显示开,有光标,光标闪烁delay(5);WriteInstruction(0x06);//显示模式设置:光标右移,字符不移delay(5);WriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除delay(5);************************************************************函数功能:对4个字节的用户码和键数据码进行解码说明:解码正确,返回1,否则返回0出口参数:dat*************************************************************/bitDeCode(void)unsignedchari,j;unsignedchartemp; //储存解码出的数据for(i=0;i<4;i++) 〃连续读取4个用户码和键数据码for(j=0;j<8;j++)//每个码有8位数字for(j=0;j<8;j++)//每个码有8位数字temp=temp>>1;//temp中的各数据位右移一位,因为先读出的是高位数TH0=0;〃定时器清0TL0=0;〃定时器清0TR0=1;//开启定时器T0while(IR==0)TH0=0;〃定时器清0TL0=0;〃定时器清0TR0=1;//开启定时器T0while(IR==0)〃如果是低电平就等待〃低电平计时TR0=0;〃关闭定时器TR0=0;〃关闭定时器T0LowTime二TH0*256+TL0; //保存低电平宽度TH0=0; //定时器清0TL0=0; //定时器清0TR0=1; //开启定时器T0while(IR==1)//如果是高电平就等待;TR0=0; 〃关闭定时器T0HighTime

温馨提示

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

评论

0/150

提交评论