数字二进制编码器Word格式.docx
《数字二进制编码器Word格式.docx》由会员分享,可在线阅读,更多相关《数字二进制编码器Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
我们将利用学过的汇编知识,通过编程来实现二进制数到十六进制字型码的转化,以及到有正负之分的十进制数的转化。
显示编码设备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上。
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)主程序
2)TDSIP子程序:
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
next:
movbx,offsetBEGIN;
BX存放BEGIN单元的偏移地址
低位不变,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
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
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口地址进行位选
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
moval,0
loop3:
movbyteptr[bx],al
incbx
looploop3
popax
popcx
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月