资源描述
个人收集整理 勿做商业用途
某汽车驾驶室噪声分析
序 言
自从单片机问世以来,在国外,它已广泛应用于自动控制、数据采集和处理、家用电器等各方面,同时也渗透到其它各个科技领域。在国内,虽然起步较晚,但由于单片机价廉物美、功能强、体积小、使用灵活方便,得到发展越来越多的发展,尤其在工业过程控制、自动化仪器等领域得到广泛应用。对推动国家的工业现代化进程有着重大意义。
现代工业中绝大部分的动力装置都是用电机来实现的,由于电机并不能自身对转速进行控制,在以前只能用机械装置对电机进行调速,随着机械调速装置在实际应用中暴露出来的噪音、能耗大以及易磨损、占用空间大、安装不便等问题,人们开始把目光投向了电子调速。本设计目的就是利用单片机对当前国内使用最多的三种电机进行调速。
本说明书共分为4章,第一章课题分析与方案论证;第二章对硬件进行了详细的说明;第三章对系统的软件进行了分析;第四章有选择地列举了软硬件在调试过程中出现的问题,并对问题作出了分析;其中重点是单片机的各接口单元电路的设计,以及数据的显示处理。设计的最终成果是能通过按钮对电机的速度进行控制,并实现对交流电机转速模拟量的采集,并通过LED进行显示.
第1章 课题分析与方案论证
1.1课题任务分析
本课题主要实现用单片机控制交流、直流、步进三种电机转速的目的,并采集变频器转速输出口的电流信号将交流电机的实际转速显示出来.
实验室现有的西门子变频器有一模拟量输入口,在该口输入0—10V的电压,变频器就可以输出不同频率的交流电,达到控制交流电机转速的目的,为此对于交流电机的转速控制只要将单片机产生的数字信号转化为模拟电压信号与实验室现有的西门子变频器的模拟量输入口接驳即可;交流电机的转速显示则需将变频器输出的电流模拟信号转换为数字信号送单片机。
步进电机通过环行分配器控制各绕组的通电顺序运转,分配器有软件和硬件之分.实验室的步进电机是通过硬件环行分配器驱动的,因而只要使单片机输出不同频率的脉冲至硬件环行分配器就可以控制步进电机的转速。还可以从单片机上引出一个口,通过控制这个口的高低电平让步进电机正转或反转。
直流电机的转速控制只要改变直流电机的输入电压就能实现,为此利用单片机产生PWM脉冲送直流电机的驱动电路,由驱动电路产生不同的电压至直流电机,从而达到直流电机的转速控制。
本实验平台要求三种电机的调速电路以及模/数转换电路相互独立,以便在以后做不同的实验时只需将相应的电路与单片机控制电路接驳。为此需要将各电路的硬件和系统的软件模块化,其中硬件部分首先将各电路设计成一个个独立的单元,然后用插口将各单元电路与单片机控制单元相连;软件的模块化则通过在主程序中调用各子程序实现.
1.2方案论证
尽管所要控制的交流电机的额定转速为1400r/min,所要的A/D、D/A芯片的分辨率最小为1/1400,但考虑到本次设计任务只是锻炼我们的实践能力和方便以后教学,没有必要去片面的追求高精度而增加硬件成本,为此直接选用了市面上较为常见的八位D/A(DAC0809)、A/D(ADC0832)转换芯片,而没有将D/A、A/D芯片的选择在方案中作为考虑对象.本次方案论证主要对键盘/显示接口电路进行选择.
方案一:
1。键盘/显示器单元电路方案
选用通用并行接口芯片8155作LED显示和键盘的输入。其中,8155的PA口为输出口,控制键盘列线的扫描,PA口同时又是4位LED显示器的位扫描口,PB作为显示器的段码口,PC口作为键盘行线状态的输入口。
2。交流电机单元的转速控制方案
由AT89C51单片机将键盘输入信号进行判断处理后经P0输出8位数字量信号经D/A转换芯片DAC0832进行转换,产生相应的模拟电压信号,再将模拟电压信号通过二级运算器放大后,输入西门子变频器MM420的模拟量输入口,去控制交流电动机的转动。
3.步进电机单元的转速控制方案
由AT89C51单片机将键盘输入信号进行判断处理后经P1.0、P1。1口输出步进电机的控制信号,经74LS07正向放大后送步进电机驱动电路。
4。直流电机单元的转速控制方案
由AT89C51单片机将键盘输入信号进行判断处理后经P1。0口输出PWM信号,将此脉冲信号送直流电机驱动电路控制直流电机的转动。
方案二:
1。键盘/显示器单元的电路方案
选用五片“串入并出”移位寄存器74LS164扩展五个8位并行输出口:一个8位并行输出口用于键盘的列线使用,其余的四个8位并行输出口用于控制4个LED段选口作静态显示。
2。交流电机单元的转速控制方案
由AT89C51单片机将键盘输入信号进行判断处理后经P0输出8位数字量信号经D/A转换芯片DAC0832进行转换,产生相应的模拟电压信号,再将模拟电压信号通过二级运算器放大后,输入西门子变频器MM420的模拟量输入口,去控制交流电动机的转动。
3.步进电机单元的转速控制方案
由AT89C51单片机将键盘输入信号进行判断处理后经P1。0、P1.1口输出步进电机的控制信号,经74LS07正向放大后送步进电机驱动电路.
4。直流电机单元的转速控制方案
由AT89C51单片机将键盘输入信号进行判断处理后经P1.0口输出PWM信号,将此脉冲信号送直流电机驱动电路控制直流电机的转动。
综合上述两种方案,区别在于所采用的键盘、显示接口电路不同。
方案一:选用通用并行接口芯片8155作LED显示和键盘的输入,这样就会和 D/A转换芯片DAC0832 共用P0口资源,需要进行片选,软件工作量大,硬件接线复杂。
方案二:直接使用89C51的串换行口外扩键盘/显示器.应用串行口方式0的输入方式,在串行口外接移位寄存器74LS164,构成键盘/显示器接口。这种静态显示方式的优点是亮度大,显示闪烁感小,且CPU不必频繁地为显示服务,因而主程序可不必扫描显示器,软件设计比较简单,整个接口电路硬件也不复杂。
通过比较我发现:第二种方案软、硬较第一种方案简单,且充分利用了89C51单片机的串行口资源,节约了成本.为此,我采用第二种方案.
最终确定的整体方案框图如下:
显示单元
单 片 机
键盘单元
A/D转换单元
交流电机单元
步进电机单元
直流电机单元
图1-1 整体方案框图
1.3设计步骤
图1-2 设计步骤
第2章 硬件电路
根据第一章中的各单元电路方案,细化总体框图如下:
显示接口单元电路
键盘接口单元电路
单 片 机
D/A转换接口单元电路
直流驱动接口单元电路电路
A/D转换接口单元电路
硬件环行分配器
变频器
步进电机
直流电机
交流电机
图2-1 系统结构图
下面先介绍涉及的硬件知识点,再说明各单元电路的设计方法,最后给出总体设计图。
2。1主要芯片简介
2.1。1 AT89C51
AT89C51是ATMEL公司生产的MCS—51系列芯片,是一种低功耗、高性能的片内含有4KB快闪可编程/擦除只读存(FPEROM-FLASH PROGRAMMABLE AND ERASABLE READ ONLY MEMORY)的8位CMOS微控制器.芯片上的FPEROM允许在线编程或采用通用的非易失存储编程器对程序存储器重复编程。AT89C51的引脚图如图2—1所示:
图2—2 AT89C51引脚图
AT89C51各个引脚功能说明如下:
(1)输入/输出引脚:
P0口:在不接外部存储器与不扩展I/O时,可做为准双向的输入/输出口。在接有外部存储器或有扩展I/O口时,该口分时复用为低8位的数据总线和地址总线。
P1口的字节地址位90H,位地址为90H-97H。P1口只能作为通用I/O口使用,是准双向口.当P1口作为输出口使用时,已能对外提供推拉电流负载,外电路无需再接上拉电阻。当P1口作为输入口使用时,应先向锁存器写入“1”,使输出驱动电路的FET截止。
P2口:P2口的字节地址位0A0H,位地址为0A0H—0A7H。在实际应用中P2口用于为系统提供高位地址,。此外,P2口也可以作为通用I/O口使用,这时多路转接开关倒向锁存器Q端。
P3口:除了作为准双向口使用外,还可以将每一位用于地二功能,而且P3口的每一条引脚都可以独立的定义为第一功能的输入输出或第二功能。
(2)控制线:
ALE/PROG:地址锁存有效信号输出端。ALE在每个机器周期内输出两个脉冲。
PSEN:片外程序存储器读选通信号输出端,低电平有效.
RST/Vpd:该引脚为单片机的上电复位和掉电保护端。
RST引脚是复位信号的输入端,复位信号是高电平有效。复位操作有上电自动复位和按键手动复位两种方式。
(3)、主电源引脚:
Vcc:接+5V电源正极
(4)、外接晶体引脚:
XTAL1:接外部石英晶体的一端。它是一个反相放大器的输入端,这个放大器构成了片内震荡器.当采用外部时钟时,对于HMOS单片机,该引脚接地;对于CHMOS单片机,该引脚作为外部震荡信号是输入端。
XTAL2:接外部石英晶体的另一端。在单片机内部,它是片内震荡器的反相放大器的输出端。当采用外部时钟时。
2.1.2 D/A转换芯DAC0832
D/A转换接口设计,主要是选择D/A转换集成芯片,配置外围电路及器件,实现数字量至模拟量的线性转换,并不涉及D/A转换器的结构设计,也不必对其内部电路作详细分析。
1.DAC0832的内部结构及其引脚
DAC0832的内部结构主要由两面三个8位寄存器与一个D/A转换器组成.这种结构使输入的数据能有两次缓冲,因此在操作上十分方便与灵活.DAC0832是电流型输出,应用时需要外接运算放大器使之成为电压型输出。DAC0832为20脚双列直插芯片,芯片的引脚与逻辑结构如图所示。
图2—3 DAC0832芯片的引脚与逻辑结构
DAC0832的各管脚的功能如下:
——8位数据输入端,常和CPU的数据总线相连,用于输入CPU送
来的待换的数字量,DI7为最高位。
ILE—-数据允许锁存信号引脚,高电平有效.
—-输入寄存器选择信号脚,低电平有效。
—-输入寄存器写选信号,输入寄存器的锁存信号/LE1由ILE、、
的逻辑组合产生,为高电平时,输入寄存器状态随输入数据线变化,的负跳变将输入数据锁存.
—-传送控制输入线,低电平有效。
——DAC寄存器的写选通信号。DAC寄存器的锁存器锁存信号由
和/XFER的逻辑组合而成,为高电平时,DAC寄存器的输出随寄存器的输入变化,负跳变时,输入寄存器的内容打入DAC寄存并开始D/A转换。
-—参考电压输入端,一般在,由稳压电源提供。
—-运算放大器反馈信号输入端,通常接到运算放大器输出端.
Iout1、Iout2——电流输出端,其值随DAC内容线性变化、Iout1+Iout2=常
数。为保证额定负载下输出电流的线形度,Iout1、Iout2引脚上的电位尽量接近地电平。因此,Iout1、Iout2通常接运算放大器输入端。当输入数字为全”1"时, Iout1输出电流最大,约为:, 全”0”时, 输出电流为0.
—-电源输入端,可在范围内.
AGND——模拟地。
DGND——数字地。通常上两种地线接在一起。
2.1.3 A/D转换芯片ADC0809
1. 主要参数
(1)8路8位A/D转换器.
(2)具有转换起停控制端。
(3)转换时间为100μs
(4)单个+5V电源供电
(5)模拟输入电压范围0~+5V,不需零点和满刻度校准。
2. 内部结构
ADC0809是CMOS单片型逐次逼近式A/D转换器,内部结构如图13.22所示,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型D/A转换器、逐次逼近寄存器、三态输出锁存器等其它一些电路组成。因此,ADC0809可处理8路模拟量输入,且有三态输出能力,既可与各种微处理器相连,也可单独工作。
ADC0809引脚 ADC0809逻辑结构
图2-4 ADC0809引脚与逻辑结构图
3.外部特性(引脚功能)
ADC0809芯片有28条引脚,采用双列直插式封装。下面说明各引脚功能。
IN0~IN7:8路模拟量输入端。
2-1~2—8:8位数字量输出端。
ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路。如表2-1所示。本次课程设计中,我们将A、B、C接地,选择IN0输入通道。
表2-1 ADDA、ADDB、ADDC真值表
ALE:地址锁存允许信号,输入,高电平有效.
START: A/D转换启动信号,输入,高电平有效。
EOC: A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平).
OE:数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
CLK:时钟脉冲输入端.要求时钟频率不高于640KHZ。
REF(+)、REF(—):基准电压.
Vcc:+5V电源。
GND:接地.
4.工作过程
ADC0809的工作过程是:首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行.直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可 用作中断申请。当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。
2。1。4 移位寄存器74LS164
74LS164是8位串入并出移位寄存器。
图2—5 74LS164移位寄存器
(1)A、B为串行输入端
(2)QA~QH为串行输出端
(3)CLK为串行时钟输入端
(4)为串行输出清零端
(5)VCC为+5V电源输入端
(6)GND为接地端
2。2硬件接线分析与设计
2。2.1 键盘接口单元电路设计
键盘接口单元电路主要为电机的转速输入提供解决方案,并能对所要控制的电机进行选择,以及启动A/D转换。
本设计中键盘接口电路采用一片74LS164串入并出八位输出,接收端使用P3。4、P3。5的第一功能,通过判断这两个口的高低电平,再结合74LS164就可以判断是哪个键按下,图2-6为键盘接口电路。
图2—6 键盘接口单元电路
1.CLK引脚接线说明
图2-7 CLK引脚接线
上图中164的CLK为串行时钟输入端,与单片机的移位时钟脉冲输出口TXD相连。
2.串行数据接线说明
图2-8 A、B引脚接线
上图中164的A、B为串行数据输入口,A、B并联后与单片机的串行数据输出口相连。
3.MR接线说明
图2—9 A、B引脚接线
由于164做键盘扩展用不需要对输出清零,故上图中MR接 +5V 高电平.
2.2.2 显示接口单元电路设计
显示接口单元电路主要为键盘输入的数值提供显示方案。
本设计采用静态显示的方式,考虑到直流、交流电机的最高转速达到千转,为此用四片74LS164(串入并出移位寄存器)驱动四只LED发光二极管。
图2—10 显示接口单元电路
1.CLK引脚接线说明
图2-11 P3。3控制的TXD
显示接口单元电路与键盘接口单元电路的最大不同在于单片机的移位时钟脉冲输出口TXD与P3.3口经或门(74LS08)后与74LS164的CLK相连(图2—9),这样 TXD 就受到P3。3的控制,只有当P3.3输出为高电平时74LS164的CLK端才能接受到 TXD 发出的移位脉冲,从而更新显示。这样接线的目的在于避免显示与键盘扫描的干扰,只有当要更新显示时才置P3。3为高电平。
2.CLK引脚接线说明
同键盘扫描电路一样用164实现八位段码显示时也不要对输出清零,故接 +5V 高电平。
3.多位数值显示的接线说明
图2—12 多位数值显示的接线
由于164遵循“先入先出”的原则,故用164实现4位数值显示时只要将上级164的Q7引脚与下级的A、B引脚相连就能实现。
3. LED限流电阻的选择
一般LED段码的驱动电流在5-10mA左右,为此选用了750的电阻,则本设计中LED段码的驱动电流为6.7mA(5/750=6。7 mA)。
2.2.3 交流电机接口单元电路设计
交流电机接口单元电路为将单片机的数字信号转换为变频器的模拟量输入口能识别的模拟电压信号(0-5V)提供解决方案.
本设计采用8位D/A转换芯片DAC0832先将单片机产生的数字信号转换为电流信号,再通过第一级运放(OP07)将DAC0832输出的电流信号转换为电压信号;接着用第二级运放(OP07)把电压信号进行放大,在设计时将放大电路的放大倍数设为可调,实际调试时可以通过调节10K的可变电阻将交流电机的输入转速与实际转速相近.
图2-13 D/A接口电路
DAC0832是八位D/A转换芯片,它的分辨率为1/255,本设计的交流电机的最高转速为1275r/min,这样本设计的分辨率为5 r/min (1275/255=5).
1.CS接线说明
图2—14 CS接线
要DAC0832工作,首先应对0832进行片选,我将单片机的P2。7口与0832的CS相连,启动D/A转换时将P2。7口置低电平.
2.ILE(输入数据锁存允许信号)接线说明
图2-15 ILE接线
ILE是高电平有效,我将ILE接在了+5V,使0832始终允许输入数据锁存.
3.单缓冲方式的接线说明
图2-16 单缓冲方式的接线
由于0832只有一路模拟量输出,为此选择将0832的DAC寄存器处于直通方式,而让0832的输入寄存器处于受控的锁存方式。于是把WR2、XREF接地。
2。2.4 A/D接口单元电路设计
A/D接口单元电路为采集到的变频器的模拟量能被单片机识别提供解决方案。
本设计采用8位A/D转换芯片ADC0809,ADC0809的分辨率为1/255,而设计的交流电机的最高转速为1275r/min,这样本设计中的A/D采集的最小分辨率为5r/min。
为了在以后的实验中能用A/D转换芯片单独采集电压信号,在设计中将ADC0809的INT0口和地线预留了接口。
图2-17 A/D接口电路
1.输入模拟量的接线说明
图2-18 输入模拟量的接线
由于变频器输出的是0—20mA,而ADC0809只能采集电压信号,故用两个510的电阻并联后接地,使电流信号转换为0—5V电压信号。上图中的运放是射随器的接法,为了增强变频器输出的带载能力。
2.路模拟通道的选择
图2—19 模拟通道的选择
由于只用一路通道作为变频器模拟量的输入,为简化电路将模拟通道选择信号A、B、C接地,选择IN0口作为模拟量的输入口。
3.ALE、START接线说明
图2—20 ALE、START接线图
图2—19中由89C51的P2.6和RD经74LS02(或非门)后与START(转换启动信号)、ALE(地址锁存允许信号)连接.在置ADC0809地址时将P2.6置为低电平,这样在ADC0809起动后就由89C51的WR作为ADC0809的写选通信号。
本次设计中将START、ALE连接在一起,这样使得在WR信号的前沿写入通道地址,紧接着在其后沿就起动转换。
4. OE(输出允许信号)接线说明
图2—21 OE接线图
图2-20中由89C51的P2。7和RD经74LS02(或非门)后与START(转换启动信号)、ALE(地址锁存允许信号)连接。在置ADC0809地址时将P2。7置为低电平,这样在ADC0809起动后就由89C51的RD作为ADC0809的读选通信号。
5.EOC(转换结束信号)接线说明
图2—22 EOC接线图
本设计中A/D转换完成后以中断方式进行传送,当EOC=1时(高电平)时,A/D转换结束;而89C51的外中断INT0是低电平有效,因而将EOC经非门后与INT0连接,实现了数据的中断方式传送,由于电路中有一片74LS02(或非门),且只用了其中的两路非门,为此我将74LS02的一路非们的两个输入引脚并联接输入,当非门用。
6.CLK(时钟信号)接线说明
图2-23 ALE接线图
ADC0809一般使用频率为500kHz的时钟信号,而单片机使用的是600MHz的晶振,经六分频后由89C51的ALE引脚输出的是1000kHz的时钟信号,此因将ALE引脚上的信号经74LS74二分频后得到500kHz的时钟信号连接到ADC0809的ALE(时钟信号)引脚。在这里把74LS74当作一个二分频的分频器使用.
2。2。5 直流电机驱动接口单元电路设计
本设计采用功率MOSFET单电源方式驱动电路。
图2-24 直流电机驱动接口单元电路
各元件在驱动电路中的功能如下:
光耦的驱动采用PNP形式的三极管9012,这样当控制上为高电平时,就不会导通,防止89C51在未初始化时电机运转。
4N25起到耦合脉冲和隔离单片机系统输出部分的作用,使两部分的电流信号独立.本设计中在三极管的输出回路中串了510的电阻,因此在三极管完全导通时光耦的驱动电流约为10mA(5/51010 mA).
74LS07同相驱动器是作为IRF540场效应管输入端的驱动,在74LS07的输出口接了5.1K的上拉电阻。
三极管(IRF540)是起到功率放大的作用。它是功率MOSFET,可以用逻辑电平直接驱动。
2.2。6 电源接口单元电路设计
电源接口单元电路为各接口单元电路提供电源解决方案。
本设计中单片机、A/D转换芯片ADC0809以及各门电路芯片的工作电压为5V,这样就让D/A转换芯片DAC0832也接5V电压(DAC0832正常工作电压5-15V)。这就需要5V电源,本设计通过5V的稳压管实现5V电压输出。
控制交流电机的变频器要求输入的电压为0—10V,由于在市面上没有10V的稳压管,为防止输入变频器的电压过高,为此选用9V的稳压管输出9V电压。
图2—25 电源接口单元电路
本次设计的电源接口单元电路首先用三抽头的变压器将220V的交流电降为两路12V的交流电输出,接着用全桥整流电路将两路12V交流电变为两路16.8V(12=16.8)的直流电输出,最后经7809(+9V稳压管)、7909(—9V稳压管)变为9V电压输出。
+5V的电压直接通过稳压管7805经7809获得.
2。2。7 总体电路图
图2-26 总体电路图
第3章 软件设计
开始时先初始化显示程序,接着分别调用键盘扫描子程序、显示子程序,最后返回.其中D\A、A\D的转换程序,直流电机驱动程序,步进电机驱动程序的执行,分别通过扫描键盘得到的键码进行跳转。由于驱动步进电机和直流电机的脉冲信号发生程序需要单片机不停将P1口置高、低电平,为避免死循环,让这种电机停止,并使程序顺利返回到主程序,还设有返回按钮,通过在上述两种电机的驱动程序中判断该键的值来决定是否返回。为节约键盘资源,我将返回键编码在显示总清键上,通过复用显示总清键实现;DAC0832具有输入锁存的功能,这样在启动了DAC0832之后CPU就可以不再为D/A转换服务,而是直接转到主程序,这样一来就没有必要单独再设让D/A转换输出为零的按键,要使D/A转换输出为零,只须用键盘输入四个“0"再启动D/A即可。
3.1 MAIN程序
开始时先初始化显示程序,接着分别调用键盘扫描子程序以及显示子程序或某单元驱动子程序,最后返回。
MAIN程序对显示子程序或某单元驱动子程序的调用是通过判断键码是否大于9来实现的.当键码小于等于9时, 在主程序中调用显示,将取得的键码显示出来;当键码大于9时,则查转移指令表执行相应的子程序。
1.MAIN程序流程图:
开始
初始化显示
调用键盘扫描子程序(取得键码送A)
A>9?
N
调用显示子程序
Y
调用分支程序转移子程序
返回
图3-1 MAIN程序流程图
2.汇编程序及说明
主程序开始时先置堆栈指针,接着设置串行口工作方式,初始化显缓区内容地址。其程序如下:
MAIN: MOV SP,#60H; 置堆栈指针
MOV SCON,#00H; 设置串行口工作方式0
MOV R0,#7FH; 初始化显缓区单元地址
MOV R1,#7FH
START: MOV BUF0,#0bh; 初始化显示缓冲区
MOV BUF1,#0bh
MOV BUF2,#0bh
MOV BUF3,#0bh
LCALL DISP; 调用显示
在主程序中对键盘扫描子程序、显示子程序或某单元驱动子程序进行调用.其程序如下:
LOOP: ACALL KEYI; 调用显示
MOV @R1,A; 键码暂存显缓区
CLR C; 清进位标志位
CJNE A,#9,NORMAL; A9转NORMAL
AJMP NORMAL1; A=9转NORMAL1
NORMAL: JNC ABOVE9; A〉9转ABOVE9
NORMAL1: DEC R1; 指向下一显缓单元
CJNE R1,#7AH, DISP1;输入数值未满4位,调用显示
以下程序为输入数值满4位,初始化显示。
MOV R1,#7FH;
MOV BUF3,#0AH
MOV BUF2,#0BH
MOV BUF1,#0BH
MOV BUF0,#0BH
DISP1: LCALL DISP; 调用显示
SJMP LOOP; 返回
3。2 子程序
3.2。1 多分支程序转移子程序
分支程序转移子程序为键码大于9时,调用单元驱动子程序提供解决方案.它的工作方式是:当键码大于9时,对键码进行除以10的运算并取余数送A,将余数作为跳转的分支程序号.
1.多分支程序转移子程序流程图:
开始
A除以10并取余送A
A=0 A=1 A=2 A=3 A=4 A=5
清键盘输入
A/D转换单元驱动子程序
直流电机单元驱动子程序
步进电机单元驱动子程序
步进电机单元驱动子程序
交流电机单元驱动子程序
返回
图3-2 多分支程序转移子程序流程图
2.汇编程序及说明
ABOVE9: MOV A,@R1; 键码送A
MOV B,#0AH; 除数送B
DIV AB; 键码除以10
MOV A,B; 余数存A
RL A; 分支程序号乘2
MOV DPTR,#TAB; 转移指令表首址
JMP @A+DPTR
各分支程序的转移指令表:
TAB: AJMP ACM
AJMP SETM
JMP ERTM1
AJMP DCM
AJMP ADC
AJMP MAIN
TAB: AJMP ACM
AJMP SETM
AJMP SETM1
AJMP DCM
AJMP ADC
AJMP START
3.2.2 键盘单元扫描子程序
在键盘扫描子程序的作用是取得键码送累加器A。
1.键盘扫描子程序流程图
开始
扫描键盘
有键按下?
延时
是抖动引起的?
Y
N
取得键码送A
返回
图3-3 键盘扫描子程序流程图
2。汇编程序及说明
扫描程序子程序执行时先使7474LS164输出全为低电平(列线),这样就通过查询P3.4(第1行)、P3.5(第2行)的电平来判断是否有键按下。其程序如下:
KEYI: MOV A,#00H; 使所有列线为0的编码送A
MOV SBUF,A; 扫描键盘,使所有列线为0
KL0: JNB TI,KL0; 串行输出完否?
CLR TI; 串行输出完,清TI
KL1: JNB P3。4,PK1; 第1行有键闭合吗?如有,跳PK1进行处理
JB P3。5,KL1; 第2行有键闭合吗?没有,跳KL1
PK1: ACALL DL10; 调用10ms延时子程序DL0,进行软件消抖
ACALL DL10
JNB P3。4,PK2; 判断是否是抖动引起的?
JB P3.5,KL1; 是抖动引起的,转KL1
PK2: MOV R7,#08H; 不是抖动引起的
在进行软件消抖确定有键按下后,就逐列输出低电平,并记列号于R3,再查询行线状态,当1行有键按下时记行首键号0于R4,当1行有键按下时记行首键号8于R4,最后将按下的键所在位置的列号和行首键号相加获得键码。其程序如下:
MOV R6,#7FH; 判断是哪一个键按下,7FH为使第一列为低
MOV R3,#00H; R3为列号寄存器
MOV A,R6;
KL5: MOV SBUF,A; 列扫描码从串行口输出
KL2: JNB TI,KL2; 等待串行口发送完
CLR TI; 清TI
JNB P3.4,PKONE; 读第1行线状态,第1行有键闭合,跳PKONE处理
JB P3.5,NEXT; 读第2行线状态,第2行有键被按否?
MOV R4,#08H ;第2行有键被按下,行首键号08H送R4
AJMP PK3;
PKONE: MOV R4,#00H; 第1行有键被按下,行首键号00H送R4
PK3: MOV SBUF,#00H; 等待键释放,发送00H使所有列线为低电平
KL3: JNB TI,KL3;
CLR TI; 发送完毕,清TI
KL4: JNB P3。4,KL4; 判断行状态
JNB P3.5,KL4;
MOV A,R4; 两行线均为高,说明键已释放
ADD A,R3; 计算得键码,送A
RET
NEXT: MOV A,R6; 列扫描码左移一位,判下一列键是否按下
RR A;
MOV R6,A; 记住列扫描码于R6中
INC R3; 列号增1
DJNZ R7,KL5; 列计数器R7减1,8列键都检察完否?
BACK: RET
DL10: MOV R7,#0AH; 延时10ms子程序
DL: MOV R6,#0FFH;
DL1: DJNZ R6,DL1;
DJNZ R7,DL;
RET;
3。2。3 显示单元子程序
显示单元子程序的功能是将输入的0-9的键码用阿拉伯数字显示出来,由于显示的数字与键码一致,就可以直接用键码作为查段码表的依据.
显示子程序执行时先把P3.3置为高电平,使RXT输出的串行口移位脉冲有效,在输出四位显示之后置P3。3为低电平,使RXT输出的串行口移位脉冲对显示不起作用,避免显示受键盘扫描的影响。
初始化显示位数、显缓区单元地址
开移位脉冲输出
查表并显示
关移位脉冲输出
返回
R7=0?
开始
1.显示子程序流程图
N
Y
图3—4 显示单元子程序流程图
2.汇编程序及说明
DISP: SETB P3.3; 允许TXD引脚同步移位脉冲输出
MOV R7,#04H; 送出段码个数,R7为段码个数计数器
MOV R0,#7FH; 7FH~78H为显示数据缓冲区
四位数显示程序如下:
DL0: MOV A,@R0;
展开阅读全文