版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.1信息工程学院电子信息系专业实训报告题目:基于STC89C52单片机的红外遥控系统专业班级:电子信息工程11级1班*:1167118115 :郭晓伟 指导教师:建军题目 基于STC89C52单片机的红外遥控系统实训目的: 通过对基于单片机的课程设计,使我们进一步熟悉和掌握单片机的构造及工作原理,掌握单片机的接口技术及相关外围芯片的特性和控制方法。并且通过对本次的课程实习,掌握以单片机为核心的电路设计的根本方法和技术。在课程设计中,我们亲自动手进展实际应用程序设计和调试,逐步掌握模块化程序设计方法和调试技术,熟练运用D*P、protel99se等类似的画图软件和编程软件keil C等,在设计各
2、自的课题中,每位同学通过完成一个包括电路设计和程序开发的完整过程,使大家了解开发单片机应用系统的全过程,在自己的实践设计中熟练这门技术时,同时排除和解决设计中遇到的各种问题,这是在此次课程设计中,同学们得到的最大的收益,而且为今后从事相应工作打下根底。实训时间、地点: 时间:2021春学期 第17.18周 地点:工程训练中心实验室实训容:摘要:单片机的广泛应用促进了设备和产品的微型化,数字化,自控化,和智能化。单片机的应用加深了计算机于自动化控制技术的结合,从而在自动控制领域里引发了一场对传统控制技术的革命,也就是单片机正从根本上改变着传统的控制设计思想和设计方法,是以往必须由模拟或数字电路实
3、现的控制功能,现在可以通过软件方法实现了。红外遥控是一种被广泛使用的计算机技术,特别是在家电方面给人们带来了方便快捷的生活。红外遥控用到许多中断技术,计算机系统中,中断可以由各种硬件设备产生,以便请求效劳或报告故障报警等。此外,中断也可以由处理器自身产生。外部中断请求有两种信号方式有电平方式和脉冲方式。电平方式的中断请求时低电平有效,脉冲的中断请脉冲的下降沿有效。我通过在图书馆查阅有关资料,并且设计出了适宜的电路图,经过仔细研究并对电路图做了屡次修改,满足了课题的要求,实现了红外遥控的目的。最后通过仿真器输入程序,手动中断,中断完毕后,程序从断点处继续执行。中断的应用具有重要的意义,它大大提高
4、了计算机效率。关键词:单片机;遥控器;STC89C52;红外遥控一 引言以单片机为核心的控制系统,因为其实时控制功能强,可靠性高,实用性强,应用围广等优点,得到了极为广泛的应用。随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否认的,其中红外遥控就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向开展。红外线遥控是目前使用最广泛的一种通信和遥控手段。由于红外线遥控装置具有体积小、功耗低、功能强、本钱低等特点,因而,继彩电、录像机之后,在录音机、音响设备
5、、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。它的理论性和实践性都很强,我们在理论课学习中主要学习单片机的根本构造,各局部的工作原理以及指令系统,然而,光是理论的学习是远远不够的,最重要的是把理论和实践相结合。所以此次实习,通过设计一个基于AT89S52单片机的遥控器设计,以增进对单片机电路的感性认识,加深对理论方面的理解和稳固,了解和掌握软硬件设计过程、方法及实现,增强自己的动手和实践能力,为以后在工作和学习中,设计和实现应用系统打下良好根底。二 单片机系统开发与应用工程实习要求
6、及相关知识2.1 单片机系统开发与应用工程实习的重要意义单片机是计算机技术、大规模集成电路技术和控制技术的综合产物。现在,但凡电脑控制的设备和产品,必有单片机嵌入其中,它早已成为人类生活中不可或缺的助手。单片机体积小、重量轻,具有很强的灵活性而且价格廉价。单片机主要用于工业环境的实时控制、智能化仪器仪表、家用电器等各个不同的领域。不同领域对单片机的使用有不同的要求,诸如环境温度、湿度、电源波动、电磁场扰动、噪声、冲击、红外遥控等等,都直接影响着单片机应用系统的总体设计。无论哪一种单片机应用系统,在总体设计中都必须把工作环境的制约当作重要因素对待。单片机应用系统设计不但要熟练掌握单片机程序语言和
7、编程技术,而且还要具备扎实的单片机硬件方面的理论和实践知识。2.2 预期目标设计一种基于AT89S52单片机控制的红外线遥控器,具有以下功能:1适用于编码式红外线遥控型家用电器;2可遥控多台家用电器;3具有一个学习/控制复用键;4可通过一个设备选择键和各个功能控制键实现对多台设备的常用功能的学习和控制;5本钱低,抗干扰能力强。2.3 单片机相关知识1 本次实习所使用的单片机是Atmel公司的STC89C52芯片,此芯片的功能强大,可以实现我们日常生活中接触到的大局部家电的自动控制功能和实现对家电的远程遥控。STC89C52的引脚图如2-1所示:图2-1 STC89C52引脚图单片机最小系统如以
8、下图所示:图2-2单片机最小系统2单片机最小系统的复位电路由电容串联电阻构成,由图并结合“电容电压不能突变的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定.典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以,适当组合RC的取值就可以保证可靠的复位.一般教科书推荐C 取10u,R取8.2K.当然也有其他取法的,原则就是要让RC组合可以在RST脚上产生不少于2个机周期的高电平.至于如何具体定量计,可以参考电路分析相关书籍. 图2-3单片机最小系统复位电路3单片机最小系统的晶振电路单片机的时钟电路由振荡电路和分频电路组成,其振荡
9、电路由反相器以及并联外接的石英晶体和电容组成,用于产生振荡脉冲。分频电路用于把振荡脉冲分频,以的到所需要的时钟信号。振荡电路如图2-2所示:图2-3单片机最小系统晶振电路其输入端为引脚*TAL1,输出端为引脚*TAL2。通过这两个引脚在芯片外并接石英晶体振荡器和两只电容,石英晶体为一感性原件,与电容构成振荡回路,为片放大器提供正反响和振荡的相移条件,从而构成一个稳定的自激振荡器。振荡器的频率主要取决于晶体的振荡频率, 一般晶体可在1.212 MHz之间任选, 电容C1、 C2可在530 pF之间选择, 电容的大小对振荡频率有微小的影响, 可起频率微调作用。 振荡脉冲经二分频后作为系统的时钟信号
10、,时钟信号经过三分频产生ALE信号,ALE信号用于控制把P0口的低8位地址送入锁存器锁起来,以实现低地址和数据的分时传送,ALE还可作为外部时钟或外部脉冲使用。时钟信号经六分频得到机器周期信号。4中断系统A 中断的概念当CPU与外设交换信息时,由于外设的速度比较慢,假设用查询的方式,则CPU就要浪费很多时间去等待外设。这样就存在一个快速的CPU与慢速的外设之间的矛盾。为了解决这个问题,就开展了中断的概念。CPU正在处理*一程序时,发生了另一突发事件请求CPU迅速去处理(中断发生);CPU暂时停顿当前的工作,转到需要处理的中断源的效劳程序的入口(中断响应),一般在入口处执行一跳转指令转去处理中断
11、事件(中断效劳);待CPU将中断事件处理完毕后,再回到原来程序被中断的地方继续处理执行程序(中断返回),这一处理过程称为中断。51单片机的中断系统提供5个中断源:外部中断0和外部中断1,定时/计数器(T0)和(T1)的溢出中断,串行接口的接收和发送中断。本程序中只用到了外部中断1。B 中断控制1 中断允许存放器IE(A8H)CPU对中断系统所有中断以及*个中断源的开放和屏蔽是由中断允许存放器(IE)控制的。IE各位的定义如表2-2所示:表 2-1位地址0AFH0AEH0ADH0ACH0ABH0AAH0A9H0A8H位符号EA/ESET1E*1ET0E*0EA中断允许总控制位EA0 中断总制止,
12、制止所有中断EA1 中断总允许,总允许后中断的制止或允许由各中断源的中断允许控制位设置。E*0和E*1外部中断允许控制位E*0E*10 制止外部中断E*0E*11 允许外部中断ET0和ET1定时器/计数器中断允许控制位ET0ET10 制止定时器/计数器中断ET0ET11 允许定时器/计数器中断ES串行中断允许控制位ES=0 制止串行中断ES=1 允许串行中断2中断优先级控制存放器IP各中断的优先级通过中断优先级控制存放器IP来设定,其未定义及位地址如表2-3所示:表2-2位地址0BFH0BEH0BDH0BCH0BBH0BAH0B9H0B8H位符号/PSPT1P*1PT0P*0P*0外部中断0优
13、先级设定位;PT0定时中断0优先级设定位;P*1外部中断1优先级设定位;PT1定时中断1优先级设定位;PS串行中断优先级设定位。C定时器控制存放器TCON该存放器用于保存外部中断请求以及定时器的计数溢出。进展字节操作时,存放器地址为88H。按位操作时,各位的地址为88H8FH。存放器的容及位地址表示如表2-4所示:表 2-3位地址 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H 位符号 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 IE0和IE1外中断请求标志位。当CPU采样到 INT0或INT1端出现有效中断请求时,IE0IE1位由硬件置“1。当中断响应完成
14、转向中断效劳程序时,由硬件把IE0或IE1清零。TR0 和TR1定时器运行控制位:TR0 TR1 0 定时器/计数器不工作TR0 TR1 1 定时器/计数器开场工作TF0和TF1计数溢出标志位。当计数器产生计数溢出时,相应的溢出标志位硬件置“1。 并自动产生定时中断请求。(5)液晶显示模块1602LCD分为带背光和不带背光两种,基控制器大局部为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差异,两者尺寸差异如以下图所示:图2-4 1602LCD尺寸图1602LCD主要技术参数:显示容量:162个字符芯片工作电压:4.55.5V工作电流:2.0mA(5.0V)模块最正确工作电压:
15、5.0V字符尺寸:2.954.35(WH)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为液晶显示器比照度调整端,接正电源时比照度最弱,接地时比照度最高,比照度过高时会产生“鬼影,使用时可以通过一个1
16、0K的电位器调整比照度。第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引脚上,利用三极管当
17、做开关电路可以保护单片机,还可以起到放大电流的作用,当三极管基极为高电平时,发射极截止,为低电平时,发射极导通。报警模块如图2-5所示。图2-5声音提示模块三 系统硬件设计3.1 红外遥控系统 通用红外遥控系统由发射和接收两大局部组成,应用编/解码专用集成电路芯片来进展控制操作,如图1所示。发射局部包括键盘矩阵、编码调制、LED红外发送器;接收局部包括光、电转换放大器、解调、解码电路。如以下图:3.2 遥控发射器及其编码 遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,解码比较容易的一类来加以说明,现以兼容NEC的uPD6121G芯片发射码格式的芯片组成发射电路为例
18、说明编码原理。当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。这种遥控码具有以下特征:采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1,其波形如以下图: 上述“0和“1组成的32位二进制码经38kHz的载频进展二次调制以提高发射效率,到达降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射,如以下图:UPD6121G产生的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相
19、干扰。芯片厂商把用户识别码固定为十六进制的一组数;后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仍未松开
20、,接下来发射的代码连发代码将仅由起始码9ms和完毕码2.5ms组成。3.接收器及解码一体化红外线接收器是一种集红外线接收和放大于一体,不需要任何外接元件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,而体积和普通的塑封三极管大小一样,它适合于各种红外线遥控和红外线数据传输。红外接收头将38K载波信号过虑,得到与发射代码反向接收代码,如图:1解码的关键是如何识别“0和“1,从位的定义我们可以发现“0、“1均以0.56ms的低电平开场,不同的是高电平的宽度不同,“0为0.56ms,“1为1.68ms,所以必须根据高电平的宽度区别“0和“1。如果从0.56ms低电平过后,开场延时,0.5
21、6ms以后,假设读到的电平为低,说明该位为“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遥控接收单元的框图设计
22、遥控接收单元由单片机最小系统和红外接收器、控制对象电路等组成,遥控接收单元框图如图3-2所示:晶振电路STC89C52单片机电源液晶显示器红外接收器复位电路图4-2红外遥控接收单元框图五 电路原理图及程序流程图5.1 遥控发射单元原理图遥控发射单元由单片机最小系统和按键电路、红外发射器电路等组成,遥控发射单元原理图如图5-1所示。图5-1遥控发射单元原理图5.2 遥控接收单元原理图 遥控接收单元由单片机最小系统和红外接收器、控制对象电路等组成,遥控接收单元原理图如图5-2所示。图5-2 遥控接收单元原理图5.3总PCB图如图5-3所示:图5-3 总PCB图5.4 红外遥控程序流程图1 程序开场
23、是对单片机进展初始化设置,循环扫描判断是否有键按下,如果有键按下就发射相应的红外信号,遥控发射程序流程图如图5-4所示:开场初始化有键按下.查询被按下的键发送红外脉冲个数按键值YN图5-4遥控发射程序流程图2 程序开场是对单片机进展初始化设置,循环扫描判断是否有键按下,如果有键按下就发射相应的红外信号,遥控发射程序流程图如图5-5所示,中断延时有开场脉冲.接收红外执行相应功能中断返回YN5.5实物图程序附录1:/*名称:红外线遥控发射NEC编码单片机:STC89C52RC晶振:12M*/*include *include MY_SET.h*include LCD1602_6IO.h *defi
24、ne KEY_PORT P1*defineKEY_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=0*12,0*05,0*1e,0*55,0*01,0*1b,0*03,0*6b,0*07,0*08,0*09,0*68,
25、0*22,0*E6,0*33,0*e2;/操作码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(ui
26、nt8 *); /NEC编码发送程序void Z0(uint8 temp); /单帧8位数据发送程序void TT0(bit BT,uint16 *); /38KHz载波发射 + 延时程序char keyscan();void delayk();/*函数:主程序*/void main(void) uchar m; TMOD = 0*01; IE = 0*81; /允许总中断中断,使能 INT0 外部中断 TCON = 0*01; /触发方式为脉冲负边沿触发 IRIN=1; /I/O口初始化 BEEP=1;IR = 1; delay1(10); /延时 lcd_init(); /初始化LCD l
27、cd_pos(0); /设置显示位置为第一行的第1个字符m = 0; while(cdis1m != 0) /显示字符 lcd_wdat(cdis1m); m+; lcd_pos(0*40); /设置显示位置为第二行第1个字符 m = 0; while(cdis2m != 0) lcd_wdat(cdis2m); /显示字符 m+; while(1)if(LED4 = 0)IE = 0*00; elseIE = 0*81; SanZhuan();/*函数:独立键盘*/uint8 KEY(void) uint8 Key = 0*ff; if(KEY1 = 0) Key = 0; / LED1 =
28、 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 = 0*01; /v = KEY(); /键盘检测 v = keyscan(); switch(v) case 0:ZZ(tab0);break; case 1:ZZ(tab1);break; case 2
29、: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 0*d7:ZZ(tab14);break
30、;/ case 0*e7:ZZ(tab15);break; default:break; v=0;/*函数:NEC编码发送程序 入口:八位操作码*/void ZZ(uint8 Value) TT0(1,m9); /高电平9mS TT0(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() != 0*FF) TT0(1,m9);
31、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载波发射 + 延时程序 入口:是否发射载波,延时约 * (uS)*/void TT0(bit BT,uint16 *) TH0 = *8; /输入T0初始值 TL0 = *; TF0=0; /清0 TR0=1; /启动定时器0 if(BT = 0) while(!TF0); /BT=0时,不发射38KHz载波只延时;B else while(1
32、) /38KHz载波,低电平占空比5:26 IR = 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; /关闭定时器0 TF0=0; /标志位溢出则清0 IR =1; /载波停顿后,发射端口常态为高/*函数 :外部中断函数 */void IR_IN(void) interrupt 0 /外
33、部中断效劳程序 unsigned char j,k,N=0; E*0 = 0; delay(15); if (IRIN=1) E*0 =1; return; /确认IR信号出现 while (!IRIN) /等IR变为高电平,跳过9ms的前导低电平信号。 delay(1); for (j=0;j4;j+) /收集四组数据 for (k=0;k=30) E*0=1; return; /0.14ms计数过长自动离开。 /高电平计数完毕 IRj=IRj 1; /数据最高位补“0 if (N=8) IRj = IRj | 0*80; /数据最高位补“1 N=0; /end for k /end for
34、 j if (IR2!=IR3)/按位取反 E*0=1; return; IR5=IR2 & 0*0F; /取键码的低四位IR6=IR2 4; /右移4次,高四位变为低四位 if(IR59) IR5=IR5+0*37; else IR5=IR5+0*30; if(IR69) IR6=IR6+0*37; else IR6=IR6+0*30; lcd_pos(0*4b); lcd_wdat(IR6); /第一位数显示 lcd_pos(0*4c); lcd_wdat(IR5); /第二位数显示 Y0=0; switch(IR2) case 0*09: Y0=0*01; break; case 0*1
35、D: Y0=0*02; break; case 0*1F: Y0=0*03; break; case 0*0D: Y0=0*04; break; case 0*19: Y0=0*05; break; case 0*1B: Y0=0*06; break; case 0*11: Y0=0*07; break; case 0*15: Y0=0*08; break; case 0*17: Y0=0*09; break; default:break; /case 0*13: RELAY=1; break; / case 0*14: RELAY=1; break; / case 0*51: RELAY=0
36、; break; tabM = IR2;M = (M+1)%4; beep(); E*0 = 1; char keyscan()char temp,key;KEY_PORT = 0*7f;temp = KEY_PORT;temp = KEY_PORT & 0*0f;if(temp != 0*0f)delayk();if(temp != 0*0f)temp = KEY_PORT;switch(temp)case 0*7e: key = A;break;/Acase 0*7d: key = B;break;/Bcase 0*7b: key = C;break;/Ccase 0*77: key =
37、D;break;/Dwhile(temp != 0*0f)temp = KEY_PORT & 0*0f;P1 = key;return key;KEY_PORT = 0*bf;temp = KEY_PORT;temp = KEY_PORT & 0*0f;if(temp != 0*0f)delayk();if(temp != 0*0f)temp = KEY_PORT;switch(temp)case 0*be: key = 3;break;/3case 0*bd: key = 6;break;/6case 0*bb: key = 9;break;/9case 0*b7: key = *;brea
38、k;/*while(temp != 0*0f)temp = KEY_PORT & 0*0f;/P1 = key;return key;KEY_PORT = 0*df;temp = KEY_PORT;temp = KEY_PORT & 0*0f;if(temp != 0*0f)delayk();if(temp != 0*0f)temp = KEY_PORT;switch(temp)case 0*de: key = 2;break;/2case 0*dd: key = 5;break;/5case 0*db: key = 8;break;/8case 0*d7: key = 0;break;/0w
39、hile(temp != 0*0f)temp = KEY_PORT & 0*0f;/P1 = key;return key;KEY_PORT = 0*ef;temp = KEY_PORT;temp = KEY_PORT & 0*0f;if(temp != 0*0f)delayk();if(temp != 0*0f)temp = KEY_PORT;switch(temp)case 0*ee: key = 1;break;/1case 0*ed: key = 4;break;/4case 0*eb: key = 7;break;/7case 0*e7: key = *;break;/*while(
40、temp != 0*0f)temp = KEY_PORT & 0*0f;/P1 = key;return key; /beep=1;return KEY_NULL;/返回一个与键盘不相关的值void delayk()int *,y;for(*=0; *10; *+)for(y=0; y1000; y+);附录2:*include /包含单片机存放器的头文件*include /包含_nop_()函数定义的头文件sbit IR=P32; /将IR位定义为P3.2引脚sbit RS=P20; /存放器选择位,将RS位定义为P2.0引脚sbit RW=P21; /读写选择位,将RW位定义为P2.1引脚
41、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;i10;i+)
42、 for(j=0;j33;j+) ; /*函数功能:延时假设干毫秒*/ void delay(unsigned char n) unsigned char i;for(i=0;in;i+) delay1ms(); void beep()/蜂鸣器响一声函数 unsigned char i; for (i=0;i100;i+) delay1ms(); BEEP=!BEEP; /BEEP取反 BEEP=1; /关闭蜂鸣器 delay(250); /延时 /*函数功能:判断液晶模块的忙碌状态返回值:result。result=1,忙碌;result=0,不忙*/ unsigned char BusyT
43、est(void) bit result;RS=0; /根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1; /E=1,才允许读写 _nop_(); /空操作 _nop_(); _nop_(); _nop_(); /空操作四个机器周期,给硬件反响时间 result=BF; /将忙碌标志电平赋给resultE=0; return result; /*函数功能:将模式设置指令或显示地址写入液晶模块*/void WriteInstruction (unsigned char dictate) while(BusyTest()=1); /如果忙就等待 RS=0; /根据规定,RS和
44、R/W同时为低电平时,可以写入指令 RW=0; E=0; /E置低电平(根据表8-6,写指令时,E为高脉冲 _nop_(); _nop_(); /空操作两个机器周期,给硬件反响时间 P0=dictate; /将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四个机器周期,给硬件反响时间 E=1; /E置高电平 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四个机器周期,给硬件反响时间 E=0; /当E由高电平跳变成低电平时,液晶模块开场 /*函数功能:指定字符显示的实际地址*/ void Wri
45、teAddress(unsigned char *) WriteInstruction(*|0*80); /显示位置确实定方法规定为80H+地址码* /*函数功能:将数据(字符的标准ASCII码)写入液晶模块*/ void WriteData(unsigned char y) while(BusyTest()=1); RS=1; /RS为高电平,RW为低电平时,可以写入数据 RW=0; E=0; /E置低电平(根据表8-6,写指令时,E为高脉冲, / 就是让E从0到1发生正跳变,所以应先置0 P0=y; /将数据送入P0口,即将数据写入液晶模块 _nop_(); _nop_(); _nop_(
46、); _nop_(); /空操作四个机器周期,给硬件反响时间 E=1; /E置高电平 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四个机器周期,给硬件反响时间 E=0; /当E由高电平跳变成低电平时,液晶模块开场执行命令 /*函数功能:对LCD的显示模式进展初始化设置*/void LcdInitiate(void) delay(15); /延时15ms,首次写指令时应给LCD一段较长的反响时间 WriteInstruction(0*38); /显示模式设置:162显示,57点阵8位数据接口delay(5); /延时5msWriteInstruction(0*
47、38);delay(5);WriteInstruction(0*38);delay(5);WriteInstruction(0*0C); /显示模式设置:显示开,有光标,光标闪烁delay(5);WriteInstruction(0*06); /显示模式设置:光标右移,字符不移delay(5);WriteInstruction(0*01); /清屏幕指令,将以前的显示容去除delay(5); /*函数功能:对4个字节的用户码和键数据码进展解码说明:解码正确,返回1,否则返回0*/bit DeCode(void) unsigned char i,j;unsigned char temp; /储存解码出的数据for(i=0;i4;i+) /连续读取4个用户码和键数据码 for(j=0;j1; /temp中的各数据位右移一位 TH0=0; /定时器清0 TL0=0; /定时器清0 TR0=1; /开启定时器T0 while(IR=0) /如果是低电平就等待 TR0=0; /关闭定时器T0 LowTime=TH0*256+TL0; /保存低电平宽度 TH0=0; /定时器清0 TL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 科学用棱镜市场发展前景分析及供需格局研究预测报告
- 螺旋扳手市场发展前景分析及供需格局研究预测报告
- 云电子商务服务行业市场调研分析报告
- 书签产业链招商引资的调研报告
- 建筑的施工和维修行业市场调研分析报告
- 缆车细分市场深度研究报告
- 太阳镜出租行业经营分析报告
- 花园水管用喷雾器项目营销计划书
- 纸板棺材市场发展前景分析及供需格局研究预测报告
- 装有集成台面的厨房水槽项目运营指导方案
- 《酒店营销与数字化实务》课后参考答案 胡敏
- 航空器系统与动力装置学习通课后章节答案期末考试题库2023年
- 呕吐诊断与鉴别
- 成年人健康自我管理能力测评量表
- 《苏城有南园北园二处》2013年浙江宁波中考文言文阅读真题(含答案与翻译)
- 船舶油漆涂装检验协议(中英文)
- 牧童笛的基础知识与演奏技能 牧童笛的基础知识乐器的种类、选择和演奏姿势、注意事项
- 六年级上册数学期中试卷及答案
- 社区护理学(山东联盟)知到章节答案智慧树2023年山东第一医科大学
- 《科学家的故事》PPT课件(河北省市级优课)-三年级科学课件
- DB63T 1964-2021地理信息公共服务 地名地址采集入库规范
评论
0/150
提交评论