通信原理课程设计-红外遥控贪食蛇.docx
基于红外遥控的点阵贪食蛇 通信系统原理课程设计基于51单片机和红外遥控的点阵贪食蛇 院系: 惠州学院电子科学系 班级: 11电子信息工程1班 组员: 翁铢炜110703131 林贵玉110703122目录第一章 方案设计与论证1 1、 稳压电源模块方案论证12、 单片机的选择论证 23、 点阵驱动方案论证 2第二章 系统总体设计3第三章 红外遥控系统介绍41、 红外通讯原理42、红外遥控系统结构53、调制54、发射系统65、一体化红外接收头76、红外编码格式8第四章 硬件设计101、8X8 LED单色点阵的原理说明102、LED阵列驱动电路103、稳压电源电路104、蜂鸣器及其驱动电路115、红外接收模块电路116、单片机最小系统127、系统总原理图12第五章 软件设计141、主程序工作流程142、LED点阵初始化143、贪吃蛇的移动154、食物的随机出现155、红外遥控15第六章测试与调试17第七章总结19附录一 系统源程序20绪论:本文根据贪食蛇的游戏规则,主要阐述基于51单片机和红外遥控的点阵贪食蛇的设计方案及思路。本文以ATMEL AT89S52 单片机为控制核心,使用8*8点阵为显示模块,设计并实现贪食蛇最基本的功能。文章详细介绍了红外遥控贪食蛇的硬件电路和软件设计。硬件部分利用红外接收头的输出接在AT89C52单片机INT1中断口,通过跳变沿触发的方式来触发单片机INT1中断,从而可以对编码脉冲进行接收、存储和解码,然后根据对应的键值实现点阵上贪食蛇的各种运动变换。贪吃蛇,是一种益智小游戏。其游戏背景:蛇引诱夏娃吃了苹果之后,就被贬为毒虫,阴险的象征,而蛇吃东西是整只动物吞进去的,大概在文艺复兴的时候就有人发明了这么一种游戏,是现在贪吃蛇的前身,后来慢慢地发展成了现有的贪吃蛇游戏。其游戏规则比较简单,就是一条小蛇,不停地在屏幕上游走去吃屏幕上出现的食物,越吃越长,到了一定的长度之后,就可以进入下一关,越到后面的关卡蛇移动的速度越快,只要蛇头碰到四周的墙壁或者碰到自己的身体,小蛇就立即毙命并结束游戏。第一章 方案设计与论证:1、 稳压电源模块方案论证:常用的电源有串联型线性稳压电源(LM2940、7805等)和开关型稳压电源(LM2596、LM2575等)两大类。前者具有纹波小、电路结构简单的优点,但是效率较低,功耗大;后者功耗小,效率高,但电路却比较复杂,电路的纹波大。对于单片机,需要提供稳定的5V电源,由于LM2940的稳压的线性度非常好,所以选用LM2940对其进行供电。在本设计中,51单片机使用5V电源,电池使用7.2V电源。考虑到电源为充电电池组,额定电压为7.2V,实际充满电后电压则为7.0-7.3V,所以单片机及红外遥控模块需采用稳压后的5V电源供电。方案一: 使用三端稳压电路78XX系列,如7805。工作原理:是电流源型稳压电路,是通过调节输出电流来保证输出端电压的,其反馈量是电压,基准量也是电压,经过内部电路转化成反馈电流和基准旁路电流,其差值又去旁路内部电流源使输出电流满足端电压的稳定。方案二:使用LM2940低压差三端稳压路。综合两种方案考虑, LM2940比7805的转换效率高。7805直接输入不接输出的情况下,其内部还会有3mA的电流消耗(静态电流)。而LM2940的静态电流就比它远远小得多了。最终采用方案二。2、 单片机的选择论证 :方案一:AT89S52单片机是一种高性能8位单片微型计算机。它把构成计算机的中央处理器CPU、存储器、寄存器、I/O接口制作在一块集成电路芯片中,从而构成较为完整的计算机、而且其价格便宜。方案二:C8051F005单片机是完全集成的混合信号系统级芯片,具有与8051兼容的微控制器内核,与MCS-51指令集完全兼容。除了具有标准8052的数字外设部件,片内还集成了数据采集和控制系统中常用的模拟部件和其他数字外设及功能部件,而且执行速度快。但其价格较贵 以上两种方案综合考虑,选择方案一。3、 点阵驱动方案论证 :正向点亮一颗LED,至少也得1020毫安,若电流不够大,则LED不够亮。而不管是8051的输入/输出口,还是TTL、CMOS的输出端,其高态输出电流都不是很高,不过12毫安而已,因此,很难直接高态驱动LED。这时候就需要额外的驱动电路。方案一:采用74HC595芯片驱动LED有以下特点:速度较快,功耗较小,LED的数目多少随意,既可以控制共阴极的LED显示器,也可以控制共阳极的LED显示器,可以软件控制LED的亮度,还可以在必要的时候关断显示 (数据保留),以减小功耗,并可随时唤醒显示。用它设计的电路,不仅软硬件设计简单,而且功耗低,驱动能力强,占用的I/O口线较少,是一种造价低廉,应用灵活的设计方案。方案二:74HC573是8位三态锁存器。可锁存地址、数据、可作缓冲器用。.当锁存器的输入端出现有效信号,输入状态被锁存到输出端,直到下一个锁存信号到来时刷新。这里的三态,是指它的输出可以是“0”或“1”状态,又可以是高阻状态。高阻态相当于隔断状态,没有逻辑控制功能。74HC573有驱动能力.每个口输出电流可达正负35MA。综上考虑,74HC573虽然占用的IO口比74HC595多,但其输出电流较大,最终选择方案二。第二章 系统总体设计:本系统是基于红外遥控的点阵贪食蛇。主要实现以下几个功能:1、通过红外遥控器上的指定按键(上、下、左、右)控制点阵上的贪食蛇的前进方向;2、遥控器上有七个档位可以调节贪食蛇运动的速度,已达到调整游戏难度的效果;3、贪食蛇每前进一步,蜂鸣器响一次;4、贪食蛇且前进的方向不同,蜂鸣器响的声音不同(即频率不同);5、贪食蛇撞上“墙”或者“蛇本身”,游戏结束,回到初始页面;6、贪食蛇每“吃掉”一个食物,蛇本身长度加一个单位。本系统电路主要分为五个模块:稳压电源模块、红外遥控模块、单片机最小统模块、点阵及其驱动模块、蜂鸣器及其驱动模块。图2.1 系统总框图第三章 红外遥控系统介绍1、 红外通讯原理:红外遥控是单工的红外通信方式,本设计的红外遥控采用以通信方式为基础的红外遥控,而且本设计也使用了红外通信技术,故着重分析红外通信的基本原理。红外通信是利用红外技术实现两点间的近距离保密通信和信息转发。它一般由红外发射和接收系统两部分组成。发射系统对一个红外辐射源进行调制后发射红外信号,而接收系统用光学装置和红外探测器进行接收,就构成红外通信系统。红外线是波长在 750nm至1mm之间的电磁波,它的频率高于微波而低于可见光,是一种人的眼睛看不到的光线。红外通信一般采用红外波段内的近红外线,波长在 0.75um至 25um之间。红外数据协会(IrDA)成立后,为了保证不同厂商的红外产品能够获得最佳的通信效果,红外通信协议将红外数据通信所采用的光波波长的范围限定在 850 至 900nm之内。红外通信的基本原理是发送端将基带二进制信号调制为一系列的脉冲串信号(载波信号) ,通过红外发射管发射红外信号。常用的有通过脉冲宽度来实现信号调制的脉宽调制(PWM)和通过脉冲串之间的时间间隔来实现信号调制的脉时调制(PPM)两种方法。脉时调制(PPM)是红外数据协会(IrDA)和国际电子电工委员会(IEEE)都推荐的调制方式,本设计采用PPM调制方法,即用两个脉冲串之间的时间间隔来表示二进制信息,数据比特的传送仿照不带奇偶校验的RS232 通信,首先产生一个同步头,然后接着 8 位数据比特。如图3.1所示。图3.1 PPM 调制波形图普通的红外遥控采用面向指令的帧结构,数据帧由同步码,地址码和指令码组成,指令码长度多为 816 个比特,传送多字节遥控协议时效率偏低,而增加指令码的长度不利于接收器同步,为此本设计选用一种面向字节的帧结构,采用类似于异步串行通信的帧结构,每帧由一个起始位(二进制数 0) 、8 个数据位和 2 个停止位(二进制数 1)构成,如图 3.2 所示。每帧传送 1 个字节的数据,帧与帧间隔大于 2ms,帧结构不含地址信息,寻址问题由高层协议解决8。图 3.2 数据帧结构示意图由于红外光存在反射,在全双工的方式下发送的信号也可能会被本身接收,因此,红外通信应采用异步半双工方式,即通信的某一方发送和接收是交替进行的。2、红外遥控系统结构:红外遥控系统主要分为调制、发射和接收三部分,如图3.3 所示:图3.33、调制:红外遥控发射数据时采用调制的方式,即把数据和一定频率的载波进行“与”操作,这样可以提高发射效率和降低电源功耗。调制载波频率一般在30khz到60khz之间,大多数使用的是38kHz,占空比1/3的方波,如图3.4所示,这是由发射端所使用455kHz晶振决定的。在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷1237.9 kHz38kHz。图3.4 载波波形4、发射系统:目前有很多种芯片可以实现红外发射,可以根据选择发出不同种类的编码。由于发射系统一般用电池供电,这就要求芯片的功耗要很低,芯片大多都设计成可以处于休眠状态,当有按键按下时才工作,这样可以降低功耗芯片所用的晶振应该有足够的耐物理撞击能力,不能选用普通的石英晶体,一般是选用陶瓷共鸣器,陶瓷共鸣器准确性没有石英晶体高,但通常一点误差可以忽略不计。 红外线通过红外发光二极管(LED)发射出去,红外发光二极管内部材料和普通发光二极管不同,在其两端施加一定电压时,它发出的是红外线而不是可见光。 图3.5A 简单驱动电路 图3.5B 射击输出驱动电路如图3.5A和图3.5B是LED的驱动电路,图3a是最简单电路, 选用元件时要注意三极管的开关速度要快,还要考虑到LED的正向电流和反向漏电流,一般流过LED的最大正向电流为100mA,电流越大,其发射的波形强度越大。 图3.5A电路有一点缺陷,当电池电压下降时,流过LED的电流会降低,发射波形强度降低,遥控距离就会变小。图2.5B所示的射极输出电路可以解决这个问题,两个二极管把三级管基极电压钳位在1.2V左右,因此三级管发射极电压固定在0.6V左右, 发射极电流IE基本不变,根据IEIC,所以流过LED的电流也基本不变,这样保证了当电池电压降低时还可以保证一定的遥控距离。5、一体化红外接收头:红外接收电路通常被厂家集成在一个元件中,成为一体化红外接收头。内部电路包括红外监测二极管,放大器,限副器,带通滤波器,积分电路,比较器等。红外监测二极管监测到红外信号,然后把信号送到放大器和限幅器,限幅器把脉冲幅度控制在一定的水平,而不论红外发射器和接收器的距离远近。交流信号进入带通滤波器,带通滤波器可以通过30khz到60khz的负载波,通过解调电路和积分电路进入比较器,比较器输出高低电平,还原出发射端的信号波形。注意输出的高低电平和发射端是反相的,这样的目的是为了提高接收的灵敏度。一体化红外接收头,如图3.6所示: 图3.6 红外接收头 红外接收头的种类很多,引脚定义也不相同,一般都有三个引脚,包括供电脚,接地和信号输出脚。根据发射端调制载波的不同应选用相应解调频率的接收头。本设计选择HX1383,因为其性价比较高,且易于购得,如图3.7:图3.7 红外接收头内部放大器的增益很大,很容易引起干扰,因此在接收头的供电脚上须加上滤波电容,一般在22uf以上。有的厂家建议在供电脚和电源之间接入330欧电阻,进一步降低电源干扰。6、红外编码格式:遥控发射器专用芯片很多,红外遥控的编码目前广泛使用的是:NEC Protocol 的 PWM(脉冲宽度调制)和 Philips RC-5 Protocol 的 PPM,本设计基于NEC协议。其编码特征如下:、8 位地址和 8 位指令长度; 、地址和命令 2 次传输(确保可靠性) 、PWM 脉冲位置调制,以发射红外载波的占空比代表“0”和“1”; 、载波频率为 38Khz; 、位时间为1.125ms 或 2.25ms; NEC 码的位定义:一个脉冲对应 560us 的连续载波,一个逻辑 1 传输需要 2.25ms(560us脉冲+1680us低电平),占空比1/4;一个逻辑 0的传输需要 1.125ms(560us 脉冲+560us 低电平),占空比1/2。而遥控接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样,我们在接收头端收到的信号为:逻辑 1 应该是 560us 低+1680us 高,逻辑 0 应该是 560us 低+560us 高。 如图3.8 图3.8NEC 遥控指令的数据格式为:同步码头、地址码、地址反码、控制码、控制反码。同步码由一个 9ms 的低电平和一个 4.5ms 的高电平组成,地址码、地址反码、控制码、控制反码均是8 位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的可靠性(可用于校验)。如图3.9图3.9重复码:一个命令只发送一次,即使遥控器上的按键一直按着。但是会每110mS发送一次代码,直到遥控器按键释放。如图 3.10图3.10重复码比较简单:一个9mS的AGC脉冲、2.25mS间隔、560uS脉冲。如图图3.11本设计采用网上购买的LC7641芯片为内核的小型遥控器作为发送端,其编码基于NEC协议。接收端为HX1383,数据流入51单片机解码。第四章 硬件设计:1、8X8 LED单色点阵的原理说明:本设计采用的点阵显示模块是ARK-SZ411288K,其原理结构图如图1所示。ARK-SZ411288K显示模块是8*8点阵的显示模块,从图4.1中可以看出,8*8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的 二极管就亮。ARK-SZ411288K可与CPU直接连接,根据引脚说明,将其各个引脚与相应的I/O口连接。图 4.1 8*8LED点阵的原理图2、LED阵列驱动电路:采用74HC573进行驱动,其中Q0-Q7接口单片机P0口,D7-D0接入8X8点阵阳极,点阵的阴极各串入一个270欧的电阻后接到单片机P1口。如图4.2所示。3、稳压电源电路如下图:采用LM2940把7.2V的电源转成5V给系统进行供电。原理图如图4.3所示:图4.3对应的PCB如下图所示:对应的实物图如下图所示:4、蜂鸣器及其驱动电路设计如右图所示:由于蜂鸣器的驱动电流需要,直接接的话电流不够大,所以加上一个三极管对蜂鸣器进行驱动。5、红外接收模块电路如右图 所示:6、单片机最小系统电路如下图所示:7、系统总原理图如下图所示:系统总PCB如图所示:系统总实物图如图所示:第五章 软件设计1、主程序工作流程:主程序工作流程如图5.1所示,系统上电后首先对点阵LED进行初始化,接着对定时器初始化,并启动定时器,接着执行程序主体逻辑,程序主体逻辑执行一遍后检查是否有中断发生。中断源有两个,一个是驱动贪吃蛇自动前行的定时中断,另一个是用户控制贪吃蛇移动方向的红外接收模块中断,任意中断的到来都将改变贪吃蛇的当前状态。若当前没有中断发生,主程序继续判断蛇头是否碰壁或头尾相撞,若是,结束游戏,否则继续执行程序主体循环。图5.1 主程序工作流程2、LED点阵初始化:对点阵初始化,先把点阵所有的信息清空,让其不显示任何信息,再在指定的位置显示蛇所处的最初位置和第一个果实的位置。初始化程序如下:void Init()for (i = 3; i < SNAKE + 1; i+)/SNAKE是蛇的最大长度xi = 100;for (i = 3; i < SNAKE + 1; i+)yi = 100;/初始化x0 = 4; y0 = 4; /果子 n = 3; /蛇长 n=-1x1 = 1; y1 = 0; /蛇头x2 = 0; y2 = 0; /蛇尾1addx = 0; addy = 0; /位移偏移3、贪吃蛇的移动:当蛇没有吃到任何食物时,每次步进蛇头的将要到的下一个LED灯点亮,而蛇尾那个LED灯会灭掉,程序设计时只要将蛇尾那点位置的值传给蛇头下一个位置的值,再改变蛇尾的值即可。而蛇头下一个位置根据蛇头和偏移量来确定,每次上下左右对应的红外遥控按键决定了蛇步进的偏移量,只要将蛇头的位置加上偏移量的值即得到新的蛇头位置。当蛇头碰到四周的墙壁或者碰到自己的身体,小蛇就立即毙命并结束游戏。4、食物的随机出现:食物的出现是一种随机行为,所以必须做一个随机数,而且食物出现的位置不能与蛇的位置相同,也不能超出墙外,否则就要重置食物。这里使用程序中的定时计数器的低八位 TL0的数值,由于TL0不断变化,不同的时间点数值不同,我这里使用的是C+语言里的stdlib.h文件库,使用里面的随机函数srand(),先利用srand(TL0)获得TL0的数值,再利用两次rand()%8分别得到食物出现的横纵坐标的位置。5、红外遥控:参考红外遥控的数据手册和源程序,在对应的程序上进行应用。串行口初始化开始发射键按送数据到CPU串行口数据送完返回开始串行口初始化接收数据数据是否接完接收数据正确根据键值点阵进行对应的变化不处理返回主程序 遥控发射程序框图 遥控接收程序框图第六章测试与调试、稳压模块的调试:问题与解决办法:此模块由于在制作腐蚀板的过程中,在曝光的时候把菲林片的正反面颠倒,导致原本的底层变成了顶层,所以元器件在焊接的时候不得不在顶层焊接,造成了不便。用万用表测量没有短路或断路的现象,接入.的电源,测得输出电压为.,符合设计要求。心得:在制作腐蚀板的过程中,每个步骤都要确定无误之后再进行相应的操作,否则造成的后果往往不能挽回。、点阵模块的测试:问题与解决办法:由于在制作系统原理图和封装的时候,错以为点阵的引脚是按规则的从第脚排列到第脚,而没有考虑到其实点阵的引脚是不规则分布的。所以导致点阵不能直接插入已经腐蚀好的电路板上,最后不得不把点阵焊到万能板,然后再用杜邦线一根一根的把点阵的引脚和电路板上对应的引脚连接起来,造成了极大的不美观。连接好之后系统接上电源,可看出点阵的亮度适中,及点阵的驱动电路设计符合要求。心得:在进行系统设计的时候一定要弄清楚各元器件的原理,认真看其数据手册,再进行的设计,若有不确定的地方一定要询问清楚再所涉及。、下载器端口的测试:问题与解决办法:在系统设计的时候,单独引出了单片机中、四个口,方便使用下载器对单片机进行程序的烧录,省去拔掉单片机带来的不便,也使单片机不会因为这样而造成损坏。把系统和下载器连接好之后,连接到电脑进行程序的烧录,工作正常。心得:系统的设计要使系统在后期的调试和操作的时候使用起来方便和人性化。、系统腐蚀板的测试:问题与解决办法:使用万用表对系统的腐蚀板进行测试,方向有多处短路的现象。原因是因为中敷铜规则敷铜距离过近,导致在焊接元器件时经常会有焊锡粘到焊盘附件的铜,从而短路。最终使用美工刀对短路的地方进行修整,再次测试发现再无短路和断路现象。心得:加强对软件上各种实用规则的了解,并能进行运用、系统程序的调试:问题与解决办法:程序没有使用模块化编程,使程序整体感较乱,对语言的掌握仍然欠缺,特别是对函数和变量的调用,中断函数的使用。参考了很多百度上的一些资料和程序才最终写出了程序。心得:加强对语言的运用,掌握好的基本知识然后经常进行使用才能发现自身所欠缺的问题。6、本系统需要改进的地方:腐蚀板容易被氧化,导致某些地方存在不知原因的干扰;红外遥控与点阵的显示之间存在约0.5秒的误差;系统稳定性能较差,有时候会有莫名的错误出现。随机函数运用得不好,导致“食物”并没有真正的随机出现,而只是出现在了贪食蛇的尾部。第七章总结:通过此次课程设计,提高了我们对单片机编程的能力,对硬件电路的分析和应用。同时也获得的软件调试经验,进一步增强了我们对点阵和红外遥控模块的了解和应用。同时也加强了我们的实际编程能力,提高了对几个软件的应用,如、等。 在做本次课程设计的过程中,我们感触最深的当属查阅大量的设计资料了。为了让我们的设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少的。我们是在做通信原理课程设计,但我们不是艺术家,他们可以抛开实际尽情在幻想的世界里翱翔,而我们一切都要有据可依,有理可寻,不切实际的构想永远只能是构想,永远无法升级为设计。由于经验不足,理论方面也相应的存在不足,再加上条件有限,本设计中仍存在着一些设计方面的问题和缺陷,个人技能也有待提高,理论知识还要巩固加强。同时也让我们更加的知道了自己知识领域里的不足和缺陷。附录一:系统源程序#include <reg52.h>#include <intrins.h>#define NOP() _nop_() /* 定义空指令 */#define uchar unsigned char#define SNAKE 20 /最大长度#define TIME 50 /显示延时时间uchar xSNAKE+1;uchar ySNAKE+1; uchar time,n,i,e,FX,k; /延时时间,当前蛇长,通用循环变量,当前速度char addx,addy; /位移偏移量char SPEED; /速度控制sbit fengming=P35;extern unsigned char jieshou;extern unsigned char IRCOM7;typedef unsigned char uint8;typedef unsigned int uint16;void display(unsigned char Key_Val);extern void IRInit(); /extern 是引用IR.C中的函数/*蜂鸣器模块*/ void delay1(uint16 x)uint16 i,j;for(i = x; i > 0; i -)for(j = 8; j > 0; j -);void Play(uint8 t)uint8 i;for(i = 0; i <10; i +)fengming = fengming;delay1(t);/*红外遥控模块*/void display(unsigned char Key_Val) switch(Key_Val) case 0x18: FX=1; Play(1);break; case 0x08: FX=3; Play(2);break;case 0x5a: FX=4; Play(3);break;case 0x52: FX=2; Play(4);break;case 0x45: SPEED=80;break;case 0x46: SPEED=60;break;case 0x47: SPEED=40;break; case 0x44: SPEED=20;break;case 0x40: SPEED=10;break;case 0x43: SPEED=5;break;case 0x09: SPEED=3;break; /*贪吃蛇模块*/void delay(char MS)char us,usn;while(MS!=0)usn = 0;while(usn!=0)us=0xff;while (us!=0)us-;usn-;MS-;/*判断碰撞*/bit knock()bit k;k=0;if(x1>7|y1>7)k=1; /撞墙for(i=2;i<n;i+)if(x1=xi)&(y1=yi)k=1; /撞自己return k;/*上下左右键位处理*/void turnkey()/ interrupt 0 using 2 if(jieshou)if(FX=1)addy=0;if(addx!=1)addx=-1; else addx=1; if(FX=2)addy=0;if(addx!=-1)addx=1; else addx=-1;if(FX=3)addx=0;if(addy!=-1)addy=1; else addy=-1;if(FX=4)addx=0;if(addy!=1)addy=-1; else addy=1;/*乘方程序*/uchar mux(uchar temp) if(temp=7)return 128;if(temp=6)return 64;if(temp=5)return 32;if(temp=4)return 16;if(temp=3)return 8;if(temp=2)return 4;if(temp=1)return 2;if(temp=0)return 1;return 0;/*显示时钟 显示程序*/void timer0(uchar k)while(k-)for(i=0;i<SNAKE+1;i+)P0=mux(xi);P2=255-mux(yi);turnkey(); /上下左右键位处理delay(TIME); /显示延迟P2=0xff;P0=0x00; /* 主函数*/void main(void) IRInit(); e=SPEED; P0=0x00; P1=0xff; P2=0x00; SPEED=30; while(1) for(i=3;i<SNAKE+1;i+)xi=100;for(i=3;i<SNAKE+1;i+)yi=100;/初始化 x0=4;y0=4; /果子 n=3; /蛇长 n=-1 x1=1;y1=0; /蛇头 x2=0;y2=0; /蛇尾1 addx=0;addy=0; while(1)if(jieshou)break;timer0(1); /位移偏移 while(1) display(IRCOM2);timer0(e); if(knock()e=SPEED;break; /判断碰撞 if(x0=x1+addx)&(y0=y1+addy) /是否吃东西 n+; if(n=SNAKE+1) n=3;e=e-10; for(i=3;i<SNAKE+1;i+)xi=100; for(i=3;i<SNAKE+1;i+)yi=100; x0=xn-2; y0=yn-2; for(i=n-1;i>1;i-)xi=xi-1;yi=yi-1; x1=x2+addx;y1=y2+addy; /移动 #include <reg52.h>sbit IRIN = P32; /红外接收器数据线void IRdelay(char x); /x*0.14MSvoid beep();unsigned char IRCOM7; unsigned char jieshou=0;extern unsigned char Y0;extern void display(unsigned char Key_Val);/*/void IRInit() IE |= 0x81; /允许总中断中断,使能 INT0 外部中断 TCON |= 0x01; /触发方式为脉冲负边沿触发 IRIN=1; /I/O口初始化 /*