一、系统设计概述........................................................................................................ 2
1.1 电子秤功能概述.............................................................................................. 2 1.2 主要模块.......................................................................................................... 2 1.3 主要原理.......................................................................................................... 2 二、硬件系统设计........................................................................................................ 2
2.1 硬件系统设计概述.......................................................................................... 2
2.1.1 工作原理................................................................................................ 2 2.1.2 实验接线图............................................................................................ 3 2.2 硬件系统所用芯片资料介绍.......................................................................... 5
2.2.1 8253芯片................................................................................................ 5 2.2.2 8255芯片................................................................................................ 7 2.2.3 8259芯片................................................................................................ 8 2.2.4 ADC0809芯片 ....................................................................................... 9 2.2.5 键盘的设置.......................................................................................... 10 2.2.6 LED数码管的设置 .............................................................................. 12
三、软件系统设计...................................................................................................... 14
3.1程序流程图..................................................................................................... 14
3.1.1 主程序流程图.................................................................................... 14 3.1.2 中断处理程序流程图.......................................................................... 15 3.2参数信息......................................................................................................... 16 3.3 源程序清单.................................................................................................... 17 四、心得体会.............................................................................................................. 23 五、参考文献.............................................................................................................. 24
1
一、系统设计概述
1.1 电子秤功能概述
本次课程设计的课题是电子秤设计,主要是以80x86CPU为核心设计一个电子秤检测系统(AD采样用ADC0809),系统可实现对压力信号的采集,转换成电信号,再通过AD转换模块转换成CPU可以处理的数字信号,实现在显示器上显示当前物品的重量,当然这里的重量是通过变位器进行的压力信号的模拟。此外该电子秤设计还添加了一些辅助单元,通过按键来实现的一些功能。如按下4*4矩阵键盘上的A键后,可以设置物品的单价;按下B键,LED数码管上将显示当前物品的单价及总价;当按下R键后,将熄灭数码管,退出电子秤称重系统。上面即为电子秤设计的主要的功能。
1.2 主要模块
电子秤系统主要由80x86 CPU模块(即一台PC机)、8255并行口模块、8259中断控制器模块、8253定时计数器模块、键盘、LED数码管显示模块,还有比较重要的一个模块就是ADC0809,即AD采样模块,用于将电模拟信号转换成数字信号。
1.3 主要原理
电子秤设计的主要原理是利用ADC0809对采集到的模拟压力信号,将其转换成易于处理的数字电信号,将采集得到的重量在数码管上显示出来(0-255),用于告诉用户当前物品的重量。由用户决定接下来继续进行什么样的操作,设置单价,显示总价,或是按键退出电子秤称重系统。重要的原理就在于对模拟压力信号的采集,处理转换成电信号,最后经过AD转换模块转换成数字式实验箱易于处理的数字信号,作为其他模块的处理基础,这就是大概的系统设计原理。
二、硬件系统设计
2.1 硬件系统设计概述 2.1.1 工作原理
实验箱硬件部分,主要用到8255、8259中断控制器、8253定时计数器、键盘、LED数码管,还用到的就是ADC0809,用于模拟和数字信号之间的转换。电子秤硬件系统设计的主要原理是利用压力传感器采集模拟压力信号,经过一系列处理,转换成模拟电信号,再送给
2
AD转换模块(ADC0809)进行处理,最后就可以得到易于CPU处理的数字电信号。将处理后的信号送给处理器,由处理器控制实验箱上显示器来进行显示,同时还可以通过实验箱上的键盘模块对显示的内容进行控制,以用来控制当前显示在数码管上的内容,包括设置单价,显示总价,还有就是按键退出电子秤称重系统。系统的工作原理图如图1所示。
秤盘前置处理A/D压力传感器底座
图1 工作原理图
2.1.2 实验接线图
系统的硬件接线图如下面的图2所示。
3
处理器显示器键盘 VREF(-)VREF(+)OEUSER1USER0INTi2INTi1MEWRMERDADCSADWRADRDADDCCLKADDBADCEOCADDA0809IN7DB7IN6DB6IN5DB5IN4DB4IN3DB3IN2DB2IN1DB1IN0DB0 80x86BLASTHOLDABALEHOLDLWRADSLRDLW_RIOWRIORDIOY6IOY4IOY2IOY0CS3CS2CS1CS0INTRLAD0LAD1LAD2LAD3LAD4LAD5LAD6LAD7 +5V1.1933MHzIR0IR1IR2IR3IR4IR5IR6IR7SP/ENCAS0CAS1CAS28259INTINTACSRDWRA0D0D1D2D3D4D5D6D7CSRDWR8253OUT1GATE1CLK1OUT0GATE0CLK0AD0AD1AD2AD3AD4AD5AD6AD7SRDSWRA0A1RESETCSPA0PA1PA2PA3PA4PA5PA6PA7反向驱动电路8255PC0PC1PC2PC3PC4PC5PC6PC7PB0PB1PB2PB3PB4PB5PB6PB7D0D1D2D3D4D5D6D7A0A1OUT2GATE2CLK2反向驱动电路S0S1S2S3S4S5S6S7S8S9S10S11S12S13S14S15+5V图2 硬件系统接线图
说明为了便于查看,一些线未画出来。其中ADC0809的CLK引脚在实验中接的是1.5MHz,其他未连的/CS都接到80X86的IOY0引脚上,/RD和/WR接到分别接到80X86的IORD和IOWR引脚上。
4
2.2 硬件系统所用芯片资料介绍
该系统设计主要用到的芯片有8253、8255、8259、ADC0809,还有就是LED显示模块,
4*4矩阵键盘。现将用到的芯片和模块分别介绍如下。
2.2.1 8253芯片
8253是一块定时器/计数器接口芯片,其具有三个独立的16位计数器,它可用程序设置成多种工作方式,按十进制BCD码或二进制进行减法计数,最高计数速率可达2.6MHz。8253能工作于定时方式,OUT脚产生周期性的输出波形,作为可编程方波频率发生器、分频器等,也可以工作于计数器方式,OUT脚产生非周期性的输出波形,作为程控单脉冲发生器、事件计数器等。
1、8253的引脚介绍
8253的引脚排列如图3所示。
D0D1D2D3D4D5D6D7OUT0GATE0CLK0OUT1GATE1CLK1OUT2GATE2CLK2CSRDWRA0A18253
图3 8253的引脚图
引脚说明:D0~D7为8条双向数据线,/WR为写输入信号,/RD为读输入信号,/CS为片选输入信号,A1、A0为片内寄存器地址输入信号。除/CS外,上述引脚都同系统总线直接相接。此外,每个计数器都有3条信号线:CLK0~CLK2用于输入基准脉冲信号;OUT0~OUT2输出不同的信号波形来满足定时/计数器的要求;GATE0~GATE2用于控制计数器的计数操作或者触发计数器的重启。 2、8253的内部结构
8253的结构框图如图4所示
每个计数器内部都有三个寄存器。
(1)6位的控制寄存器:初始化时,将工作方式寄存器中低6位写入该寄存器,从而控制计数器的工作方式。
(2)16位的计数初值寄存器:初始化时写入该计数器的初始值。 (3)16位的减1计数寄存器:计数开始时,将计数初值从初值寄存器送入减1计数寄存器,当计数输入端CLK每输入一个计数脉冲下降沿,减1计数寄存器内容减1;当减1计数寄存器内容发生变化时,OUT脚输出相应信号反映的当前的计数状态。
(4)16位输出锁存寄存器:在计数过程中,输出锁存寄存器跟随减1计数器的变化。当CPU向某一计数器写入锁存命令时,其锁存当前的计数值,直至CPU读取计数值之后,再继续跟随减1计数器。
当/CS端收到低电平时,8253根据/WR和/RD端的电平,控制本器件接受CPU的读写访
5
问:写8253工作方式字、装入各计数器的初始值、读出各计数器的当前值。双向三态的8位数据总线缓冲器根据地址信号A0A1来选择内部的源寄存器并将数据发送到总线上或接受来自总线的数据并送到A0A1指定的目的寄存器。
D7~D0CLK0数据总线缓冲器计数器0GATE0OUT0/WR/RD/CSA0A1CLK1读写逻辑计数器1GATE1OUT1控制字寄存器CLK2计数器2GATE2OUT2
图4 8253的结构框图
3、8253的工作方式
▪ 方式0 —— 计数结束中断 ▪ 方式1 —— 可编程单稳
▪ 方式2 —— 连续负脉冲发生器 ▪ 方式3 —— 连续方波发生器 ▪ 方式4 —— 软件触发选通 ▪ 方式5 —— 硬件触发选通
本次课程设计中8253工作在方式3,此方式为可软、硬件触发的方波发生器,N=Fclk/Tclk,在本次设计中,FclK信号为1.193MHZ,输出信号为100HZ,N为11930。其端口地址为40~43H,40H口用于计数器0,41H口用于计数器1,42H口用于计数器2,43H口用于状态和控制口,本次课程设计只用到40H和43H两个端口地址。 4、8253的初始化编程
8253加电后的工作方式不确定,必须经初始化编程后,才能正常工作 初始化编程:
(1)先写入控制字 (2)再写入计数初值
工作后,可随时读取计数值,一般先将计数值锁存在通道内的锁存器中,然后可分两次读取16位的计数值 初始化程序片段:
mov al,计数器控制字 mov dx,控制方式端口 out dx,al
mov ax,计数器初值 mov dx,计数器0端口
out dx,al ;写计数器的初值低字节部分
6
mov al,ah
out dx,al ;写计数器计数初值高字节部分
2.2.2 8255芯片
8255是通用可编程并行接口芯片,具有40个引脚、双列直插式封装的大规模集成电路,采用单一+5V供电,输入/输出电平与TTl完全兼容,芯片引脚图见图5
AD0AD1AD2AD3AD4AD5AD6AD7SRDSWRA0A1RESETCSPA0PA1PA2PA3PA4PA5PA6PA78255PC0PC1PC2PC3PC4PC5PC6PC7PB0PB1PB2PB3PB4PB5PB6PB7
图5 8255芯片引脚图
引脚简要介绍:SRD和SWR分别是读写信号,A0和A1是端口地址信号,RESET用于复位,/CS为片选信号,AD0~AD7为与总线数据线相接的部分,其他的为PA口,PB口和PC口。
1、连接外设的数据端口
(1)端口A:PA0-PA7 (A组控制)
常作数据端口使用,功能最强大
(2)端口B:PB0-PB7 (B组控制)
常作数据端口使用
(3)端口C:PC4-PC7 (A组控制), PC0-PC3 (B组控制)
可作数据、状态或控制端口使用可拆分成两个4位端口分别输入或输出每
位可独立进行输出控制(位控制) 2、 8255工作方式
(1)方式0:基本输入输出方式(不带联络)
适用于无条件传送和查询方式的接口电路
(2)方式1:选通输入输出方式(带输入/输出联络)
适用于查询和中断方式的接口电路
()方式2:双向选通方式(同时带输入联络和输出联络)
适用于可双向传送数据的外设,适用于查询和中断方式的接口电路
3、8255的编程
▪ 编程:只写 1 个方式控制字到控制口。
7
▪ D7:方式字/复位字选择位,‘1’时为8255A方式控制字,‘0’时为PC口的
置/复位控制字,当D7为‘1’时,其余各位的含义为: (1)D6~D5:A组选择方式选择位。‘00’为方式0,‘01’为方式1,‘10’为方式2。
(2)D2:B组方式选择位。‘0’为方式0,‘1’为方式1.
(3)D4、D3、D1、D0:分别为PA口、PC7~PC4口、PB口、PC3~PC0口输入/输出方式选择位。‘0’为输出,‘1’为输入。
说明: 工作过程中:通过数据端口对外设数据进行读写
本次课设8255均工作在方式0,其把PA口、PB口和PC口的高4位、低4位都作为基本输入/输出口。 初始化程序片段:
mov al,方式控制字
mov dx,端口号 ;如果端口号>255,应用dx间接寻址 out dx,al ;写入控制寄存器
2.2.3 8259芯片
8259是专门用来控制中断的芯片。它内部集成了与中断控制有关的所有基本存储电路,包括中断请求锁存、中断源优先级排队、中断源识别、中断源屏蔽、中断向量号产生等电路,既可以支持程序查询式中断,又可以支持向量式中断,因而8259中断控制器的功能既强大又灵活。
1、8259引脚简介 8259芯片引脚图见图6
D0D1D2D3D4D5D6D7IR0IR1IR2IR3IR4IR5IR6IR78259INTINTACSRDWRA0SP/ENCAS0CAS1CAS2
图6 8259芯片引脚图
引脚说明:IR0~IR7用来锁存8个外设的中断请求状态,CAS0 、CAS0和 CAS0用于芯片级联时使用,INT用于向CPU发出中断请求信号,INTA用于接CPU中断允许信号。 2、初始化编程
在8259开始工作前,用户必须对8259A进行初始化编程。通过写入初始化命令字ICW1~ICW4对8259进行初始化 3、中断操作编程
在8259工作期间,可以随时向8259写入操作命令字OCW1~OCW3,使之按用户设置的
8
新的工作方式进行工作,如用户可以通过写OCW1来选择屏蔽某些中断,还可以通过写操作命令字OCW2发中断结束命令。 4、操作方式编程 OCW1,其格式为:
OCW1也可称为屏蔽操作字,其被写入8259内部的中断屏蔽寄存器IMR。OCW1的8位与IR0~IR7相对应,当其某一位为1时,即相应IR上的输入信号被屏蔽。IMR中的内容在任何时候都可读出或写入,要访问奇口地址。
OCW2,其用于设置中断结束方式和优先级循环方式,要访问偶口地址。其格式为:
OCW3,其用于设置特殊中断屏蔽方式和程序查询方式、读状态方式。其格式为:
5、初始化程序片段: mov al,inttype ;读取原有中断向量 mov ah,35h int 21h push es ;原有中断向量入栈保护 push bx
lea dx,intpr ;获取中断向量偏移量 mov cx,seg intpr ;获取中断向量段首址 push ds ;原有数据段基址ds入栈保护 mov ds,cx
mov al,inttype ;设置新的中断号 mov ah,25h ;设置新的中断向量 int 21h pop ds in al,21h ;读取8259中断 and al,0feh ;开IR0中断 out 21h,al
2.2.4 ADC0809芯片
ADC0809是CMOS工艺的8位逐次逼近型A/D转换器,它由8路模拟开关、地址锁存译码器、8位A/D转换器及三态输出锁存器构成。八通道多路转换器能直接连通8个单端模拟信号中的任何一个。ADC0809芯片的引脚图如图7所示。
9
VREF(-)VREF(+)OEADCSADWRADRDADDCCLKADDBADCEOCADDA0809IN7DB7IN6DB6IN5DB5IN4DB4IN3DB3IN2DB2IN1DB1IN0DB0
图7 ADC0809芯片引脚图
1、主要引脚功能简介
(1)IN0~IN7:8路模拟信号输入端,由地址锁存及译码控制单元的3位地址A、B、C进行选通切换。该次课程设计中只用到了IN0。 (2)START:A/D转换启动控制信号输入端
(3)ALE:地址信号输入端,START和ALE共同用于A/D转换 (4)VREF(+)和VREF(-):正、负基准电压输入端
(5)OE:输出允许控制信号输入端。A/D转换后的数据进入三态输出数据锁存器,并在OE的作用下(OE为高电平),通过D7~D0将锁存器的数据送出。 (6)EOC:A/D转换结束标志信号
(7)CLK外部送给ADC0809的时钟信号 2、ADC0809的操作编程
mov dx,ADC0809端口号 mov al,0 ;选择0路,INT0 out dx,al call delay ;延时,转换需要一定时间 in al,dx ;获取数值
2.2.5 键盘的设置
1、键盘的接口
键盘的接口一般分为独立式和矩阵式。
独立式按键就是各按键相互独立、每个按键各接一根输入线,一根输入线上的按键是否按下不会影响其他输入线上的工作状态。因此,通过检测输入线的电平状态可以很容易判断哪个按键被按下了。独立式按键电路配置灵活,软件结构简单。但每个按键需占用一根输入线,在按键数量较多时,输入口浪费大,电路结构显得很繁杂。故此种键盘适用于按键较少或操作速度较高的场合。若采用此方式,,各按键开关均采用上拉电阻,这是为了保证在按键断开时,各IO口线有确定的高电平。当然如输入口线内部已有上拉电阻,则外电路的上拉电阻可省去。
矩阵式键盘适用于按键数量较多的场合,它由行线和列线组成,按键位于行、列的交叉点上,一个4*4的行、列结构可以构成一个含有16个按键的键盘。很明显,在按键数量较多的场合,矩阵键盘与独立式按键键盘相比,要节省很多的I/O口。行、列线分别接到按键的两端。行线通过上拉电阻接到+5V上。平时无按键时,行、列线处于高电平状态,而当有
10
键按下时,行、列线将导通,因此行线电平状态将由与此行线相连的列线电平决定。按键的识别在此课设中采用扫描法。让所有的列线处于低电平,当有键按下时,按键所在的行电平将被拉成低电平,根据此行电平的变化,便能判定此行有键被按下。为了进一步判定到底哪一列的键被按下,可在某一时刻只让一条列线处于低电平,而其余所有列线处于高电平。 这里采用的是矩阵式按键,且采用行扫描法,键盘接线图见图8
反向驱动电路S0S1S2S3S4S5S6S7S8S9S10S11S12S13S14S15
图8 键盘接线图
2、键盘扫描程序: mov dx,p8255pb mov al,0 out dx,al inc dx
AB:in al,dx and al,0fh cmp al,0fh jz AB mov di ,5 mov cx,0
delay11:loop delay11 dec di
jnz delay11 mov bh,0 mov bl,0
mov cx,4 mov ah,0feh AGAIN:mov al,ah mov dx,p8255pb out dx,al
inc dx in al,dx and al,0fh cmp al,0fh jnz AB1 add bh,4 rol ah,1 loop AGAIN
jmp KeyboardScan
;行,即PB口输出全零
;pc口读值,如果不为0f则说明是有键按下
;延时消抖
;用于记录是哪行哪列的键被按下了 ;判断四次看到底有无键按下 ;PB口逐行置零
;dx已指向pc口了 ;al 里是pc口的状态
11
AB1:mov cx,4 AB3:shr al,1 jc AB2
jmp AB4 AB2:inc bl loop AB3
AB4:add bh,bl mov al,bh lea bx,asctab xlat mov ah,2 mov dl,al int 21h
push dx mov cx,100 shifang:mov dx,p8255pb mov al,0 out dx,al inc dx AB5: in al,dx and al,0fh cmp al,0fh jnz AB5
loop shifang mov di,5 mov cx, 0
delay12:loop delay12 dec di
jnz delay12 pop dx
;既然到了AB1,说明已经有键被按下
;这列有键按下
;判释放
;延时消抖
2.2.6 LED数码管的设置
1、LED说明
LED是7段码显示,并且是共阴的,将8255的PA0-PA7接到键盘显示单元的KD0-KD7,PC0-PC3接到KH1-KH4,通过动态扫描可让LED动态显示相应的信息。
此课程设计使用共阴结构,阴极控制端为低电平,数码显示端输入高电平时发亮。 显示器的工作方式有静态显示和动态显示。所谓静态显示,就是当显示器显示某一个字符时,相应的二极管恒定地导通或截止。优点是显示稳定,在发光二极管导通电流一定的情况下显示器的亮度大,在系统运行过程中,仅在需要更新显示内容时CPU才执行一次显示更新子程序,大大节省了CPU的时间,提高CPU的利用率。
所谓动态显示,就是一位一位地轮流点亮各位显示器,对于每一位显示器来说,每隔一段时间点亮一次。显示器的亮度与导通电流有关,也与点亮时间和间隔时间的比例有关。调整
12
电流和时间参数,可实现亮度较高和比较稳定的显示。此课程设计中使用的是动态显示,8255的A口作为扫描口,经反向驱动器75452接显示器公共极,B口作为数据口,接到显示器的各个段。
LED驱动电路见图9所示
反向驱动电路 2、LED驱动显示程序:lea bx,table
lea si,buffer ab11: mov al,[si]
xlat mov dx,p8255pa out dx,al
mov al,bit mov dx,p8255pb out dx,al mov di,30 mov cx,6000h
delay:loop delay dec di jnz delay
inc si shl bit,1
cmp bit,10h jnz ab11
mov bit,1 mov al,0 out dx,al
图9 LED显示模块的电路 查表换码
;A口用于输出用于点亮数码管的段码 ;B口用于输出用于选中数码管的位选 ;延时 ;显示下一单元里的值 ;用于4位数码管循环点亮
;消隐,以消除亮度不一的问题 13
; 三、软件系统设计
3.1程序流程图 3.1.1 主程序流程图
电子秤系统的主程序流程图见以下图10
14
开机初始化调用键盘扫描处理程序YY是R键吗?NFlag为1吗YNflag为2吗NYY是A键码?N是B键吗?NBuffer里值置零Flag值置2Flag置1N按键为A?YFlag置1单价、总价送往显示缓冲区N按键为B?YFlag置2单价、重量送往显示缓冲区关中断,中断矢量复原返回DOS 图10 主程序流程图
3.1.2 中断处理程序流程图
中断处理程序流程图见图11
15
保护现场NFlag为2?YCount加1NCount为200?YFlag清零Count清零Time加1N满1秒了吗?YYFlag为2?N调用采样函数Time清零调用动态显示程序实现4个LED显示送中断结束命令恢复现场中断返回图11 中断流程图
3.2参数信息
p8253ctrl equ 43h p8253ct0 equ 40h cnt equ 11930
定义8253方式字端口 定义8253计数器0端口
定义8253的初值(用于产生100HZ的信号)
16
p8255ctrl equ 0c803h 定义8255方式字端口 p8255pa equ 0c800h 定义8255的PA口 p8255pb equ 0c801h 定义8255的PB口 p8255pc equ 0c802h 定义8255的PC口 inttype equ 08h 定义8号中断
time db 0 用于获得1s的时钟(100*10ms=1s) count dw 0 获得延时
table db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h 定义0到9的段码表 asctab db \"0123456789ABR\" 定义asctab表 buffer db 0,0,0,0 定义显示缓冲区 bit db 1 用于数码管位选
flag db 0 用于记录是哪个键被按下了 weight db 0 定义产品重量 price db 0 定义产品单价 amount dw 0 定义产品总价
3.3 源程序清单
;--------------8253端口定义-------------------------- p8253ctrl equ 43h ;8253方式字端口 p8253ct0 equ 40h ;8253计数器0端口 cnt equ 11930 ;8253计数初值
;--------------8255端口定义-------------------------- p8255ctrl equ 0c803h ;8255方式字端口 p8255pa equ 0c800h ;8255PA口 p8255pb equ 0c801h ;8255PB口 p8255pc equ 0c802h ;8255PC口
;--------------8259中断向量定义-------------------------- inttype equ 08h ;中断向量号
;--------------数据域-------------------------------- .model small .data
time db 0 ;获得1s的时钟100*10ms=1s count dw 0 ;获得延时
table db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h ;0到9的段码表 asctab db \"0123456789ABR\" ;asctab表 buffer db 0,0,0,0
bit db 1 ;用于数码管位选
flag db 0 ;用于记录是哪个键被按下了 weight db 0 ;产品重量 price db 0 ;产品单价 amount dw 0 ;产品总价
;--------------主程序---------------------------------------
17
.code .startup
;--------------8253初始化---------------------------
mov al,36h ;计数器0,16位,方式3,二进制计数 mov dx,p8253ctrl ;43h
out dx,al ;写入控制方式字
mov ax,cnt ;写入计数初值,先写低8位,再写高8位 mov dx,p8253ct0 out dx,al
mov al,ah
out dx,al
;--------------8255初始化--------------------------- mov dx,p8255ctrl
mov al,89h ;PA输出 PB输出 PC输入(PC4-PC7也设定为输入) out dx,al
;--------------8259初始化--------------------------- mov al,inttype ;读取原有中断向量 mov ah,35h int 21h
push es ;原有中断向量入栈保护 push bx
lea dx,intpr ;获取中断向量偏移量 mov cx,seg intpr ;获取中断向量段首址
push ds ;原有数据段基址ds入栈保护 mov ds,cx
mov al,inttype ;设置新的中断号 mov ah,25h ;设置新的中断向量 int 21h pop ds
in al,21h ;读取8259中断 and al,0feh ;开IR0中断 out 21h,al
;---------------------------------------------------- sti ;开总中断
scan:call KeyboardScan ;调用键盘扫描程序
cmp dl,'R' ;如果按下的是R键,则熄灭LED数码管,程序退出 jz Exit
cmp flag,1 ;如果flag为1,则跳到ahandle处进行处理 jz ahandle cmp flag,2
jz bhandle ;如果flag为2,则跳到bhandle处进行处理 cmp dl,'A' ;如果按下的键是A键,则使flag为1 jz tA
cmp dl,'B' ;如果按下的键是B键,则使flag为2
18
jz tB
mov buffer,0 ;当不是A、B、R键按下的时候,只显示物品的重量 jmp quit
tA: mov flag,1 jmp quit tB: mov flag,2 jmp quit ahandle:
cmp dl,'B' ;当flag为1的时候,数码管会一直显示单价和重量 jnz qw
mov flag,2 ;必须在这里进行判断是否B键被按下了,才能再做其他操作 jmp quit
qw:sub dl,30h ;因为数码管的个数不够,所以只让单价可以为1、2、3 cmp dl,1 jz tX cmp dl,2 jz tX cmp dl,3 jz tX jmp quit
tX:mov price,dl
mov buffer,dl ;单价送往buffer单元,用于后面的显示 jmp quit bhandle:
cmp dl,'A' ;当flag为2的时候,数码管会一直显示单价和总价
jnz we ;必须在这里进行判断是否A键被按下了,才能再做其他操作 mov flag,1 jmp quit we:mov ah,0 mov al,weight mov bl,price mul bl
mov amount,ax
call Convert ;总价送往buffer+1,buffer+2,和buffer+3单元 quit:jmp scan
;------------------------------------------------
Exit:cli ;close总中断,关中断之后就不会进行刷新了,数码管不再亮了 pop dx pop ds
mov al,inttype ;还原原来的中断向量 mov ah,25h int 21h .exit 0
;-----------------------中断服务程序------------
19
intpr: push ax push bx push cx push dx push di push si push bp
push sp ;众多寄存器基址进栈保护
cmp flag,2 ;用于设置当flag为2,即B键按下后,总价显示到还原的时间 jnz qq inc count cmp count,200 jnz qq mov flag,0 mov count,0
qq:inc time ;中断服务程序,进入100次中断的时间为1s cmp time,100 ;100*10ms=1s jnz iexit
cmp flag,2 ;当显示总价的时候不进行AD采样 jz notsample call Sample
notsample:mov time,0
iexit: call Refresh ;调用数码管刷新程序 mov al,20h ;发EOI中断结束命令 out 20h,al ;20h为8259的偶口 pop sp pop bp pop si pop di pop dx pop cx pop bx
pop ax ;众多寄存器基址出栈 iret ;返回到主程序中
;------------采样程序----------------------------- Sample:
mov dx,0c840h ;ADC0809端口号 mov al,0 ;选择0路,INT0 out dx,al
mov cx,3000 ;延时 loop $
in al,dx ;获取产品重量
mov weight,al ;用weight记录重量值 call Convert ;调用转换函数
20
ret
;-----------转换--------------------------------
Convert:cmp flag,2 ;当flag为2时表示要转换的是总价,否则进行的是重量的转换 jnz c1
mov ax,amount jmp c2
c1:mov al,weight
mov ah,0 ;将00~FF表示的重量转换到buffer中去,已用以显示 c2:mov bl,100 div bl
mov buffer+1,al ;重量的百位或总价的百位 mov al,ah mov ah,0 mov bl,10 div bl
mov buffer+2,al ;十位 mov buffer+3,ah ;个位 ret
;------------LED数码管刷新子程序----------------------- Refresh:
lea bx,table lea si,buffer ab11: mov al,[si]
xlat ;查表换码
mov dx,p8255pa ;A口用于输出用于点亮数码管的段码 out dx,al
mov al,bit ;B口用于输出用于选中数码管的位选 mov dx,p8255pb out dx,al mov di,30 mov cx,6000h
delay:loop delay ;延时 dec di jnz delay
inc si ;显示下一单元里的值 shl bit,1
cmp bit,10h ;用于4位数码管循环点亮 jnz ab11
mov bit,1
mov al,0 ;消隐,以消除亮度不一的问题 out dx,al ret
;------------键盘扫描子程序-------------------------- KeyboardScan:
21
mov dx,p8255pb mov al,0 out dx,al inc dx
AB:in al,dx and al,0fh cmp al,0fh jz AB mov di ,5 mov cx,0
delay11:loop delay11 dec di
jnz delay11 mov bh,0 mov bl,0
mov cx,4 mov ah,0feh AGAIN:mov al,ah mov dx,p8255pb out dx,al
inc dx in al,dx and al,0fh cmp al,0fh jnz AB1 add bh,4 rol ah,1 loop AGAIN
jmp KeyboardScan AB1:mov cx,4 AB3:shr al,1 jc AB2
jmp AB4 AB2:inc bl loop AB3
AB4:add bh,bl mov al,bh lea bx,asctab xlat mov ah,2 mov dl,al int 21h
push dx mov cx,100
;行,即PB口输出全零
;pc口读值,如果不为0f则说明是有键按下
;延时消抖
;用于记录是哪行哪列的键被按下了 ;判断四次看到底有无键按下 ;PB口逐行置零
;dx已指向pc口了 ;al 里是pc口的状态
;既然到了AB1,说明已经有键被按下
;这列有键按下
;判释放
22
shifang:mov dx,p8255pb mov al,0 out dx,al inc dx AB5: in al,dx and al,0fh cmp al,0fh jnz AB5
loop shifang mov di,5 mov cx, 0
delay12:loop delay12 ;延时消抖 dec di
jnz delay12 pop dx ret
;------------------------------------------------- end
四、心得体会
为期两周的汇编课程设计已经接近尾声了,在这两周里我从中学到了不少有用的东西。之前一直以为自己汇编语言还是学的不错的,尤其是感觉考试还不错后,但在这次的课程设计中,我还是发现自己学习上的一些不足之处,一些遗漏点,这些是自己还需要进一步进行细化的地方。
这次的课程设计,我是和我们宿舍的两个同学组成一组的,所以比较熟悉,大家配合、合作起来也比较愉快。尽管AD模块之前没学过,但是经过老师的指导,我们掌握了如何去接线,和AD的一些简单的编程。在这几天的课程设计中,我们一开始都是拿着之前写的正确的程序,如8259中断实验,8255时钟显示实验,8255键盘扫描实验,来测试实验箱是否可用,但一定要确保所用的程序是正确的。刚进实验室那天我们遇到了很多问题,一开始是主机接上实验箱后,找不到实验箱的图标,也就是无法识别实验箱,换了一台机后又通过程序发现实验箱上的8255芯片也出了故障,又找了块好的芯片替换,看到别人比我们进度快,我们都告诫自己不要急,确定箱子和实验程序无误再思考下一步怎么办。半天,老师就只让我们做了检测实验箱和之前的三个程序的正确性,当时有点不理解,为什么不加快点进度,在后来的几天课程设计中明白了:必须先确保实验箱和程序没有问题,才能集中心思去编写课程设计的主要模块功能,而且这几个程序也将用作程序的子模块,所以细细想来还是很有必要的。在接下来的一天里,我们遇到的主要问题是硬件上的问题,包括ADC0809的8位数据线没接,还有是一根线损坏,通过不断地检测,查线,我们发现了问题所在。第三天我们做的有点艰难,因为我们犯了一个很让自己抓狂的错误,那就是照搬之前的程序,或者说是不知变通的模仿之前的程序,而忘了在中断服务程序中把一些需要进栈的寄存器进栈,最后在老师的指点下,我们解决了这个问题,这次的问题让我印象尤为深刻,也让我知道什么都不能照搬,或者是不加思索的模仿,那样肯定是要出问题的。最后一天,我们基本上没遇到
23
什么大的问题,课程设计实验部分也就这样顺利地结束了,但是却让我明白了很多,很多:程序一定要模块化,这样便于调试修改,也便于他人和自己的查阅,真是好处多多;要掌握调程序的一些方法,果断地判断或者是硬件问题或者是软件问题;当遇到问题时,不要急,也不能急,应该好好静下心来,慢慢查找问题,分析解决问题,遇到问题并不可怕,这是很好的锻炼机会,我们应该抓住这样的机会,磨练自己,提高自己。
最后感谢我的小组成员这几天与我的精诚合作,感谢老师的耐心指导。
五、参考文献
【1】 韩雁、徐煜明 微机原理与接口技术 【2】 马维华、易仲芳 微型计算机及接口技术【3】 奚抗生 汇编语言程序设计 【4】 唐棠等 微型计算机与接口技术
24
电子工业出版社科学出版社 2002.2航空工业出版社南京大学出版社
2008.5 1994 1995
因篇幅问题不能全部显示,请点此查看更多更全内容