资源描述
简易苹果机的设计(软件部分)摘要IT行业飞速发展的今天,单片机在测控和低速信号处理等方面的应用越来越广泛。由于单片机采用大规模集成电路器件,集成度极高,因而具有结构紧凑、功能强、体积小、可靠性高、面向控制和价格低廉等一系列优点,特别适合于控制型应用领域。基于PIC的单片机系统具有体积小、成本低、易维护、性能稳定等特点,得到了越来越多的应用。本文重点阐述了基于PIC16F877单片机的苹果机系统的软件设计,首先对系统要求进行了分析,设计了系统的总体框架。以汇编语言为工具,进行了详细设计和编码。采用了HD7279 为驱动的44 键盘和LED数码显示管以及扬声器组成良好的“人机对话”模块,实现了音乐播放功能。关键词:PIC音乐播放HD7279II简易苹果机的设计(软件部分)AbstractBecause of its small size, functionality, low price, Single-Chip Microcomputer has been widely applied. In addition, the single-chip control System is more flexible than analog control; Second, it has high reliability due to fewer components, digital signal processing; Third, it can set the parameter simply, and makes the system testing convenient. Therefore, the single-chip control system is very suitable for control systems of application areas. In this paper the software design of apple_ game player ,which was design Based on the design with the PIC16F877 MCU is mainly explained. Requirement of the system have been analyzed firstly. The general aim of the soft ware system is to realize reliability stability safety and economization. Then have designed the whole frame work of the system. At last the author makes full use of assemble language to implement the detailed design and coding. Moreover it adopts the HD7279 as the driver of 44keyboards and the LG5641AH LED and the loud speaker which holds the excellent part of man-machine conversation and carries out the function of music playing.Key words:PIC ,music playing,HD7279目录IV第一章前言1第二章 系统设计方案分析22.1 课题待解决的问题22.2 总体设计方案22.3 工作流程分析22.4 设计具体方案3第三章PIC 单片机基础43.1 I/O 口介绍43.2 关于 BANK 和 PAGE 的概念53.3 定时器/计数器63.3.1 定时器的 3 大用途73.3.2 相关寄存器介绍73.4 中断系统:83.4.1 中断活动的 9 个阶段93.4.2 PIC16F877 的中断逻辑93.4.3 中断处理103.4.4 中断的优先级控制103.5.5 中断的现场保护113.5.6 几种常用的中断113.5.7 使用中断时需要注意的一些问题143.5 软件延时程序的设计153.5.1 三类指令的执行时间153.5 .2延时软件的设计方案实例163.6 查表程序设计16第四章 各子模块的实现及其说明214.1 键盘显示处理 HD7279214.2 显示译码芯片 MAX7219294.2.1 管脚描述294.2.2 典型应用304.3 音乐播放子程序334.3.1 音乐播放发声的原理334.3.2 音乐播放的实现过程344.4 E2PROM 扩展及 I2C 总线协议41第五章结束语42参 考 文 献43致谢44第一章前言单片机自问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广,发展很快。单片机体积小,重量轻,抗干扰能力强,环境要求不高,价格低廉, 可靠性高,灵活性好,开发较为容易。由于具有上述优点,在我国,单片机已广泛地应用在工业自动化控制、自动检测、智能仪器仪表、家用电器、电力电子、机电一体化设备等各个方面。它可以应用于产品的内部取代部分老式机械,电子零件或元器件,可使产品缩小体积,增强功能,实现不同程度的智能化。单片机的应用从根本上改变着传统的控制系统设计思想和设计方法,已成为现代机械电子工程,制动控制等相关专业知识结构中必不可少的一部分。单片机应用的意义不仅仅在限于它的广阔范围以及所带来的经济效益,更重要的还在于它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分控制功能,现在已能使用单片机通过软件方法来实现了。这种以软件取代硬件并能提高系统性能的控制技术称为微控制技术。微控制技术标志着一种全新的概念,随着单片机应用的推广普及,微控制技术将不断发展和日趋完善,而单片机的应用则将更加深入,更加广泛。换而言之,单片机的应用是对传统控制技术的一场革命。因此学习单片机的原理,掌握好单片机的应用技术是现代工科类学生必备的基本素质。单片机在近30年发展中已有70多个系列的进500多个机种相继诞生,国际比较知名,影响比较大的公司的单片机有:MOTOROLA公司的MOTOROLA单片机,INTEL 公司的51系列单片机,MICROCHIP公司的PIC系列单片机,ZILOG公司的Z8系列单片机,以及NEC,富士通,EPSON等其它品牌。其中美国Microchip公司推出的PIC8 位单片机系列是业内首先采用RISC结构的高性价比嵌入式控制器,其高速度、低电压工作、低功耗、强大驱动能力、低价OTP技术、体积小巧等都体现了单片机工业的新趋势。PIC系列单片机是一种采用精简指令集RSIC结构的易学易用,输入/输出灵活多样,功能强大的单片机。PIC中档产品,是近年来重点发展的系列产品,品种最为丰富,性能优于初级产品,增加了中断功能,带A/D转换器,内部EEPROM数据存储器,与程序存储器FLASH,有比较/捕获/脉宽调制CCP模块,IIC和SPI接口, 通用同步异步接收发送器USART,模拟电压比较器,及LCD驱动等,性能价格比高, 可广泛用于高,中档各类电子产品设计中,是很值得学习和掌握的一种单片机。43第二章 系统设计方案分析2.1 课题待解决的问题:整体实现简易苹果机的软件设计,熟悉 PIC 单片机的硬件资源,熟悉基本的控制接口电路,掌握单片机的串并行通信方式,以及端口拓展的方法。能够通过认真的分析设计要求,选择最简单,经济,稳定的方案实现该设计。从整体上提高控制电路的设计水平。2.2 总体设计方案:简易苹果机的整体系统大致可以分为以下几个模块:游戏的键盘输入部分, 输入币值,及获奖分值等的显示部分,音乐播放部分,存储空间的扩展部分,以及对数据进行一系列预算处理的中央处理单元。如图 2.2 所示:图 2.1总体设计框图2.3 工作流程分析:1) 电源开启,播放开启音乐,三个分值显示数码官状态为 EEE,三个中奖显示数码管状态也为 EEE,其他 8 个投注显示数码管状态也均为E。2) 游戏未开始前,显示灯呈现跑马灯状态,并能播放等候操作音乐。3) 玩家投币,等候音乐停止,显示灯全部熄灭,同时,分值显示数码管显示出相应分数,投币一次,扬声器发声一次。(或由庄家开启注入分值按键)。投注显示和中奖显示清 0。4) 游戏开始,玩家通过投注按键进行投注,短按投注显示加 1,长按则迅速增加(每秒加 3)。投注完毕,可按下启动按钮,开始游戏,显示灯循环点亮,经过 5 秒,老虎机显示停留在相应位置,显示中奖分数。同时投注显示数码管未压中的数码管全部熄灭。5) 玩家可通过按键(TURN)将分数直接转至投币分值显示,也可按 EXIT 键将分值转成硬币通过退币口退出(不足已退币分值自动加到投币显示区显示)。6) 此时,若分值显示区显示值高于上轮投注分值,可直接按开始键(play),重复刚才下注,开始新一轮游戏。也可以重新下注,开始新游戏。7) 玩家结束游戏,可按 Exit 键将分值折合成硬币后退出。播放待机音乐。2.4 设计具体方案:1 中央处理单元:通过对系统的性能和成本各方面进行整体分析,使用单片机来做处理器是最合理的方案。在总类繁多的单片机中,PIC16F877 单片机有以下优越之处,是最适合本设计。采用哈佛体系结构和哈佛总线结构,指令单字节化, 精简指令集(RISC)技术,寻址方式简单,运行速度高,功耗低,驱动能力强,I2C 和 SPI 串行总线端口,寻址空间设计简洁,外接电路简洁,开发方便。2 键盘部分:使用 HD7279 芯片对键盘输入进行译码处理,并且该芯片可以直接驱动 LED 数码管显示。3 显示部分:使用 MAX7219 芯片,LED 数码显示管,八个发光二极管。4 音乐播放部分:只需通过一个音频放大器再外接一个扬声器。图 2.2具体设计框图第三章PIC 单片机基础3.1 I/O 口介绍:输入输出端口(也简称为 I/O 口)是单片机内部电路与外部世界交换信息的通道。输入端口负责从外界接收检测信号,键盘信号等各种开关量信号。输出端口负责向外界输送由内部电路产生的处理结果,显示信息,控制命令,驱动信号等。在 PIC16F87X 系列单片机中 28 脚封装的型号具有 3 个输入输出端口,40 脚封装的PIC16F87X 系列都有 5 个输入 / 输出端口。由于 PIC16F87X 属于 8 位单片机,因此每个端口都由数量不超过 8 条的端口引脚(或称口线)构成。每个端口中的每条引脚都可以用软件的方式,由用户按需要单独编程,设定为输出引脚或者输入引脚。28 脚 PIC16F87X 的 3 个端口,分别是 RA,RB,和 RC;40 脚 PIC16F87X 的 5个端口,分别是RA,RB,RC,RD 和 RE。RA 包含 6 根引脚,RE 包含 3 根引脚, RB,RC,RD 都包含 8 根引脚。其中有些 I/O 口引脚和单片机内部的某些功能部件或(I/O 模块之外)其他外围模块的外接引脚信号线进行了复用。也就是说,既可以作为普通的I/O 引脚,又可以作为某些功能部件或外围模块的外接引脚,并由用户以软件的方式定义。图 3.1PIC16877 管脚分部图在 PIC 单片机中,每个端口都至少对应着两个在 RAM 数据存储器中统一编址的寄存器,分别是数据寄存器和方向控制寄存器。也就是 PIC 单片机把端口都当作寄存器来访问(即读出或写入),这样有利于减少指令集的指令类型和数量,为用户的记忆和编程也带来了方便。例:初始化,使C 口为输出,B 口为输入BSFSTATUS ,RP0;设置文件寄存器的体一MOVLW00HMOVWFTRISC;设置端口 C 为输出MOVLW0FFHMOVWFTRISB;设置端口 B 为输入BCFSTATUS ,RP0;恢复到文件寄存器的体 03.2 关于 BANK 和 PAGE 的概念:在指令编码中,只有最低的 7 位数据代表了寻址操作数的地址,位操作也不例外。7 位地址只能描述的空间范围为 128 字节,因此,通过指令能直接寻址的范围只有 0X000X7F 的 128 字节空间,PIC 中档单片机结构能支持的数据空间寻址范围为 512 字节,这需要 9 位的地址描述。所以要能寻址这 512 字节全地址空间,就必须找一个方法提供额外的两个地址位,用完整的 9 位地址来寻址。PIC 中档系列的单片机就利用了 STATUS 状态寄存器的 RP1 和 RP0 这两个位来实现这“额外”的寻址地址位。按照 7 位地址所描述的 128 字节为一个 BANK 的划分,PIC16F877 被分为4 个BANK,分别冠以BANK03。下表为STATUS 中RP0:RP1和各 BANK 之间的对应关系。表 3.1BNAK 和 STATUS 的对应关系RP1:RP0BANK 的编号00BANK 001BANK 110BANK 211BANK 3例:寄存器直接寻址的 BANK 设定BSFSTATUS , RP0;RP0=1BCFDATUS , RP1;RP1=0 ,当前 BANK 设定于 BANK1 CLRFTRISBBCFSTATUS , RP0;RP0=0,回到 BANK0 MOVLW0XFFMOVWFPORTB如果 PIC 单片机内只有两个 BANK 空间的数据寄存器,那么直接寻址时 RP1 位将被视为无效位,不参与寻址时的地址合成,编程时只需简单的设定 RP0 即可。同理,在 PIC 单片机的 35 条指令当中,只有 CALL 和 GOTO 两条为直接跳转指令。这两条指令有一个共同点,即在指令中有 11 个数据位描述了跳转的目的地址。这 11 位长的地址所能描述的空间范围是 2048 字。PIC 中档系列单片机结构能支持的程序空间最大有 8K 字代码长度,要寻址 8K 字的范围必须有 13 位的地址。如果这 13 位地址数据全部在指令中描述的话,那么只有 1 一位代表操作码,这样的编码方式是行不通的。为此 PIC 单片机采取了与数据寄存器类似的方法:对程序空间分页,每页长度位 2K 指令字,最多 4 个页面。跳转指令自身提供 11 位地址,高两位地址来自特殊寄存器 PCLATH 的位 4:3.当执行 CALL 和 GOTO指令时单片机的指令执行机构会自动把二者合在一起,构成 13 位的完整地址一次送入程序计数器 PC 中,程序随之跳转到新的指令位置继续执行。PCLATH4:3 两位的组合构成了单片机程序页面的编号,如表 3.3 所示:表 3.2 PAGE 与 PCLATH 的关系PCLATH4:3页编号起止地址00第 0 页0X00000X07FF01第 1 页0X08000X0FFF10第 2 页0X10000X17FF11第 3 页0X18000X1FFF3.3 定时器/计数器在许多世界著名的半导体制造公司开发的型号繁多的单片机内部,定时器/ 计数器模块是一种基本上普遍配置的常用外围设备模块,只是配备的数量和规格不同而已。其中,规格的不同指的是:宽度不同。是否附带预分频器,是否附带后分频器,是否同时附带预分频器和后分频器,以及预分频器或后分频器的分频比不同,等等。3.3.1 经过归纳和比较定时器一般有一下 3 大用途:(1) 在一些单片机应用项目中,有时要求单片机在其端口引脚,向外部电路送出一系列符合一定时序规范的方波信号。在本设计中的音乐功能部分就是利用此功能向扬声器送出特定频率的方波信号,使扬声器播放出不同的音符。(2) 在另外一些应用项目中,经常要求单片机在其引脚上,检测外部电路送来的一系列的方波信号的脉宽,周期或频率,以便单片机接收外部电路的输入信号或通信信号。例如:遥控电视机中的红外遥控信号的接收,速度里程表中的转速检测,等等。这类应用程序的编写,会用定时器来对“事先未知”的时间间隔进行精确计时。(3) 还有一些单片机应用项目中,须要单片机对其端口引脚上输入的由外部事件产生的触发信号进行准确的计数,依据计数结果来控制完成相应的动作。由于单片机的型号不同,定时器的数量是不同的。例如:PIC116F84 只有两个定时器,而16F877 有三个定时器。而且16F877 的三个定时TMR0 ,TMR1,TMR2 这三个定时/计数模块的电路结构上均不相同。TMR0:为 8 位宽,有一个可选的预分频器,用于通用的目的;TMR1:为 16 位宽,附带一个可编程的预分频器,还附带一个可选的低频时基振荡器,适合 CCP(捕捉比较脉宽调制)模块配合使用来实现输入捕捉或输出比较功能;TMR2:为 8 位宽,同时附带一个可编程的预分频器和一个可编程的后分频器, 还附带一个周期寄存器和比较器,适合与 CCP 模块配合使用来实现PWM 脉冲宽度调制信号的产生。但是它们之间也有相同点,它们的核心部分都是一个由时钟信号触发的按递增规律(即累加工作方式)工作的循环计数器;都是从预先设定的某一初始值(或0)开始记起,在累积超过最大值(或预先设定的某一终了值)时产生溢出,并且同时会建立一个相应的溢出标志(即中断标志位);对于它们的编程方法也大同小异。3.3.2 几个起到控制作用的相关寄存器介绍:1选项寄存器OPTION_REGBIT7BIT6BIT5BIT 4BIT 3BIT 2BIT 1BIT 0RBPUINTEDGT0CST0SEPSAPS2PS1PS0 PS2PS0:分频器分频比选择位 PSA:分频器分配位。1=分配给 WDT0=分配给 TMR0 TOSE:TMR0 的时钟源触发边沿选择位。1=外部时钟 T0CKI 下降沿 TMR0 递增0=外部时钟 T0CKI 上升沿 TMR0 递增 TOCS:TMR0 的时钟选择位。1=外部引脚输入的脉冲信号作为计数器的时钟源BIT7BIT6BIT5BIT 4BIT 3BIT 2BIT 1BIT 0GIEPEIETOIEINTERBIETOIFINTFRBIF0=由内部提供的指令周期信号作为时中源。中断控制寄存器:INTCON有关的各位的含义如下: T0IF:TMR0 溢出标志位1=TMR0 发生溢出0= TMR0 未发生溢出 T0IE:TMR0 溢出中断使能位1= 允许 TMR0 发生溢出后产生中断0= 屏蔽 TMR0 发生溢出后产生中断 GIE:全局中断总使能位1=允许 CPU 响应所有的外围设备模块产生的中断请求0= 禁止 CPU 响应所有的外围设备模块产生的中断请求3.4 中断系统:中断,是计算机理论和计算机技术中很重要的一个概念,是提高计算机工作效率的一项重要功能,以至于中断功能是所有的微处理器(CPU 和 MPU) 和微控制器(MCU, C 或单片机)几乎都会配置的一项基本功能。中断功能的强弱已经构成了衡量一种微处理器和微控制器的功能是否强大的重要指标之一。当计算机系统正在执行程序时,出现了某种特殊情况,例如定时时间到,有键盘信号输入等,此时 CPU 需要暂时停止当前的程序,转去执行处理定时时间到或键盘信号输入等情况的某特定程序,待这段特定的程序执行完毕以后,再回到原先的程序去执行,这就形成了一次中断过程。3.4.1 中断活动的全过程大致可以归纳成一下 9 个阶段:(1) 中断请求(2) 中断屏蔽(3) 中断响应(4) 保护现场(5) 调查中断源(6) 中断处理(7) 清除标志(8) 恢复现场(9) 中断返回上述的九个阶段中,第 1,2,3 和 9 阶段是由硬件自动实现的,而第 4,5, 6,7,8 阶段则是用户软件完成的。PIC 系列单片机是当今世界上很有影响力的精简指令微控制器,具有丰富的中断功能,其中功能强大的中,高档型号的中断源有 18 种之多。(但是具体型号不同中断源的个数也存在着差异)。不过它们也存在着一定的局限性,例如:中断矢量只有一个,并且各个中断源之间也没有优先级别之分,不具备非屏蔽中断。3.4.2 PIC16F877 的中断逻辑:图 3.2PIC 16F887 的中断逻辑图所有的中断源都受全局中断屏蔽位(也可称为总屏蔽位)GIE 的控制;第一队的中断源不仅受全局中断屏蔽位的控制,还要受各自中断屏蔽位的控制;第二队的中断源不仅受到全局中断屏蔽位和各自中断屏蔽位的控制,还要额外多收到一个外设中断的屏蔽位PEIE 的控制。按照图中描绘的逻辑电路,可以得到以下逻辑表达式:GIE*(T0IF*T0IE+INTF*INTE+RBIF*RBI E+PEIE*(EEIF*EEIE+PSPIF*PSPIE+ADIF*ADIF+ RCIF*RCIE+TXIF*TXIE+SSPIF*SSPIE+CCP1IF*CCP1IE+CCP2IF*CCP2IE+TMR1IF*TMR1 IE+TMR2IF*TME2IE+BCLIF*BCLIE)=1当该逻辑表达式计算结果为“1”时表明至少有一个中断源向 CPU 发出了中断请求信号,并且请求信号传递途径中各关卡全部都放行,使该中断请求信号一路畅通无阻地被传递到CPU,于是该中断请求就得到了CPU 的响应。如果该逻辑表达式的计算结果为“0”时,则表示所有的中断源设备都没有请求中断信号发出,或者是各个中断源对应的中断屏蔽位都被关掉,或者是被开放的部分中断源又没有发出中断请求,或者是全局中断屏蔽位GIE 被关掉。3.4.3 中断处理:单片机复位后,由硬件自动对全局中断屏蔽位进行设置 GIE=0,将屏蔽所有的中断源;中断返回指令“RETFIE”执行后,也由硬件自动对总屏蔽位进行设置GIE=1,重新开放所有的中断源。不论各种中断屏蔽位和全局中断屏蔽位 GIE 处于何种状态(是开放还是禁止),某一中断源的中断条件满足时,都会发出中断请求,相应的中断标志位都会被置位(=1)。但是是否能够得到 CPU 的响应,则要根据该中断源的中断屏蔽位的状态来决定。3.4.4 中断的优先级控制:PIC 单片机的入口地址只有一个,故对中断优先级的控制也由编程人员通过软件来实现。当某一时刻有两个中断同时发生时,单片机会进入 0X0004 处的中断服务子程序开始判别中断源类型,判别一个就做一个中断服务。这样的软件处理流程决定了先被判别的中断其优先级为高,后判别的优先级为低,这就是用软件优先级的概念。例如:;中断服务代码,开始判别中断源BTFSCINTCON, T0IF;判别是否为 TMRO 产生的中断GOTOTMRO_INTF;是转去做 TMR0 的中断服务BTFSCINTCON, INTF;不是 TMR0 中断,继续判别是否为 RB0/INT 中断GOTORB0_INT;继续判别是否为其它中断源在上例中,TMR0 的中断优先级就比 INT/RB0 中断的优先级要高。如果 TMR0 和INT/RB0 同时发生中断请求,TMR0 的中断将优先于 INT/RB0 得到服务。PIC 单片机的如此中断优先级的控制还有个关键的地方,就是高低优先级一般不考虑嵌套。如果现在正在处理低优先级的中断,就算有高优先级的中断发生, 也必须等到低优先级的中断处理完毕后才能响应,这是由 PIC 单片机的中断机制决定的。在响应任何中断请求时,PIC 单片机会自动把全局中断使能位(INTCON 的第七位 GIE)清除。这样其他中断请求就暂时不被响应。以上例代码来分析, 假定现在 INT/BB0 发生了中断,TMR0 没有中断请求,则程序进入中断服务,并转到 RB0-INT 处,开始执行外部引脚中断服务;而当程序正忙于执行 RB0-INT 的程序,即中断没有退出前,TMR0 发生了中断请求,尽管在软件优先级 TMR0 的中断要比 RB0_INT 的优先级高,但这时 TMR0 中断将不会得到响应。TMR0 的中断请求将一直被挂起直到现行的中断服务结束且退出中断。一旦中断退出,单片机将马上响应被挂起的 TMR0 中断。3.5.5 中断的现场保护:一般单片机中断现场保护都是把关键的寄存器放到堆栈中,中断退出前再从堆栈中恢复其原先的内容。PIC 单片机无法实现这种现场保护,因为 PIC 单片机内没有可供用户使用的数据堆栈。PIC 单片机内的堆栈区是硬件堆栈,其唯一用途是保存程序计数器 PC 的值。所以,进入中断时保护普通寄存器的唯一办法是将其内容复制到其它数据寄存器(RAM 变量)作备份,在中断结束前再把这些备份寄存器中断的内容复制回原先对应的寄存器。哪些寄存器需要在进入中断时保护呢?这完全取决于自己的设计。最基本的当然是工作寄存器W 和状态寄存器 STATUS,因为这两个寄存器在中断服务子程序中是必然用到的。有一个基本的原则必须遵循:如果要在中断服务子程序中改变一个寄存器的值,那么在中断服务开始之初就要把它的内容复制到备份寄存器中保护;待中断结束时再恢复其原有内容。除了 W 和 STATUS 寄存器,PCLATH 和 FSR 这两个重要的寄存器也经常需要保护。3.5.6 几种常用的中断:(1) RB0/INT 引脚的中断:所有中档以上的PIC 单片机,其 PORTB 的 RB0 口引脚可以作为一个外部中断信号输入,可以对输入信号上升沿或下降沿跳变产生一个中断响应。要能实现RB0/INT 中断源,软件初始化的设定步骤如下: 设定 RB0/INT 引脚为输入模式,TRISB=1 配置 OPTION-REG即 INTEDG 位:INTEDG=1,RB0/INT 引脚输入信号上升沿产生中断;INTEDG=0,下降沿中断。 清除 INTCONINTF=0,确保在有效中断发生前中断标志位为 0。 设定 INTCONINTF=1,允许 RB0/INT 中断响应。 设定 INTCONGIE=1,打开全局中断允许使能位。 中断信号出现后,进入中断服务程序,查询INTF 中断标志。 若 INTF=1,则处理 RB0/INT 中断,处理完毕后(或处理前)软件必须清除 INTF 中断标志位。例:RB0/INT 引脚中断初始化;初始化 RB0/INT 引脚的中断功能BANKSE1TRISB;切换到 TRISB 所在的 BANK1BSFTRISB, 0;确保 RB0 为输入状态BCFOPTION-REG , INTEDG;选择下降沿中断,BCFOPTION-REG , RBPU;选择使用 PROTB 内部弱上拉BANKSEINTCON;切换到INTCON 所在的 BANK0CLRFINTCON;INTCON 内全部数据位清 0 BSFINTCON , INTE;允许 RB0/INT 中断BSFINTCON ,GIE;打开全局中断使能位;其它代码此引脚也可以让处于睡眠状态的单片机在有效的条边沿出现时被唤醒。(2) RB 口的 RB7RB4 引脚变化中断:PORTB 的最高 4 个引脚,即 RB7RB4,在设为输入模式下,当输入电平由高到低,或由地到高发生变化时,可以让单片机产生中断。这就是通常所说的引脚状态变化中断。为了实现 PORTB 引脚状态变化中断,一般需遵循一下的操作步骤: 设置 TRISB 寄存器,使 RB7RB4 相关的引脚处于输入状态; 检查是否需要使用 PORTB 的内部弱上拉电阻,通过 OPTION-REG控制; INTCONRBIF=0; INTCONRBIE=1; INTCONGIE=1;响应状态变化后的中断服务程序其执行流程通常如下: 检查 INTCONRBIF=0,进入中断服务; 读一次 PORTB,更新引脚锁存器的状态,消除产生中断的硬件条件; INTCONRBIF=0,软件清除中断标志。编程实例:闪烁式跑马灯8 只 LED 中只有一只点亮,点亮的位置与循环的方式不停地移动,移动的速度取决于在各个位置上停留的时间,即在两步之间插入一个约 196MS 的延时, 并且在每一个位置上LED 都保持闪烁。图 3.3跑马灯流程图ORG000H NOPGOTOMAINORG004H;中断向量,中断服务子程序入口地址TMR0SERVMOVWF W-TEMP;复制 W 到它的临时备份寄存器 W-TEMP 中BCFINTCON , TOIF ;清除 TMR0 中断标志位INCFFLAG , F;亮灭标志位反转BTFSSFLAG ,0;标识位=1?是!跳一步,到熄灭GOTOJUMP0;否!跳到点亮CLRFPORTC;熄灭GOTOJUMP1;跳过下面的程序JUMP0MOVFPROTC-B,W;点亮,即将缓冲寄存器内先传入 W MOVWFPROTC;再由 W 转入端口寄存器送显JUMP1MOVLWTMR0-B;TMR0 赋初值MOVWFTMR0;重新启动定时器MOVFW-TEMP ,W;恢复现场RETFIE;中断返回;主程序MAINBSFSTATUS ,RP0MOVLW0MOVWFTRISCMOVLW07HMOVWFOPTION_REG;分频比设置为 256BCFSTATUS , RP0MOVLW0A0HMOVWFINCTION;开放全局中断使能位BCFINCTION , T0IF;清除 TMR0 溢出中断标志位MOVLWTMR0_B;TMR0 赋初值MOVWFTMR0;启动定时计数器MOVLWB10000000;将显示码送 WMOVWFPORTC_B;将显示码送显示缓冲寄存器LOOPCALLDELAY;调用延时子程序RRFPORTC-B , F;带进位标志位右移缓冲区寄存器GOTOLOOP;延时子程序略3.5.7 使用中断时需要注意的一些问题:(1) 单片机初次上电复位,电源跌落复位和其它情况之下的复位,均会导致总屏蔽位的和其他所有中断屏蔽位都被清 0,也就是在默认状态下,禁止CPU 响应所有中断。(2) 中断标志位的状态与该中断源是否被屏蔽无关,也与全局中断屏蔽位无关。也就是说不管 CPU 是否响应中断请求,只要满足了中断条件,中断标志位就会被置位。(3) 如果在中断被禁止的情况下,中断标志位已经被置位,只要不被清除就会一直潜伏下来,那么一但解除禁止,就会立即产生中断响应。(4) 如果同时发生多个中断请求,到底哪个中断会优先得到处理,完全取决于在中断服务子程序中检查中断源的顺序,原因是各个中断源之间不纯在优先级之分。(5) 如果清除中断标志位的指令应安排在中断服务子程序的尾部,就有可能会丢失响应在处理中断期间该中断源第 2 次出现中断请求的机会。(6) 对于中断响应和处理时间有严格的应用,保护现场的指令安排也应考虑延时问题。(7) 响应中断时产生的延时时间,会随着中断源被开放的个数不同而不同。开放中断源个数越多,延时时间越长。3.5 软件延时程序的设计在编程时经常需要在程序的执行过程中插入一段延时时间,对此有 2 种方案可供选择:一是利用片内的硬件资源可编程定时器,二是利用软件手段 插入一段延时程序。在此仅先介绍后面一种方法。如果延时时间较短,可以连续插入几条空操作指令 NOP;如果延时时间较长可以插入一段单一循环或多重循环的循环结构延时程序。3.5.1 三类指令的执行时间在编写延时程序程序之前,必须对 PIC 单片机指令系统中的每一条指令的执行时间(即指令周期)了如指掌。在 35 条指令构成的指令系统中,5 条实现无条件跳转的必然引起程序执行顺序发生变化的指令(即:GOTO,CALL,RETURN,RETLW,RETEFIE)占用 2 个指令周期;还有改写 PCL 的指令也占用两个指令周期,(如 ADDWF PCL,1 或 MOVWF PCL或 BCF PCL,B 等)。而有可能引起程序执 行顺序发生变化 的 4 条条件跳 转指令( 即DECFSZ,INCFSZ,BTFSC,BTFSS)DE 执行时间随着条件而定,当条件为发生真发生跳转时需要占用 2 个指令周期,当条件为假不发生跳转时仅占一个指令周期。其余指令全部仅仅占用一个指令周期;其余指令全部仅仅占用一个周期。但由于采用流水作业方式,即取指和执行重叠进行,这样使得每一条指令占用时间平均降为一个指令周期。可是在程序遇到跳转指令时,流水作业方式被打破,在执行该指令的同时所抓取的下一条指令不在是下一部将要执行的指令,必须将其丢弃,从跳转目的地从新抓取,因此而多占用了一个指令周期。另外还应搞清楚单片机时基振荡器外接的频率 fsoc,以便确定时钟周期(Tosc=1/fosc) 和指令周期(Tc=4Tosc)以及程序执行时间的累计。3.5 .2延时软件的设计方案实例:首先定义 2 个循环控制变量 N 和 M ,用于保存和决定延时时间长短的时间常数。为了便于计算,每条指令后面的注释部分中的括号内都给出了指令周期数。例一:NEQU20H;定义寄存器 NMEQU21H;定义寄存器 MDELAYMOVELWX;(1)循环变量初始值 X(待定)经 W 转送 N MOVWFN;(1)LOOPDECFSZN,1;(12)N-1 送 N 并判断结果=0?是!跳出循环GOTOLOOP;(2)否!循环回去RETURN;返回调用程序执行上述延时子程序 DELAY1 所需要指令周期个数=1+1+(1+2)*(x-1)+2+2。式中的“1+1”对应两条 MOV 指令;“1+2”对应 DECFZ(非跳转)和 GOTO 指令;“X”是循环变量递减的次数,“X-1”是循环次数,由于 DECFSZ 指令的执行过程是先递减后判断再跳转,所以循环的次数比递减的次数小;接下来的“2”对应DECFSZ(成功跳转)指令;最后的“2”对应 RETURN 指令。当时钟晶振的频率选用“4MHZ”时,每个指令周期 Tcyc 为 1 s( Tcyc=4Tosc=4/fosc)。在上面的计算式中:当时间常数 X=1 时,延时=(1+1+2+2)Tcyc =6Tcyc=6 s;当 X=99 时,延时=1+1+(1+2)*(99-1)+2+2Tcyc=300Tcyc=300 s=0.3ms3.6 查表程序设计:在单片机的开发应用中,经常用到查表程序,来实现代码转换,索引,或翻译等。下面就以LED 数码管显示驱动程序设计作为讲解的范例。LED 数码管内部包含8 只发光二极管,其中 7 只发光二极管构成字形笔段,(AG),1 只发光二极管构成小数点(dp)。对于任何一只发光二极管,只要阳极为高电平,阴极为低电平,并且电位差高于其阈值电压(约为 1.72.1V)就会被点亮。根据个二极管公共端连接的方式不同,又有共阴极和共阳极 LED 数码管之分,如图 3.6 所示。驱动 LED 点亮的笔段码和 LED 所显示字符之间的关系如表 3.6 所示。图 3.5 数码管结构示意图表 3.6LED 点亮的笔段码和 LED 所显示字符之间的关系显示字符共阴极笔段码共阳极笔段码显示字符共阴极笔段码共阳极笔段码03FHC0HA77H88H106HF9HB7CH83H25BHA4HC39HC6H34FHB0HD5EHA1H466H99HE79H86H56DH92HF71H8EH67DH82HP73H8CH707HF8HU3EHC1H87FH80H全熄00HFFH96FH90H全亮FFH00HPIC 单片机的查表程序,可以利用其子程序带返回值指令RETLW 来实现。思路是采用若干条携带着笔段码的RETLW 指令按索引值的顺序排列在一起,来构成一张数据表;然后以表头为参照,以被显示数字为索引值,到表中查找对应被显数字的笔段码。具体方法是采用带有入口参数和出口参数的子程序结构,用数据表来构成子程序的主体部分。在子程序的开头放一条修改程序计数器 PC 值的指令,来实现子程序内部的跳转,以实现索引。查表过程是,在主程序中先把被显数字索引值,作为笔段码在数据表中的地址偏移量存入 W,以便向子程序传递参数,接着调用子程序。子程序的第 1条指令将 W 中的地址偏移量取出并与程序计数器 PC 当前值叠加,则子程序就会跳到携带着所需笔段码的 RETLW 指令处。由指令将笔段码装入 W 中,以便向主程序传递参数,然后返回子程序。例:假设用 8 位端口 RB 作为一只共阴极 LED 数码管的驱动端口。现在要求把寄存器单元 20H 中的低半字节作为一位十六进制数送到 LED 显示。欲采用端口 RB 作驱动。需要将该端口的个引脚全部设置为输出,方法是将RB 端口的方向控制寄存器 TRISB 的各位全部清零。另外从主程序到子程序传递参数(就是被显示数字,也是用于查表的地址偏移量)以及从子程序到主程序返回参数(即查到的被显数字的笔段码)用的都是 W。下面是实现这一功能的程序流程图和程序段。图 3.6主程序流程图图 3.7子程序流程图程序段:PCLEQU02H;声明寄存器PCL 的地址为 02HSTATUSEQU03H;声明寄存器 STATUS 的地址为 03HRP0EQU06H;声明 RP0 的位地址为 06HRBEQU06HTRISBEQU86H;主程序ORG0000HGOTOMAINORG0005HMAIBSFSTAT US, RP0CLRFTRISBBCFSTATUS , RP0MOVF20H ,0ANDLW0FHCALLCONVERTMOVWFRBSTOPGOTOSTOP;查表(即转换子程序)CONVERT;子程序名称ADDWFPCL , 1;把W 内容叠加到 PC 的低 8 位上TABLERETLW3FH;“0”的笔段码RETLW06H;“1”的笔段码RETLW5BH;“2”的笔段码RETLW4FH;“3”的笔段码RETLW66H;“4”的笔段码RETLW6DH;“5”的笔段码RETLW7DH;“6”的笔段码RETLW07H;“7”的笔段码RETLW7FH;“8”的笔段码RETLW6FH;“9”的笔段码RETLW77H;“a”的笔段码RETLW7CH;“b”的笔段码RETLW39H;“c”的笔段码RETLW5EH;“d”的笔段码RETLW79H;“e”的笔段码RETLW71H;“f”的笔段码;END;程序全部结束数据表可以看成是由 16 条 RETLW 指令构成,表头为 TABEL.当程序跳转到子程序便开始执行 ADDWF 指令,同时程序计数器的当前值已经指向表头。在此基础上在叠加存在W 的表内地址偏移量,假设该偏移量为 8 ,则叠加后的PC 指向 RETLW 7FH 指令(其中 7FH 即为数字 8 的显示笔段码);使程序跳转到该指令并执行它,执行后便返回到主程序,并同时将 7FH 装入 W 中。第四章 各子模块的实现及其说明4.1 键盘显示处理 HD7279在设计单片机系统时,要求选用合适的单片机,在保证功能实现的情况下, 力求外围不在扩展元件,或者少扩展,尽可能突出其“单片”的优势,进一步简化系统,提高系统的稳定性。通常单片机系统在许多场合需要键盘输入和数码显示功能,在需要键盘和数码管较多时,若选用并行总线的 8279 键盘显示芯片配合74LS138 译码器来扩展单片机键盘显示电路,将占用数据总线和许多个I/O 口, 硬件较为复杂。而利用串行键盘显示芯片HD7279A 来扩展单片机系统只需要占用 4 个 I/O 口,因此这里我们选用HD7279 来扩展单片机的键盘显示电路。HD7279是一片具有串行接口的,可同时驱动8位共阴式数码管,或64只独立LED的智能显示驱动芯。片该芯片同时还可连接多达64键的键盘矩阵。单片即可完成LED显示键盘接口的全部功能。HD7279内部含有译码器可直接接受BCD码或16 进制码并同时具有2种译码方式。此外还具有多种控制指令,如消隐,闪烁,左移,右移,段寻址等。HE7279具有片选信号,可方便地实现多于8位的显示或多于64键的键盘接口。图 4.1 HD7279 管脚分布图表 4.1 HD7279 引脚说明4.1.1 程序中应用的重要控制指令:HD7279的控制指令分为两大类纯指令,和带有数据的指令。1纯指令: 复位(清除)指令A4H当HD7279收到该指令后,将所有的显示清除,所有设置的字符消隐,闪烁等字符也被一起清除。执行该指令后,芯片所处的状态和上电所处的状态一样。 测试指令BFH该指令所有的LED全部点亮,并处于闪烁状态,主要用于测试。 .左移指令A1H所有的显示自右向左(从第一位向第八位)移动,包括处于消隐状态的显示位。但对各位所设置的消隐及闪烁属性不变。移动后最右边一位为空(无显示)。 .右移指令A0H与左移指令类似,但所作的移动为至左向右(从第8位向第一位)移动。移动后,最左边一位为空。 .循环左移指令A3H与左移指令类似,不同之处在于移动后原最左边一位(第8位)的内容显示于最右边(第一位) .循环右移指令A2H与循环左移指令类似,但是方向相反。2 带有数据的指令: .下载数据且按方式0译码X =无影响命令由两个字节组成,前半部分为指令,其中a1,a2,a0为位地址,具体分配如下:d 0 d 3 为数据,收到此指令时,HD7279按以下规则(译码方式0)进行译码, 如表4.2。表4.2HD7279译码真值表:小数点显示由dp位控制,DP=1时,小数点显示。DP=0时小数点不显示 .闪烁控制88H此命令控制各个译码管的显示属性。D1D8分别代表数码管18,0闪烁,1不闪烁。开机后缺省的状态为各位均不闪烁。 .消隐控制98H此命令控制各个数码管的消隐属性。D0D8分别对应数码管18。1显示,0消隐。当某位赋予了消隐属性以后,HD7279在扫描时将跳过该位,因此在这种情况下无论对该位写入何值,均不会被显示,但写入的值将被保留,在将该位重新设为显示状态后,最后一次写入的数据将被显示出来。当无需用到全部8个数码管显示的时候,将不用的位设为消隐属性,可提高显示的亮度。注意:至少有一位要处于显示的状态,如果消隐控制指令中D1D8全为0将不被接受,HD7279将保持原来的消隐状态不变。 .读键盘数据指令15H该指令从HD7279读出当前的按键代码。与其它的指令不同,此命令的前一个字节00010101B为微控制器,传送到HD7279的指令,而后面一个字节D0D7则为HD7279返回的按键代码,其范围是03FH(无键按下时为0XFF)当HD7279检测到有效的按键时,KEY引脚从高电平变成低电平,并一直保持到按键结束。在此期间,如果HD7279接收到“读键盘数据指令”,则输出当前按键的键盘代码,如果在收到:“读键盘指令”时没有有效按键,HD7279输出FFH(11111111B)HD7279应连接共阴式数码管。无需用到的数码管和键盘可以不接,省去数码管,或设置数码管消隐属性均不会影响键盘的使用。实际应用中8只下拉电阻和八只键盘连接位选线,DIGODIG7的八只电阻(一下称为选电阻),应准从一定的比例关系,下拉电阻应大于位选电阻的5倍小于50倍,典型值为10倍,下拉电阻的取值范围是10K100K,位选电阻的取值范围是1K10K。在不影响显示的前提下,下拉电阻应尽可能的取较小的值。这样可以提高键盘部分的抗干扰能力。因为采用循环扫描的工作方式,如果采用普通数码管亮度有可能不够,采用高亮或超量的型号,可以解决这个问题。数码管的尺寸亦不宜选得过大,一般字符高度不应超过1英寸。HD 7279的RESET复位端在一般应用的情况下,可以直接与正电源连接,在需要较高可靠的情况下,可以连接一外部的复位电路,或直接由单片机控制。在上电或RESET端由低电平变成高电平后HD7279大约需要1825MS的时间才会进入正常的工作状态。上电后所有的显示均为空,所有显示位的属性均为“显示”及“不闪烁”。当有键按下时,KEY引脚输出变为低电平,此时如果接收到“读键盘”指令, HD7279将输出所按下的按键代码。如果在没有按下的情况下收到“读键盘”指令,HD7279将输出FFH(255)程
展开阅读全文