数字二进制编码器讲解.docx
《数字二进制编码器讲解.docx》由会员分享,可在线阅读,更多相关《数字二进制编码器讲解.docx(19页珍藏版)》请在冰豆网上搜索。
数字二进制编码器讲解
合肥学院
计算机科学与技术系
微机原理与接口技术
课程设计报告
2008~2009学年第1学期
课程
微机原理与接口技术
课程设计名称
数字二进制编码器
学生姓名
程苏秦
学号
0604032011
专业班级
网络工程专业(06网工2)
指导教师
肖连军老师
2009年2月
一、题意分析及解决方案
1.题义需求分析
1)设计内容:
①用STARES598PCI单板开发机和接口芯片设计应用接口作为一个16位二进制编码器的输入口,并用该口作为4位LED七段显示器的输出口,循环显示其编码的结果。
②在实现①中的功能后,在其基础上再把输入的16位二进制数转换成10进制数输出,并实现10进制数与16进制数的交替显示。
2)内容分析:
我们在实验中要利用逻辑开关板输入一个十六位的二进制数,利用LED七段数码显示,控制电路板的LED七段显示器使它能交替显示与所输入的十六位二进制数相对应的十进制数和十六进制数。
3)需要解决的问题:
①如何实现16位二进制数的置数
②如何从外界输入一个16位的二进制数,是否需要分几次输入
③通过何种算法实现二进制数到16进制字型码的转化
④通过何种算法实现二进制数到10进制字型码的转化,转换10进制数时如何注意正负数的不同
⑤数据如何输出
⑥如何交替显示结果
2.解决问题的方法及思路
1)硬件部分
①十六位二进制数通过逻辑开关输入
逻辑开关的连线比较简单,实现上也比较容易,它以逻辑开关的上下切换来表示二进制数“0”和“1”。
在输入后,可观察逻辑开关的上下位置,知道输入的二进制数是什么。
②接口芯片选用8255芯片
本实验中可选用芯片8255,它是可编程并行接口芯片,它支持字节数据的并行传送,有三个8位I/O端口。
8255的接线比较简单,便于我们的应用,它是一个通用的芯片,在本设计中主要用于选择位码和输出段码。
③转化
我们将利用学过的汇编知识,通过编程来实现二进制数到十六进制字型码的转化,以及到有正负之分的十进制数的转化。
④显示编码设备LED
LED七段显示器是常用输出设备,由发光二极管封装而成。
它的工作电压低,体积小,响应快,使用LED七段显示器比较简便。
在该设计中要采用动态扫描、分时循环显示的方法。
LED显示器共用一套段码锁存器和驱动器,而各位的阴极则分别由端口B的一位经过驱动后去控制。
2)软件部分(汇编语言编写程序)
软件部分将完成:
①对PCI卡初始化,写8255方式命令控制字。
②读入开关量,设置初值子程序,读取并存储二进制开关状态。
③16位二进制数从高位到低位分4组4位的二进制数输入,通过查段选码表确定每组字型码,控制位选码和段选码的输出实现字型码的转换,包括到16进制数和10进制数的两种转换。
④位选码初始化为0FEH,并用循环左移控制不同LED显示器的亮灭,每位显示1ms,循环显示。
二、硬件设计
1.选择二进制逻辑开关
图1逻辑开关原理图
1)作用
实现二进制数的输入。
2)功能
逻辑开关为8个并连在一起的单刀双置开关,它一端接+5V的电源电压VCC,一端接地。
当触头与VCC相连时表示二进制数‘1’,当触头接地时是表示二进制数‘0’。
3)技术参数
一边接+5V电压,另一边接地。
2.可编程并行接口芯片8255
1)作用
PC口为输入口,它与二进制数逻辑开关相连把读入的数经PCI卡送到PC机,PB输出段码,将4位二进制数据转换为16进制数后对应的段选码送LED显示。
PA口输出位选码,选择转换后16进制数显示在LED上的位置。
2)功能
在本设计中,PA、PB、PC三口均工作在方式0状态。
PA0~PA7与LED相连设置位选,PB0~PB7与LED相连设置段选,PC0~PC7与逻辑开关K1~K8相连。
在读操作中,二进制逻辑开关被置的状态经PC口送入PC机中,在写操作中,把转换后的16进制数循环地输出到LED上。
3)技术参数
8255的技术参数包括:
输入低电平电压,输入高电平电压,输出低电平电压(数据端口),输出低电平电压(外围端口),输出高电平电压(数据端口),输出高电平电压(外围端口),达林顿驱动电流,电源电流,输入负载电流和输出浮动电流等。
8255的负载能力较小,由于这远小于LED所要求的工作电压,所以输出口PC需经驱动器同七段LED显示器相连接。
3.七段LED显示器
图2LED原理图与内部结构示意图
1)作用
显示输出的16进制数或10进制数。
2)功能
本设计中我们用共阴极类的LED显示器,它是由8个二极管电路按字型‘8’的方式排列,当不同的二极管被选通后根据发光效果会显示不同的字型。
3)技术参数
工作电压2~3.6V,工作电流0.02~0.03A,所以,耗电不超过0.1W。
由8255的参数可知,8255的驱动电流Vmin=1mA,Vmax=4mA,远远小于LED所要求的20mA~30mA,所以二者之间要加上驱动器。
4.硬件总逻辑图及其说明
图3硬件逻辑图
说明:
首先将PC机与实验箱(PCI)相连接,8255芯片的CS片选信号线接PCI卡的CS0,8255芯片A0、A1接PCI卡的A0、A1,这样做就是为了使CS0选择的地址空间范围是00F0~00FF,偶地址空间有效。
由此我们得到8255控制端口地址为00F3,PA口地址为00F0,PB口地址为00F1,PC口地址为00F2。
其他读写控制等信号线在内部已经接好,8255芯片的三个端口使用排线与其他部件相连,连接时应注意插孔的位置对应,不能连反了。
在本实验中,PA口位选,PB口段选,PC口接逻辑开关,所以PB口接LED的B位置作段选,PA口接LED的C位置作位选。
接线的过程中千万不要带电操作,避免危险和损坏仪器设备。
三、控制程序设计
1.控制程序设计思路说明
我们在本程序中要做到的工作如下:
(1)初始化是要实现写8255方式控制字。
8255芯片的A口作位选,B口作段选,C口作输入,且三个端口都工作于方式0。
(2)读入开关量是实现从PC口读入开关量。
16位二进制数据分四组四位数据进行置数并存储在4个连续的的存储单元,以8位开关的低4位作为数据,第5位用于重新置入新的一个16位的二进制数的开关,6、7位作为标志位标志所置数据位16位数据中的哪一部分,最高位则用于输入一个有效的4位二进制数的标志开关。
需要显示时从存储的单元中将数据取出。
(3)写操作实现的是根据二进制数从段选码中查表找出相应的字型码在LED显示器中显示。
①在输出对应16进制数时,写操作是通过四个循环完成。
第一次循环写低8位的低4位,第二次循环写低8位的高4位,第三次循环写高8位的低4位,第四次循环写高8位的高4位。
位选码初始化为0FEH,即显示在最后一位,并用循环左移控制不同LED显示器的亮灭,每位显示1mS循环显示。
16位二进制数据分4次显示。
每输入一个有效的4位数据时,程序都会根据PC5的状态来判断是否重新置一个16位的二进制数,若PC5是1,则表示此次输入是另一个新的16位二进制数。
②在输出对应的10进制数时,写操作较麻烦一点。
在程序中我们要先把16位的二进制数转换为10进制数,再把对应的10进制数的每位上的数值记入到一个我们事先定义的内存单元中,在写操作时,我们要把该单元中的数值通过段码表转换成对应的字型码,再通过位选上的设置来将其输出,这样就得到了转换后的10进制数。
(4)通过PC7的状态,我们可以得到16位二进制数对应的10进制数和16进制数。
PC7为1时,得到的是它对应的10进制数;PC7为0时,得到的是它对应的16进制数。
如此通过PC7我们就可以实现10进制数和16进制数的交替显示了。
2.控制程序流程图
1)主程序
将begin首地址
送入bx
2)TDSIP子程序:
返回
4)reast子程序:
Popcx
3.控制程序
.MODELTINY
PCIBAR3EQU1CH;8位I/O空间基地址(它就是实验仪的基地址,也为DMA&32BITRAM板卡上的8237提供基地址)
Vendor_IDEQU10EBH;厂商ID号
Device_IDEQU8376;设备ID号
.STACK100
.DATA
IO_Bit8_BaseAddressDW?
msg0DB'BIOS不支持访问PCI$'
msg1DB'找不到StarPCI9052板卡$'
msg2DB'读8位I/O空间基地址时出错$'
COM_ADDDW00F3H;控制口偏移量
PA_ADDDW00F0H;PA口偏移量
PB_ADDDW00F1H;PB口偏移量
PC_ADDDW00F2H;PC口偏移量
SEGMdb3fh,06h,5bh,4fh,66h,6dh,7dh,27h,7fh,6fh,77h,7ch,39h,5eh,79h,71h,40h
;段选码表
NUMdb00h,00h,00h,00h,00h,00h;10进制数据
BEGINdb00h,00h,00h,00h,00h,00h
.CODE
START:
MOVAX,@DATA
MOVDS,AX
NOP
CALLInitPCI;PCI卡初始化
CALLModifyAddress;根据PCI提供的基地址,将偏移地址转化为实地址
moval,10001001b;8255芯片初始化以PC口为输入,PB口输出段选,PA口输出位选
movdx,COM_ADD
outdx,al;将初始化信息写入8255芯片控制口
loop1:
movdx,PC_ADD;取8255C口地址
inal,dx
movah,al;将从C口打入的开关量输入至AL
andah,80h;取PC口第七位的状态
cmpah,80h;判断PC7=1?
jesetdata;等于1则设置初值
movsi,offsetBEGIN
callTDISP
jmploop1;继续查看C口状态
;设置初值
setdata:
movah,al
andah,10h
cmpah,10h;判断PC4=1?
jnenext;不是,则执行next
movbx,offsetBEGIN;是,BEGIN单元全置0
callreast
movbx,offsetNUM;NUM单元全置0
callreast
next:
movbx,offsetBEGIN;BX存放BEGIN单元的偏移地址
movah,al;低位不变,ah、al中内容用于判断和存数据
andax,0f60h;0000111101100000b,屏蔽保留6,7位后,用于位选LED八位的高低位
movcl,5;设置循环次数
shral,cl;逻辑右移5位01100000,
movcx,0;CX清零,利用低8位传送
movcl,al;循环后对应00,01,10,11
addbx,cx;BX里存放是从逻辑开关打入的数据的偏移地址
movbyteptr[bx],ah;将AH中的内容以字节的形式存放到指定单元
movbx,offsetBEGIN
moval,byteptr[bx+1]
movcl,4
shlal,cl
oral,byteptr[bx]
movah,byteptr[bx+3]
shlah,cl
orah,byteptr[bx+2];把输入的数据放入ax,没有输入的位默认为0
movbx,offsetNUM;NUM单元全置0
callreast
movbx,offsetNUM
cmpax,8000h;判断输入的是否为负数
jbnext1;不是,则执行next1
subax,1;是,则求它的相反数(正数)
xorax,0ffffh
movbyteptr[bx+5],10h;把‘-’的段码放入要显示的数据的最高位
next1:
movdx,0
movcx,10
divcx;进行除10操作
movbyteptr[bx],dl;余数放入bx指向的单元
incbx;bx加1
cmpax,0;判断商是否为0
jnenext1;不是,执行next1
movsi,offsetNUM
callTDISP
jmploop1;继续查看C口状态
TDISPproc
movcx,6
movah,11111110b;设置位选码,即LED0显示
loop2:
moval,byteptr[si];取存放在地址为SI寄存器中内容的内存单元中数据
movbx,offsetSEGM;取SEGM偏移地址
xlat;查数据段表,[al+bx]->al
movdx,PB_ADD;送PB口地址段选
outdx,al
moval,ah;送位选码,输入\输出指令对累加器采用固定寻址方式,即从输入端口传送到al/ax
movdx,PA_ADD;送PA口地址进行位选
outdx,al
calldelay;执行delay子程序
moval,0ffh;禁止显示
outdx,al
addsi,1
rolah,1;设置下次显示的位选码
looploop2;循环
ret
TDISPendp
;延迟子程序
delayproc
pushcx;将cx的内容保存入栈
movcx,100h;设置循环次数
loop5:
nop;空操作
looploop5;循环延时
popcx;出栈
ret;返回“禁止显示”
delayendp
;复位子程序
reastprocnear
pushcx
pushax
movcx,6
moval,0
loop3:
movbyteptr[bx],al
incbx
looploop3
popax
popcx
ret
reastendp
InitPCIPROCNEAR;近调用(同一程序段内)
MOVAH,00H
MOVAL,03H
INT10H
MOVAH,0B1H
MOVAL,01H
INT1AH
CMPAH,0
JZInitPCI2
LEADX,msg0
InitPCI1:
MOVAH,09H;不存在PCI卡时退出程序
INT21H
JMPExit
InitPCI2:
MOVAH,0B1H
MOVAL,02H
MOVCX,Device_ID
MOVDX,Vendor_ID
MOVSI,0
INT1AH
JNCInitPCI3;是否存在StarPCI9052板卡
LEADX,msg1
JMPInitPCI1
InitPCI3:
MOVDI,PCIBAR3;是否存在StarPCI9052板卡,存在则转PCI3初始化PCI卡MOVAH,0B1H;给出出错信息
MOVAL,09H;退出程序
INT1AH;读取该卡PCI9052基地址
JNCInitPCI4
LEADX,msg2;读地址出错时给出出错信息
JMPInitPCI1;退出程序
InitPCI4:
ANDCX,0FFFCH;屏蔽cx寄存器中最后两位的信息
MOVIO_Bit8_BaseAddress,CX;并保存其它位信息
RET;返回到CALLModifyAddress
InitPCIENDP
;将虚地址转化为物理地址
ModifyAddressPROCNEAR
ADDCOM_ADD,CX
ADDPA_ADD,CX
ADDPB_ADD,CX
ADDPC_ADD,CX
RET;8255芯片初始化
ModifyAddressENDP
Exit:
MOVAH,4CH
INT21H
ENDSTART
四.上机调试过程
1.硬件调试
首先要进行连线,我们要将PC机的数据总线插入与实验箱的对应接口中。
再在实验箱的相应位置插入PCI卡。
8255芯片的C口接逻辑开关,B口接LED的B口作段选,C口接LED的A口作位选。
8255芯片的CS片选信号线接PCI卡上的CS0,,8255芯片A0、A1接在PCI卡的A0、A1上。
这些连线不可随意连接,它的连接都有一定的根据和需要,所以要注意不能连错了。
在实验之前我们在进行调试,由C口在开关处置数,然后观察数码管显示的数据是否与初始状态的数相对应,或者是否有数据显示,如果数据显示正确的话,表示所接的硬件连线是正确的,可以正常使用了;否则表示接线有问题,需要进行相应改正,直至能正常使用。
2.软件调试
在此部分,我们知道程序分为,8255初始化部分,读入开关量部分和显示出数字量部分。
在实验前我们要做充分的准备,写出设计思路,画出程序流程图,然后编写正确的汇编程序,最后在与实验箱配套的集成环境下调试程序,当我们的程序编译链接通过后,便可以准备联机调试。
在调试过程中如果发现有错误,则要返回程序中进行修改,完成后再次编译和链接,就这样的重复进行,直到没有出现编译错误之后就可以运行了。
运行的时候也有可能出现问题,比如对寄存器的使用不合法,程序的结构出现问题,或者是对于寄存器的重复使用导致数据混乱,循环不能正常的结束,以及死循环等问题。
要解决这些问题就要对汇编有深入的理解,我们尽量使用结构简单的循环,分布编写程序,这样有助于我们程序的正确性,最后添加注释出可以减少问题的出现。
3.联机调试
当软件和硬件都调试成功后,我们就要把二者连接起来调试,称之为联机调试,调试正确所得的结果就是程序设计的最终结果了。
由于各个部件都单独调试正常,如果出现的结果和理论的有所不同,那么就要分析是硬件的问题还是软件的问题,并对相应的地方做出改动。
首先将实验箱总电源开关打开,打开PC机上的集成软件。
编译程序,编译通过后,单步调试,同时观察并记录相关现象,以及各寄存器中值的变化。
这样有利于我们发现错误并易于我们的修改。
4.调试的结果及问题的提出
1)调试结果
我们利用二进置逻辑开关来置数,分4次进行置数,每次可置4位二进制数据。
以8位逻辑开关的低4位设置数据,第5位表示是否置入新的16位的二进制数据,6、7位设置数据对应数码管的位置。
数据设置好后将第八位开关置1,使8255A可以从C口读入数据,LED显示器上会在相应位显示对应10进制的字型码,在此后当我们把第8位的开关再打到0时,我们会发现此时显示的是对应的16进制数。
我们可循环再置另16位二进制数据。
全速运行后,可以观测到数码管显示的数据。
根据程序的设置,可以在全速运行时任意改变数据。
2)问题的提出
(1)调试过程中LED没有反应?
解决办法:
检查PCI卡的位置有没有插错,再检查8255端口连线是否出错,C口接逻辑开关,B口作段选,A口作位选。
在最后发现是由于粗心把连线接错位了,当把连线接正确后LED就有显示了。
(2)LED显示器显示全为暗红色8字型,几乎不能辨认?
解决办法:
在程序运行的过程中我们没有意识到指令运行的速度是很快的,所以导致新旧数据有重影,就是说前一次显示数据时为亮的二极管没有显示结束,导致新显示的数据看不清楚。
在老师的指导下修改了程序,在每次输出段选和位选之前加禁止显示的指令movdx,PA_ADDmoval,0ffhoutdx,al使LED显示器显示为全灭,这样再显示数据时会比较清楚,不会有重影出现了,显示也比较清淅。
(3)LED显示时比较暗淡,数据显示的不清楚?
解决办法:
增大了延时时间,设置pushcx;movcx,10h,后改为100h,现象比较明显,显示的数据很清淅。
(4)如何将二进制数对应的10进制数值和16进制值数值都显示,并且为交替显示?
解决办法:
在程序中做了一点修改,在PC7为0的时候,我们不是什么都不做,而是在LED上显示begin单元的内容,即它对应的16进制数。
五、设计总结及问题讨论
1.总结
在本次课程设计中,题目是数字二进制编码器,实现的是不同进制数字值的转换。
完成此次课程设计我用到了逻辑开关,8255和LED等芯片,其中10进制数的转换和16进制数的转换通过汇编程序实现。
在课程设计结果中,逻辑开关的最高位有着非常重要的作用。
当分4次输入不同位置上的4位数据时,逻辑开关的最高位为1,则表示置数,此时LED上显示的是它对应的10进制数;而再次将逻辑开关的最高位置为0时,LED上显示的就是它对变的16进制数,也就是说通过最高位的切换来完成一个二进制数同时转换为10进制数和16进制数,并交替显示。
2.问题讨论
在调试的过程中,刚开始的时候LED没有反应,在检查过后发现原来是三个端口的连线接错了,当把线重新接好之后就行了。
开始时候LED显示器显示全为暗红色8字型,这是由于前一次显示数据时为亮的二极管没有显示结束,导致新显示的数据看不清楚。
在老师的指导下修改了程序,最后程序终于调试成功。
3.体会与建议
在课程设计的过程中我学会了微机原理的一些应用思想,设计思路,加深的对芯片功能与技术参数等的理解,这不仅巩固了我的微机方面的知识,也让我学到了许多相关的其它知识,这对我来说非常受用,还有一个大的体会就是课程设计也提高了我的思考和解决问题,以及动手的能力。
此次课程设计是数字二进制编码器的实现,不仅用到了硬件方面的知识,又用到了软件方面的知识,我更深入的了解了8255芯片的功能,熟悉了它的使用方法,对LED显示器也有了比较深入的对其构造及功能的了解。
这对于我们计算机学科的学生来说,这是非常有用的。
由于使用集成的实验箱,使得本实验减少了很多复杂的连线,不同功能的芯片也使编程实现变得简单,减少了解决问题需要的时间。
总之这是学习计算机基础且典型的综合应用型的设计。
此次课程设计让我明白,要做好一件事要细心,有耐心,有好奇心和同学之间的有效合作以及向老师的请教都是不可缺少的,要将书本知识与实际操作紧密联系起来,提高我们的动手能力,在实践中更好的发现和解决问题,还有就是不懂得一定要善问,自己独立思考也很重要。
设计者:
程苏秦
完成时间:
2009年2月