微机原理与接口技术课程设计电子秤设计.docx
《微机原理与接口技术课程设计电子秤设计.docx》由会员分享,可在线阅读,更多相关《微机原理与接口技术课程设计电子秤设计.docx(26页珍藏版)》请在冰豆网上搜索。
微机原理与接口技术课程设计电子秤设计
一、系统设计概述
1.1电子秤功能概述
本次课程设计的课题是电子秤设计,主要是以80x86CPU为核心设计一个电子秤检测系统(AD采样用ADC0809),系统可实现对压力信号的采集,转换成电信号,再通过AD转换模块转换成CPU可以处理的数字信号,实现在显示器上显示当前物品的重量,当然这里的重量是通过变位器进行的压力信号的模拟。
此外该电子秤设计还添加了一些辅助单元,通过按键来实现的一些功能。
如按下4*4矩阵键盘上的A键后,可以设置物品的单价;按下B键,LED数码管上将显示当前物品的单价及总价;当按下R键后,将熄灭数码管,退出电子秤称重系统。
上面即为电子秤设计的主要的功能。
1.2主要模块
电子秤系统主要由80x86CPU模块(即一台PC机)、8255并行口模块、8259中断控制器模块、8253定时计数器模块、键盘、LED数码管显示模块,还有比较重要的一个模块就是ADC0809,即AD采样模块,用于将电模拟信号转换成数字信号。
1.3主要原理
电子秤设计的主要原理是利用ADC0809对采集到的模拟压力信号,将其转换成易于处理的数字电信号,将采集得到的重量在数码管上显示出来(0-255),用于告诉用户当前物品的重量。
由用户决定接下来继续进行什么样的操作,设置单价,显示总价,或是按键退出电子秤称重系统。
重要的原理就在于对模拟压力信号的采集,处理转换成电信号,最后经过AD转换模块转换成数字式实验箱易于处理的数字信号,作为其他模块的处理基础,这就是大概的系统设计原理。
二、硬件系统设计
2.1硬件系统设计概述
2.1.1工作原理
实验箱硬件部分,主要用到8255、8259中断控制器、8253定时计数器、键盘、LED数码管,还用到的就是ADC0809,用于模拟和数字信号之间的转换。
电子秤硬件系统设计的主要原理是利用压力传感器采集模拟压力信号,经过一系列处理,转换成模拟电信号,再送给AD转换模块(ADC0809)进行处理,最后就可以得到易于CPU处理的数字电信号。
将处理后的信号送给处理器,由处理器控制实验箱上显示器来进行显示,同时还可以通过实验箱上的键盘模块对显示的内容进行控制,以用来控制当前显示在数码管上的内容,包括设置单价,显示总价,还有就是按键退出电子秤称重系统。
系统的工作原理图如图1所示。
图1工作原理图
2.1.2实验接线图
系统的硬件接线图如下面的图2所示。
图2硬件系统接线图
说明为了便于查看,一些线未画出来。
其中ADC0809的CLK引脚在实验中接的是1.5MHz,其他未连的/CS都接到80X86的IOY0引脚上,/RD和/WR接到分别接到80X86的IORD和IOWR引脚上。
2.2硬件系统所用芯片资料介绍
该系统设计主要用到的芯片有8253、8255、8259、ADC0809,还有就是LED显示模块,4*4矩阵键盘。
现将用到的芯片和模块分别介绍如下。
2.2.18253芯片
8253是一块定时器/计数器接口芯片,其具有三个独立的16位计数器,它可用程序设置成多种工作方式,按十进制BCD码或二进制进行减法计数,最高计数速率可达2.6MHz。
8253能工作于定时方式,OUT脚产生周期性的输出波形,作为可编程方波频率发生器、分频器等,也可以工作于计数器方式,OUT脚产生非周期性的输出波形,作为程控单脉冲发生器、事件计数器等。
1、8253的引脚介绍
8253的引脚排列如图3所示。
图38253的引脚图
引脚说明:
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的读写访问:
写8253工作方式字、装入各计数器的初始值、读出各计数器的当前值。
双向三态的8位数据总线缓冲器根据地址信号A0A1来选择内部的源寄存器并将数据发送到总线上或接受来自总线的数据并送到A0A1指定的目的寄存器。
图48253的结构框图
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位的计数值
初始化程序片段:
moval,计数器控制字
movdx,控制方式端口
outdx,al
movax,计数器初值
movdx,计数器0端口
outdx,al;写计数器的初值低字节部分
moval,ah
outdx,al;写计数器计数初值高字节部分
2.2.28255芯片
8255是通用可编程并行接口芯片,具有40个引脚、双列直插式封装的大规模集成电路,采用单一+5V供电,输入/输出电平与TTl完全兼容,芯片引脚图见图5
图58255芯片引脚图
引脚简要介绍:
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个方式控制字到控制口。
▪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位都作为基本输入/输出口。
初始化程序片段:
moval,方式控制字
movdx,端口号;如果端口号>255,应用dx间接寻址
outdx,al;写入控制寄存器
2.2.38259芯片
8259是专门用来控制中断的芯片。
它内部集成了与中断控制有关的所有基本存储电路,包括中断请求锁存、中断源优先级排队、中断源识别、中断源屏蔽、中断向量号产生等电路,既可以支持程序查询式中断,又可以支持向量式中断,因而8259中断控制器的功能既强大又灵活。
1、8259引脚简介
8259芯片引脚图见图6
图68259芯片引脚图
引脚说明:
IR0~IR7用来锁存8个外设的中断请求状态,CAS0、CAS0和CAS0用于芯片级联时使用,INT用于向CPU发出中断请求信号,INTA用于接CPU中断允许信号。
2、初始化编程
在8259开始工作前,用户必须对8259A进行初始化编程。
通过写入初始化命令字ICW1~ICW4对8259进行初始化
3、中断操作编程
在8259工作期间,可以随时向8259写入操作命令字OCW1~OCW3,使之按用户设置的新的工作方式进行工作,如用户可以通过写OCW1来选择屏蔽某些中断,还可以通过写操作命令字OCW2发中断结束命令。
4、操作方式编程
OCW1,其格式为:
OCW1也可称为屏蔽操作字,其被写入8259内部的中断屏蔽寄存器IMR。
OCW1的8位与IR0~IR7相对应,当其某一位为1时,即相应IR上的输入信号被屏蔽。
IMR中的内容在任何时候都可读出或写入,要访问奇口地址。
OCW2,其用于设置中断结束方式和优先级循环方式,要访问偶口地址。
其格式为:
OCW3,其用于设置特殊中断屏蔽方式和程序查询方式、读状态方式。
其格式为:
5、初始化程序片段:
moval,inttype;读取原有中断向量
movah,35h
int21h
pushes;原有中断向量入栈保护
pushbx
leadx,intpr;获取中断向量偏移量
movcx,segintpr;获取中断向量段首址
pushds;原有数据段基址ds入栈保护
movds,cx
moval,inttype;设置新的中断号
movah,25h;设置新的中断向量
int21h
popds
inal,21h;读取8259中断
andal,0feh;开IR0中断
out21h,al
2.2.4ADC0809芯片
ADC0809是CMOS工艺的8位逐次逼近型A/D转换器,它由8路模拟开关、地址锁存译码器、8位A/D转换器及三态输出锁存器构成。
八通道多路转换器能直接连通8个单端模拟信号中的任何一个。
ADC0809芯片的引脚图如图7所示。
图7ADC0809芯片引脚图
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的操作编程
movdx,ADC0809端口号
moval,0;选择0路,INT0
outdx,al
calldelay;延时,转换需要一定时间
inal,dx;获取数值
2.2.5键盘的设置
1、键盘的接口
键盘的接口一般分为独立式和矩阵式。
独立式按键就是各按键相互独立、每个按键各接一根输入线,一根输入线上的按键是否按下不会影响其他输入线上的工作状态。
因此,通过检测输入线的电平状态可以很容易判断哪个按键被按下了。
独立式按键电路配置灵活,软件结构简单。
但每个按键需占用一根输入线,在按键数量较多时,输入口浪费大,电路结构显得很繁杂。
故此种键盘适用于按键较少或操作速度较高的场合。
若采用此方式,,各按键开关均采用上拉电阻,这是为了保证在按键断开时,各IO口线有确定的高电平。
当然如输入口线内部已有上拉电阻,则外电路的上拉电阻可省去。
矩阵式键盘适用于按键数量较多的场合,它由行线和列线组成,按键位于行、列的交叉点上,一个4*4的行、列结构可以构成一个含有16个按键的键盘。
很明显,在按键数量较多的场合,矩阵键盘与独立式按键键盘相比,要节省很多的I/O口。
行、列线分别接到按键的两端。
行线通过上拉电阻接到+5V上。
平时无按键时,行、列线处于高电平状态,而当有键按下时,行、列线将导通,因此行线电平状态将由与此行线相连的列线电平决定。
按键的识别在此课设中采用扫描法。
让所有的列线处于低电平,当有键按下时,按键所在的行电平将被拉成低电平,根据此行电平的变化,便能判定此行有键被按下。
为了进一步判定到底哪一列的键被按下,可在某一时刻只让一条列线处于低电平,而其余所有列线处于高电平。
这里采用的是矩阵式按键,且采用行扫描法,键盘接线图见图8
图8键盘接线图
2、键盘扫描程序:
movdx,p8255pb;行,即PB口输出全零
moval,0
outdx,al
incdx
AB:
inal,dx;pc口读值,如果不为0f则说明是有键按下
andal,0fh
cmpal,0fh
jzAB
movdi,5
movcx,0
delay11:
loopdelay11;延时消抖
decdi
jnzdelay11
movbh,0;用于记录是哪行哪列的键被按下了
movbl,0
movcx,4;判断四次看到底有无键按下
movah,0feh;PB口逐行置零
AGAIN:
moval,ah
movdx,p8255pb
outdx,al
incdx;dx已指向pc口了
inal,dx;al里是pc口的状态
andal,0fh
cmpal,0fh
jnzAB1
addbh,4
rolah,1
loopAGAIN
jmpKeyboardScan
AB1:
movcx,4;既然到了AB1,说明已经有键被按下
AB3:
shral,1
jcAB2
jmpAB4;这列有键按下
AB2:
incbl
loopAB3
AB4:
addbh,bl
moval,bh
leabx,asctab
xlat
movah,2
movdl,al
int21h
pushdx
movcx,100;判释放
shifang:
movdx,p8255pb
moval,0
outdx,al
incdx
AB5:
inal,dx
andal,0fh
cmpal,0fh
jnzAB5
loopshifang
movdi,5
movcx,0
delay12:
loopdelay12;延时消抖
decdi
jnzdelay12
popdx
2.2.6LED数码管的设置
1、LED说明
LED是7段码显示,并且是共阴的,将8255的PA0-PA7接到键盘显示单元的KD0-KD7,PC0-PC3接到KH1-KH4,通过动态扫描可让LED动态显示相应的信息。
此课程设计使用共阴结构,阴极控制端为低电平,数码显示端输入高电平时发亮。
显示器的工作方式有静态显示和动态显示。
所谓静态显示,就是当显示器显示某一个字符时,相应的二极管恒定地导通或截止。
优点是显示稳定,在发光二极管导通电流一定的情况下显示器的亮度大,在系统运行过程中,仅在需要更新显示内容时CPU才执行一次显示更新子程序,大大节省了CPU的时间,提高CPU的利用率。
所谓动态显示,就是一位一位地轮流点亮各位显示器,对于每一位显示器来说,每隔一段时间点亮一次。
显示器的亮度与导通电流有关,也与点亮时间和间隔时间的比例有关。
调整电流和时间参数,可实现亮度较高和比较稳定的显示。
此课程设计中使用的是动态显示,8255的A口作为扫描口,经反向驱动器75452接显示器公共极,B口作为数据口,接到显示器的各个段。
LED驱动电路见图9所示
图9LED显示模块的电路
2、LED驱动显示程序:
leabx,table
leasi,buffer
ab11:
moval,[si]
xlat;查表换码
movdx,p8255pa;A口用于输出用于点亮数码管的段码
outdx,al
moval,bit;B口用于输出用于选中数码管的位选
movdx,p8255pb
outdx,al
movdi,30
movcx,6000h
delay:
loopdelay;延时
decdi
jnzdelay
incsi;显示下一单元里的值
shlbit,1
cmpbit,10h;用于4位数码管循环点亮
jnzab11
movbit,1
moval,0;消隐,以消除亮度不一的问题
outdx,al
三、软件系统设计
3.1程序流程图
3.1.1主程序流程图
电子秤系统的主程序流程图见以下图10
图10主程序流程图
3.1.2中断处理程序流程图
中断处理程序流程图见图11
图11中断流程图
3.2参数信息
p8253ctrlequ43h定义8253方式字端口
p8253ct0equ40h定义8253计数器0端口
cntequ11930定义8253的初值(用于产生100HZ的信号)
p8255ctrlequ0c803h定义8255方式字端口
p8255paequ0c800h定义8255的PA口
p8255pbequ0c801h定义8255的PB口
p8255pcequ0c802h定义8255的PC口
inttypeequ08h定义8号中断
timedb0用于获得1s的时钟(100*10ms=1s)
countdw0获得延时
tabledb0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h定义0到9的段码表
asctabdb"0123456789ABR"定义asctab表
bufferdb0,0,0,0定义显示缓冲区
bitdb1用于数码管位选
flagdb0用于记录是哪个键被按下了
weightdb0定义产品重量
pricedb0定义产品单价
amountdw0定义产品总价
3.3源程序清单
;--------------8253端口定义--------------------------
p8253ctrlequ43h;8253方式字端口
p8253ct0equ40h;8253计数器0端口
cntequ11930;8253计数初值
;--------------8255端口定义--------------------------
p8255ctrlequ0c803h;8255方式字端口
p8255paequ0c800h;8255PA口
p8255pbequ0c801h;8255PB口
p8255pcequ0c802h;8255PC口
;--------------8259中断向量定义--------------------------
inttypeequ08h;中断向量号
;--------------数据域--------------------------------
.modelsmall
.data
timedb0;获得1s的时钟100*10ms=1s
countdw0;获得延时
tabledb0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h;0到9的段码表
asctabdb"0123456789ABR";asctab表
bufferdb0,0,0,0
bitdb1;用于数码管位选
flagdb0;用于记录是哪个键被按下了
weightdb0;产品重量
pricedb0;产品单价
amountdw0;产品总价
;--------------主程序---------------------------------------
.code
.startup
;--------------8253初始化---------------------------
moval,36h;计数器0,16位,方式3,二进制计数
movdx,p8253ctrl;43h
outdx,al;写入控制方式字
movax,cnt;写入计数初值,先写低8位,再写高8位
movdx,p8253ct0
outdx,al
moval,ah
outdx,al
;--------------8255初始化---------------------------
movdx,p8255ctrl
moval,89h;PA输出PB输出PC输入(PC4-PC7也设定为输入)
outdx,al
;--------------8259初始化---------------------------
moval,inttype;读取原有中断向量
movah,35h
int21h
pushes;原有中断向量入栈保护
pushbx
leadx,intpr;获取中断向量偏移量
movcx,segintpr;获取中断向量段首址
pushds;原有数据段基址ds入栈保护
movds,cx
moval,inttype;设置新的中断号
movah,25h;设置新的中断向量
int21h
popds
inal,21h;读取8259中断
andal,0feh