基于.STC89C52单片机地红外遥控系统.doc
信息工程学院电子信息系专业实训报告题目:基于题目:基于 STC89C52 单片机的红外遥控系统单片机的红外遥控系统专业班级:电子信息工程专业班级:电子信息工程 11 级级 1 班班学号:学号:1167118115姓名:郭晓伟姓名:郭晓伟指导教师:李建军指导教师:李建军题目题目 基于基于 STC89C52 单片机的红外遥控系统单片机的红外遥控系统实训目的:实训目的:通过对基于单片机的课程设计,使我们进一步熟悉和掌握单片机的结构及工作原理,掌握单片机的接口技术及相关外围芯片的特性和控制方法。并且通过对本次的课程实习,掌握以单片机为核心的电路设计的基本方法和技术。在课程设计中,我们亲自动手进行实际应用程序设计和调试,逐步掌握模块化程序设计方法和调试技术,熟练运用 DXP、protel99se 等类似的画图软件和编程软件 keil C 等,在设计各自的课题中,每位同学通过完成一个包括电路设计和程序开发的完整过程,使大家了解开发单片机应用系统的全过程,在自己的实践设计中熟练这门技术时,同时排除和解决设计中遇到的各种问题,这是在此次课程设计中,同学们得到的最大的收益,而且为今后从事相应工作打下基础。实训时间、地点:实训时间、地点:时间:2014 春学期 第 17.18 周地点:工程训练中心实验室实训内容:实训内容:摘要:单片机的广泛应用促进了设备和产品的微型化,数字化,自控化,和智能化。单片机的应用加深了计算机于自动化控制技术的结合,从而在自动控制领域里引发了一场对传统控制技术的革命,也就是单片机正从根本上改变着传统的控制设计思想和设计方法,是以往必须由模拟或数字电路实现的控制功能,现在可以通过软件方法实现了。红外遥控是一种被广泛使用的计算机技术,特别是在家电方面给人们带来了方便快捷的生活。红外遥控用到许多中断技术,计算机系统中,中断可以由各种硬件设备产生,以便请求服务或报告故障报警等。此外,中断也可以由处理器自身产生。外部中断请求有两种信号方式有电平方式和脉冲方式。电平方式的中断请求时低电平有效,脉冲的中断请求是脉冲的下降沿有效。我通过在图书馆查阅有关资料,并且设计出了合适的电路图,经过仔细研究并对电路图做了多次修改,满足了课题的要求,实现了红外遥控的目的。最后通过仿真器输入程序,手动中断,中断结束后,程序从断点处继续执行。中断的应用具有重要的意义,它大大提高了计算机效率。关键词:单片机;遥控器;STC89C52;红外遥控一一 引言引言以单片机为核心的控制系统,因为其实时控制功能强,可靠性高,实用性强,应用范围广等优点,得到了极为广泛的应用。随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中红外遥控就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。红外线遥控是目前使用最广泛的一种通信和遥控手段。由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。它的理论性和实践性都很强,我们在理论课学习中主要学习单片机的基本构造,各部分的工作原理以及指令系统,然而,光是理论的学习是远远不够的,最重要的是把理论和实践相结合。所以此次实习,通过设计一个基于 AT89S52 单片机的遥控器设计,以增进对单片机电路的感性认识,加深对理论方面的理解和巩固,了解和掌握软硬件设计过程、方法及实现,增强自己的动手和实践能力,为以后在工作和学习中,设计和实现应用系统打下良好基础。二二 单片机系统开发与应用工程实习要求及相关知识单片机系统开发与应用工程实习要求及相关知识2.1 单片机系统开发与应用工程实习的重要意义单片机是计算机技术、大规模集成电路技术和控制技术的综合产物。现在,凡是电脑控制的设备和产品,必有单片机嵌入其中,它早已成为人类生活中不可或缺的助手。单片机体积小、重量轻,具有很强的灵活性而且价格便宜。单片机主要用于工业环境的实时控制、智能化仪器仪表、家用电器等各个不同的领域。不同领域对单片机的使用有不同的要求,诸如环境温度、湿度、电源波动、电磁场扰动、噪声、冲击、红外遥控等等,都直接影响着单片机应用系统的总体设计。无论哪一种单片机应用系统,在总体设计中都必须把工作环境的制约当作重要因素对待。单片机应用系统设计不但要熟练掌握单片机程序语言和编程技术,而且还要具备扎实的单片机硬件方面的理论和实践知识。2.2 预期目标设计一种基于 AT89S52 单片机控制的红外线遥控器,具有以下功能:(1)适用于编码式红外线遥控型家用电器;(2)可遥控多台家用电器;(3)具有一个学习/控制复用键;(4)可通过一个设备选择键和各个功能控制键实现对多台设备的常用功能的学习和控制;(5)成本低,抗干扰能力强。2.3 单片机相关知识(1) 本次实习所使用的单片机是 Atmel 公司的 STC89C52 芯片,此芯片的功能强大,可以实现我们日常生活中接触到的大部分家电的自动控制功能和实现对家电的远程遥控。STC89C52 的引脚图如 2-1 所示:图 2-1 STC89C52 引脚图单片机最小系统如下图所示:图 2-2 单片机最小系统(2)单片机最小系统的复位电路由电容串联电阻构成,由图并结合“电容电压不能突变“的性质,可以知道,当系统一上电,RST 脚将会出现高电平,并且,这个高电平持续的时间由电路的 RC值来决定.典型的 51 单片机当 RST 脚的高电平持续两个机器周期以上就将复位,所以,适当组合 RC 的取值就可以保证可靠的复位.一般教科书推荐 C 取 10u,R 取8.2K.当然也有其他取法的,原则就是要让 RC 组合可以在 RST 脚上产生不少于 2个机周期的高电平.至于如何具体定量计,可以参考电路分析相关书籍. 图 2-3 单片机最小系统复位电路(3)单片机最小系统的晶振电路单片机的时钟电路由振荡电路和分频电路组成,其振荡电路由反相器以及并联外接的石英晶体和电容组成,用于产生振荡脉冲。分频电路用于把振荡脉冲分频,以的到所需要的时钟信号。振荡电路如图 2-2 所示:图 2-3 单片机最小系统晶振电路其输入端为引脚 XTAL1,输出端为引脚 XTAL2。通过这两个引脚在芯片外并接石英晶体振荡器和两只电容,石英晶体为一感性原件,与电容构成振荡回路,为片内放大器提供正反馈和振荡的相移条件,从而构成一个稳定的自激振荡器。振荡器的频率主要取决于晶体的振荡频率, 一般晶体可在 1.212 MHz之间任选, 电容 C1、 C2 可在 530 pF 之间选择, 电容的大小对振荡频率有微小的影响, 可起频率微调作用。 振荡脉冲经二分频后作为系统的时钟信号,时钟信号经过三分频产生 ALE信号,ALE 信号用于控制把 P0 口的低 8 位地址送入锁存器锁起来,以实现低地址和数据的分时传送,ALE 还可作为外部时钟或外部脉冲使用。时钟信号经六分频得到机器周期信号。(4)中断系统A 中断的概念当 CPU 与外设交换信息时,由于外设的速度比较慢,若用查询的方式,则CPU 就要浪费很多时间去等待外设。这样就存在一个快速的 CPU 与慢速的外设之间的矛盾。为了解决这个问题,就发展了中断的概念。CPU 正在处理某一程序时,发生了另一突发事件请求 CPU 迅速去处理(中断发生);CPU 暂时停止当前的工作,转到需要处理的中断源的服务程序的入口(中断响应),一般在入口处执行一跳转指令转去处理中断事件(中断服务);待CPU 将中断事件处理完毕后,再回到原来程序被中断的地方继续处理执行程序(中断返回),这一处理过程称为中断。51 单片机的中断系统提供 5 个中断源:外部中断 0 和外部中断 1,定时/计数器(T0)和(T1)的溢出中断,串行接口的接收和发送中断。本程序中只用到了外部中断 1。B 中断控制1 中断允许寄存器 IE(A8H)CPU 对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器(IE)控制的。IE 各位的定义如表 2-2 所示:表 2-1位地址0AFH0AEH0ADH0ACH0ABH0AAH0A9H0A8H位符号EA/ESET1EX1ET0EX0EA中断允许总控制位EA0 中断总禁止,禁止所有中断EA1 中断总允许,总允许后中断的禁止或允许由各中断源的中断允许控制位设置。EX0 和 EX1外部中断允许控制位EX0(EX1)0 禁止外部中断EX0(EX1)1 允许外部中断ET0 和 ET1定时器/计数器中断允许控制位ET0(ET1)0 禁止定时器/计数器中断ET0(ET1)1 允许定时器/计数器中断ES串行中断允许控制位ES=0 禁止串行中断ES=1 允许串行中断2 中断优先级控制寄存器(IP)各中断的优先级通过中断优先级控制寄存器 IP 来设定,其未定义及位地址如表 2-3 所示:表 2-2位地址0BFH0BEH0BDH0BCH0BBH0BAH0B9H0B8H位符号/PSPT1PX1PT0PX0PX0外部中断 0 优先级设定位;PT0定时中断 0 优先级设定位;PX1外部中断 1 优先级设定位;PT1定时中断 1 优先级设定位; PS串行中断优先级设定位。C 定时器控制寄存器(TCON)该寄存器用于保存外部中断请求以及定时器的计数溢出。进行字节操作时,寄存器地址为 88H。按位操作时,各位的地址为 88H8FH。寄存器的内容及位地址表示如表 2-4 所示:表 2-3位地址8FH 8EH 8DH 8CH 8BH8AH 89H 88H 位符号 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 IE0 和 IE1外中断请求标志位。当 CPU 采样到 INT0(或 INT1)端出现有效中断请求时,IE0(IE1)位由硬件置“1”。 当中断响应完成转向中断服务程序时,由硬件把 IE0(或 IE1)清零。TR0 和 TR1定时器运行控制位:TR0 (TR1 )0 定时器/计数器不工作TR0 (TR1 )1 定时器/计数器开始工作TF0 和 TF1计数溢出标志位。当计数器产生计数溢出时,相应的溢出标志位硬件置“1”。 并自动产生定时中断请求。(5)液晶显示模块1602LCD 分为带背光和不带背光两种,基控制器大部分为 HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图所示:图 2-4 1602LCD 尺寸图1602LCD 主要技术参数:主要技术参数:显示容量:16×2 个字符 芯片工作电压:4.55.5V工作电流:2.0mA(5.0V) 模块最佳工作电压:5.0V字符尺寸:2.95×4.35(W×H)mm引脚功能说明引脚功能说明:1602LCD 采用标准的 14 脚(无背光)或 16 脚(带背光)接口,各引脚接口说明如表所示:编号符号引脚说明编号符号引脚说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极表 2-4:引脚接口说明表第 1 脚:VSS 为地电源。第 2 脚:VDD 接 5V 正电源。第 3 脚:VL 为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个 10K 的电位器调整对比度。第 4 脚:RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第 5 脚:R/W 为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS 和 R/W 共同为低电平时可以写入指令或者显示地址,当 RS 为低电平 R/W为高电平时可以读忙信号,当 RS 为高电平 R/W 为低电平时可以写入数据。第 6 脚:E 端为使能端,当 E 端由高电平跳变成低电平时,液晶模块执行命令。第 714 脚:D0D7 为 8 位双向数据线。第 15 脚:背光源正极。第 16 脚:背光源负极。(6)声音提示模块该设计有声音报警,当有病人呼叫时,蜂鸣器就会大声提示,直到护士应答回复,才会停止鸣叫,控制引脚接在 P3.4 引脚上,利用三极管当做开关电路可以保护单片机,还可以起到放大电流的作用,当三极管基极为高电平时,发射极截止,为低电平时,发射极导通。报警模块如图 2-5 所示。Q1 8550器器器VCCR41kP34图 2-5 声音提示模块三三 系统硬件设计系统硬件设计3.1 红外遥控系统通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图 1 所示。发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。如图所示:3.2 遥控发射器及其编码遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,解码比较容易的一类来加以说明,现以兼容 NEC 的 uPD6121G 芯片发射码格式的芯片组成发射电路为例说明编码原理。当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。这种遥控码具有以下特征:采用脉宽调制的串行码,以脉宽为 0.565ms、间隔 0.56ms、周期为 1.125ms 的组合表示二进制的“0”;以脉宽为 0.565ms、间隔 1.685ms、周期为 2.25ms 的组合表示二进制的“1”,其波形如图所示:上述“0”和“1”组成的 32 位二进制码经 38kHz 的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射,如图所示:UPD6121G 产生的遥控编码是连续的 32 位二进制码组,其中前 16 位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。芯片厂商把用户识别码固定为十六进制的一组数;后 16 位为 8 位操作码(功能码)及其反码。UPD6121G 最多额 128 种不同组合的编码。遥控器在按键按下后,周期性地发出同一种 32 位二进制码,周期约为 108ms。一组码本身的持续时间随它包含的二进制“0”和“1”的个数不同而不同,大约在 4563ms 之间,图 4 为发射波形图。当一个键按下超过 36ms,振荡器使芯片激活,将发射一组 108ms 的编码脉冲,这 108ms 发射代码由一个起始码(9ms),一个结果码(4.5ms),低 8 位地址码(9ms18ms),高 8 位地址码(9ms18ms),8 位数据码(9ms18ms)和这 8 位数据的反码(9ms18ms)组成。如果键按下超过 108ms 仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。3.接收器及解码一体化红外线接收器是一种集红外线接收和放大于一体,不需要任何外接元件,就能完成从红外线接收到输出与 TTL 电平信号兼容的所有工作,而体积和普通的塑封三极管大小一样,它适合于各种红外线遥控和红外线数据传输。红外接收头将 38K 载波信号过虑,得到与发射代码反向接收代码,如图:(1) 解码的关键是如何识别“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 左右均可。(2) 根据码的格式,应该等待 9ms 的起始码和 4.5ms 的结果码完成后才能读码。四四 电路电路框图设计框图设计4.1 遥控发射单元的框图设计遥控发射单元由单片机最小系统和按键电路、红外发射器电路等组成,遥控发射单元框图如图所示:STC89C52单片机红外发射器按键电路复位电路晶振电路电源电路图 4-1 红外遥控单元发射框图 4.2 遥控接收单元的框图设计遥控接收单元由单片机最小系统和红外接收器、控制对象电路等组成,遥控接收单元框图如图 3-2 所示:STC89C52单片机电源液晶显示器红外接收器复位电路晶振电路图 4-2 红外遥控接收单元框图五五 电路原理图及程序流程图电路原理图及程序流程图5.15.1 遥控发射单元原理图遥控发射单元原理图遥控发射单元由单片机最小系统和按键电路、红外发射器电路等组成,遥控发射单元原理图如图 5-1 所示。图 5-1 遥控发射单元原理图5.25.2 遥控接收单元原理图遥控接收单元原理图遥控接收单元由单片机最小系统和红外接收器、控制对象电路等组成,遥控接收单元原理图如图 5-2 所示。图 5-2 遥控接收单元原理图5.3 总 PCB 图如图 5-3 所示:图 5-3 总 PCB 图5.4 红外遥控程序流程图(1) 程序开始是对单片机进行初始化设置,循环扫描判断是否有键按下,如果有键按下就发射相应的红外信号,遥控发射程序流程图如图 5-4 所示:开始初始化有键按下?查询被按下的键发送红外脉冲个数(按键值)YN图 5-4 遥控发射程序流程图(2) 程序开始是对单片机进行初始化设置,循环扫描判断是否有键按下,如果有键按下就发射相应的红外信号,遥控发射程序流程图如图 5-5 所示,中断延时有开始脉冲?接收红外执行相应功能中断返回YN5.5 实物图程序附录 1:/*名称:红外线遥控发射(NEC 编码)单片机:STC89C52RC 晶振:12M*/#include #include “MY_SET.h“#include “LCD1602_6IO.h“ #define KEY_PORT P1#define KEY_NULL 80sbit IR = P20; /发射引脚/sbit LED1=P20;sbit LED2=P21;sbit LED3=P22;sbit LED4=P23;sbit KEY1=P10;sbit KEY2=P11;sbit KEY3=P12;sbit KEY4=P13;sbit KEY5=P14;#define USER_H P2 /用户码高 8 位#define USER_L P0 /用户码低 8 位Uint8tab16=0x12,0x05,0x1e,0x55,0x01,0x1b,0x03,0x6b,0x07,0x08,0x09,0x68,0x22,0xE6,0x33,0xe2;/操作码uint16 M = 0;#define m9 (65536-9000) /9mS#define m4_5 (65536-4500) /4.5mS#define m1_6 (65536-1650) /1.65mS#define m_56 (65536-560) /0.56mS#define m40 (65536-40000) /40mS#define m56 (65536-56000) /56mS#define m2_25 (65536-2250) /2.25mSvoid SanZhuan();uint8 KEY(void);void ZZ(uint8 x); /NEC 编码发送程序void Z0(uint8 temp); /单帧(8 位数据)发送程序void TT0(bit BT,uint16 x); /38KHz 载波发射 + 延时程序char keyscan();void delayk();/*函数:主程序*/void main(void) uchar m;TMOD = 0x01;IE = 0x81; /允许总中断中断,使能 INT0 外部中断TCON = 0x01; /触发方式为脉冲负边沿触发IRIN=1; /I/O 口初始化BEEP=1;IR = 1;delay1(10); /延时lcd_init(); /初始化 LCD lcd_pos(0); /设置显示位置为第一行的第 1 个字符m = 0;while(cdis1m != '0') /显示字符lcd_wdat(cdis1m);m+;lcd_pos(0x40); /设置显示位置为第二行第 1 个字符m = 0;while(cdis2m != '0')lcd_wdat(cdis2m); /显示字符m+;while(1) if(LED4 = 0)IE = 0x00;elseIE = 0x81;SanZhuan();/*函数:独立键盘*/uint8 KEY(void)uint8 Key = 0xff;if(KEY1 = 0)Key = 0; / LED1 = LED1;if(KEY2 = 0)Key = 1; LED2 = LED2;if(KEY3 = 0)Key = 2; LED3 = LED3;if(KEY4 = 0)Key = 3; LED3 = LED3;if(KEY5 = 0)LED4 = LED4;return Key; /返回键值/*函数:散转程序*/void SanZhuan()uint8 v;/TMOD = 0x01;/v = KEY(); /键盘检测v = keyscan();switch(v)case 0:ZZ(tab0);break;case 1:ZZ(tab1);break;case 2:ZZ(tab2);break;case 3:ZZ(tab3);break;case 4:ZZ(tab4);break;case 5:ZZ(tab5);break;case 6:ZZ(tab6);break;case 7:ZZ(tab7);break;case 8:ZZ(tab8);break;case 9:ZZ(tab9);break;case '*':ZZ(tab10);break;case '#':ZZ(tab11);break;case '+':ZZ(tab12);break;case '-':ZZ(tab13);break;/ case 0xd7:ZZ(tab14);break;/ case 0xe7:ZZ(tab15);break;default:break;v=0;/*函数:NEC 编码发送程序 入口:八位操作码*/void ZZ(uint8 Value) TT0(1,m9); /高电平 9mSTT0(0,m4_5); /低电平 4.5mS/* 发送 4 帧数据*/Z0(USER_H); /用户码高 8 位 Z0(USER_L); /用户码低 8 位Z0(Value); /操作码Z0(Value); /操作码反码/* 结束码 */TT0(1,m_56);TT0(0,m40);/* 重复码 */while(KEY() != 0xFF)TT0(1,m9);TT0(0,m2_25);TT0(1,m_56);TT0(0,m40);TT0(0,m56); /*函数:单帧(8 位数据)发送程序*/void Z0(uint8 temp) uint8 v;for (v=0;v>= 1; /右移一位 /*函数:38KHz 载波发射 + 延时程序 入口:(是否发射载波,延时约 x (uS))*/void TT0(bit BT,uint16 x)TH0 = x>>8; /输入 T0 初始值TL0 = x;TF0=0; /清 0TR0=1; /启动定时器 0if(BT = 0) while(!TF0); /BT=0 时,不发射 38KHz 载波只延时;Belse while(1) /38KHz 载波, (低电平)占空比 5:26IR = 0;if(TF0)break;if(TF0)break;IR = 1;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;TR0=0; /关闭定时器 0TF0=0; /标志位溢出则清 0IR =1; /载波停止后,发射端口常态为高/*函数 :外部中断函数 */void IR_IN(void) interrupt 0 /外部中断服务程序unsigned char j,k,N=0;EX0 = 0; delay(15);if (IRIN=1) EX0 =1;return; /确认 IR 信号出现while (!IRIN) /等 IR 变为高电平,跳过 9ms 的前导低电平信号。delay(1);for (j=0;j=30) EX0=1;return; /0.14ms 计数过长自动离开。 /高电平计数完毕 IRCOMj=IRCOMj >> 1; /数据最高位补“0”if (N>=8) IRCOMj = IRCOMj | 0x80; /数据最高位补“1”N=0;/end for k/end for jif (IRCOM2!=IRCOM3)/按位取反 EX0=1;return; IRCOM5=IRCOM2 /取键码的低四位IRCOM6=IRCOM2 >> 4; /右移 4 次,高四位变为低四位if(IRCOM5>9) IRCOM5=IRCOM5+0x37;elseIRCOM5=IRCOM5+0x30;if(IRCOM6>9) IRCOM6=IRCOM6+0x37;elseIRCOM6=IRCOM6+0x30;lcd_pos(0x4b); lcd_wdat(IRCOM6); /第一位数显示 lcd_pos(0x4c); lcd_wdat(IRCOM5); /第二位数显示Y0=0;switch(IRCOM2)case 0x09: Y0=0x01; break;case 0x1D: Y0=0x02; break;case 0x1F: Y0=0x03; break;case 0x0D: Y0=0x04; break;case 0x19: Y0=0x05; break;case 0x1B: Y0=0x06; break;case 0x11: Y0=0x07; break;case 0x15: Y0=0x08; break;case 0x17: Y0=0x09; break;default:break;/case 0x13: RELAY=1; break;/ case 0x14: RELAY=1; break;/ case 0x51: RELAY=0; break;tabM = IRCOM2;M = (M+1)%4; beep();EX0 = 1; char keyscan()char temp,key;KEY_PORT = 0x7f;temp = KEY_PORT;temp = KEY_PORT if(temp != 0x0f)delayk();if(temp != 0x0f)temp = KEY_PORT;switch(temp)case 0x7e: key = 'A'break;/Acase 0x7d: key = 'B'break;/Bcase 0x7b: key = 'C'break;/Ccase 0x77: key = 'D'break;/Dwhile(temp != 0x0f)temp = KEY_PORT P1 = key;return key;KEY_PORT = 0xbf;temp = KEY_PORT;temp = KEY_PORT if(temp != 0x0f)delayk();if(temp != 0x0f)temp = KEY_PORT;switch(temp)case 0xbe: key = 3;break;/3case 0xbd: key = 6;break;/6case 0xbb: key = 9;break;/9case 0xb7: key = '#'break;/#while(temp != 0x0f)temp = KEY_PORT /P1 = key;return key;KEY_PORT = 0xdf;temp = KEY_PORT;temp = KEY_PORT if(temp != 0x0f)delayk();if(temp != 0x0f)temp = KEY_PORT;switch(temp)case 0xde: key = 2;break;/2case 0xdd: key = 5;break;/5case 0xdb: key = 8;break;/8case 0xd7: key = 0;break;/0while(temp != 0x0f)temp = KEY_PORT /P1 = key;return key;KEY_PORT = 0xef;temp = KEY_PORT;temp = KEY_PORT if(temp != 0x0f)delayk();if(temp != 0x0f)temp = KEY_PORT;switch(temp)case 0xee: key = 1;break;/1case 0xed: key = 4;break;/4case 0xeb: key = 7;break;/7case 0xe7: key = '*'break;/*while(temp != 0x0f)temp = KEY_PORT /P1 = key;return key;/beep=1;return KEY_NULL;/返回一个与键盘不相关的值void delayk()int x,y;for(x=0; x /包含单片机寄存器的头文件#include /包含_nop_()函数定义的头文件sbit IR=P32; /将 IR 位定义为 P3.2 引脚sbit RS=P20; /寄存器选择位,将 RS 位定义为 P2.0 引脚sbit RW=P21; /读写选择位,将 RW 位定义为 P2.1 引脚sbit E=P22; /使能信号位,将 E 位定义为 P2.2 引脚sbit BF=P07; /忙碌标志位, ,将 BF 位定义为 P0.7 引脚sbit BEEP = P36; /蜂鸣器控制端口 P36 unsigned char flag;unsigned char code string = “HELLO WORLD“; unsigned char a4; /储存用户码、用户反码与键数据码、键数据反码unsigned int LowTime,HighTime; /储存高、低电平的宽度 /*函数功能:延时 1ms*/void delay1ms()unsigned char i,j;for(i=0;i>1; /temp 中的各数据位右移一位TH0=0; /定时器清 0TL0=0; /定时器清 0TR0=1; /开启定时器 T0while(IR=0) /如果是低电平就等待TR0=0; /关闭定时器 T0LowTime=TH0*256+TL0; /保存低电平宽度TH0=0; /定时器清 0TL0=0; /定时器清 0TR0=1; /开启定时器 T0while(IR=1) /如果是高电平就等待 TR0=0; /关闭定时器 T0HighTime=TH0*256+TL0; /保存高电平宽度if(LowTime640)return 0; /低电平长度不在合理范围,则认为出错,停止if(HighTime>420)