微机原理习题 1.docx
《微机原理习题 1.docx》由会员分享,可在线阅读,更多相关《微机原理习题 1.docx(18页珍藏版)》请在冰豆网上搜索。
微机原理习题1
1、设8255A得A口、B口、C口与控制字寄存器得端口地址分别为80H、82H、84H与86H。
要求A口工作在方式0输出,B口工作在方式0输入,C口高4位输入,低4位输出,试编写8255A得初始化程序。
MOVAL,10001010B;方式控制字
OUT86H,AL
2、8255A得A口、B口、C口与控制字寄存器得端口地址分别为80H、82H、84H与86H,要求PC4输出高电平,PC5输出低电平,PC6输出一个正脉冲,试写出完成这些功能得指令序列。
MOVAL,00001001B;PC4输出高电平
OUT86H,AL
MOVAL,00001010B;PC5输出低电平
OUT86H,AL
MOVAL,000001100B;PC6先输出低电平
OUT86H,AL
MOVAL,00001101B;PC6再输出高电平
OUT86H,AL
MOVAL,00001100B;PC6再输出低电平,形成一个正脉冲
OUT86H,AL
3、8255A得口地址为80H~83H,8253得口地址为84H~87H,
(1)若A口接8个开关K7~K0,B口接8个指示灯LED7~LED0,当开关合上时相应得
指示灯亮,断开时灯灭,要求每隔0、5s检测一次开关状态,并在LED上显示出来,试画出
硬件连线图,编写实现这种功能得程序。
(2)若把接在端口A上得开关去掉,要求接在端口B上得指示灯轮流熄灭,每只灯熄灭1
秒钟,请编程实现这种功能。
答:
(1)8255A:
A口输入,B口输出
8253:
2MHz/2Hz=1000000
通道0工作于方式2,取N0=1000
通道1工作于方式0,取N1=999,即得OUT1每0、5秒中断一次。
本题用8253定时中断,中断处理时检测开关状态,并点亮相应得LED。
假设8259A已初始化,主程序如下:
MOVAX,SEGINTR;形成中断矢量表
MOVDS,AX
MOVDX,OFFSETINTR
MOVAL,N
MOVAH,25H
INT21H
MOVAL,10010000B;8255初始化
OUT83H,AL
MOVAL,00110101B;通道0方式2,BCD计数
OUT87H,AL
MOVAL,00H;置初值1000
OUT84H,AL
MOVAL,10H
OUT84H,AL
MOVAL,01110001B;通道1方式0,BCD计数
OUT87H,AL
MOVAL,99H;置初值999
OUT85H,AL
MOVAL,09H
OUT85H,AL
STI
AGAIN:
HLT
JMPAGAIN
中断服务程序:
INTR:
PUSHAX
STI
INAL,80H;检测开关,合上为0
NOTAL;取反
OUT81H,AL;点亮相应LED(合上)
MOVAL,01110001B;通道1方式0,BCD计数
OUT87H,AL
MOVAL,99H;置初值999
OUT85H,AL
MOVAL,09H
OUT85H,AL
CLI
MOVAL,20H;普通EOI命令
OUT20H,AL
POPAX
IRET
2)8255A:
B口输出
8253:
通道0工作于方式2,取N0=2000
通道1工作于方式3,取N1=1000,即得OUT1频率为1Hz(周期为1秒)得方波,
接到8259A得IRi,边沿触发中断请求。
主程序如下:
MOVAX,SEGINTR;形成中断矢量表
MOVDS,AX
MOVDX,OFFSETINTR
MOVAL,N
MOVAH,25H
INT21H
MOVAL,10000000B;8255初始化
OUT83H,AL
MOVAL,00110101B;通道0方式2,BCD计数
OUT87H,AL
MOVAL,00H;置初值2000
OUT84H,AL
MOVAL,20H
OUT84H,AL
MOVAL,01110111B;通道1方式3,BCD计数
OUT87H,AL
MOVAL,00H;置初值1000
OUT85H,AL
MOVAL,10H
OUT85H,AL
MOVAL,0FEH;熄灭LED0
OUT81H,AL
STI
GOON:
HLT
JMP
中断服务程序如下:
INTR:
PUSHAX
STI
ROLAL,1;AL左循环移位1位
OUT81H,AL;点亮下一位LED
CLI
MOVAL,20H
OUT20H,AL;普通EOI结束命令
POPAX
IRET
硬件连接图如下:
4、设8255A得口地址为300H~303H,A口接4个开关K3~K0,B口接一个七段LED显示器,用来显示4个开关所拨通得16进制数字0~F,开关都合上时,显示0,都断开时显示F,每隔2秒钟检测一次,试画出硬件连线图,并编写实现这种功能得程序。
与上题思路相同
8255A:
A口方式0输入,B口方式0输出,端口地址300H~303H
8253:
用于2秒定时,端口地址为304H~307H
2MHz/0、5Hz=4000000
通道0工作于方式2,取N0=4000
通道1工作于方式0,取N1=999,即得OUT1每2秒中断一次。
本题用8253定时中断,中断处理时检测开关状态,并点亮相应得LED。
假设8259A已初始化,主程序如下:
TABLEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H;七段码表格
DB7FH,6FH,77H,7CH,39H,5EH,79H,71H
MOVAX,SEGINTR;形成中断矢量表
MOVDS,AX
MOVDX,OFFSETINTR
MOVAL,N
MOVAH,25H
INT21H
MOVAL,10010000B;8255初始化
MOVDX,303H
OUTDX,AL
MOVAL,00110101B;8253初始化,通道0方式2,BCD计数
MOVDX,307H
OUTDX,AL
MOVAL,00H;置初值4000H
MOVDX,304H
OUTDX,AL
MOVAL,40H
OUTDX,AL
MOVAL,01110001B;通道1方式0,BCD计数
MOVDX,307H
OUTDX,AL
MOVAL,99H;置初值999
MOVDX,305H
OUTDX,AL
MOVAL,09H
OUTDX,AL
STI
AGAIN:
HLT
JMPAGAIN
中断服务程序:
INTR:
PUSHAX
STI
MOVDX,300H
INAL,DX;检测开关,合上为0
ANDAL,0FH;只保留低4位PA3~PA0
MOVBX,OFFSETTABLE
XLATTABLE
MOVDX,301H
OUTDX,AL;点亮LED,显示数字
MOVAL,01110001B;通道1方式0,BCD计数
MOVDX,307H
OUTDX,AL
MOVAL,99H;置初值999
MOVDX,305H
OUTDX,AL
MOVAL,09H
OUTDX,AL
CLI
MOVAL,20H;普通EOI命令
OUT20H,AL
POPAX
IRET
5、利用8255A与ADC0809等芯片设计PC机上得A/D转换卡,设8255A得口地址为3C0H~
3C3H,要求对8个通道各采集1个数据,存放到数据段中以D_BUF为始址得缓冲器中,
试完成以下工作:
(1)画出硬件连接图。
(2)编写完成上述功能得程序。
(2)AD_SUBPROCNEAR
MOVCX,8;CX作数据计数器
MOVBL,00H;模拟通道号存在BL中
LEADI,D_BUF;缓冲区
NEXT_IN:
MOVDX,3C2H;8255A端口C地址
MOVAL,BL
OUTDX,AL;输出通道号
MOVDX,3C3H;指向控制口
MOVAL,00000111B;PC3置1
OUTDX,AL;送出开始启动信号
NOP;延时
NOP
NOP
MOVAL,00000110B;PC3复位
OUTDX,AL;送出结束启动信号
MOVDX,3C2H;C口
NO_CONV:
INAL,DX;读入C口内容
TESTAL,80H;PC7,EOC信号
JNZNO_CONV;PC7=1,未开始转换,等待
NO_EOC:
INAL,DX;PC7=0,已启动转换
TESTAL,80H;再查PC7
JZNO_EOC;PC7=0,转换未结束,等待
MOVDX,3C0H;PC7=1,转换结束,DX指向A口
INAL,DX;读入数据
MOV[DI],AL;存入缓冲区
INCDI
INCBL;指向下个通道
LOOPNEXT_IN
RET
AD_SUBENDP
6、试利用ADC0809,8253与8259A等芯片设计8通道A/D转换电路。
系统中用8253作定时器,采用中断方式控制采样率,采样率为500Hz。
设8253得通道0输入时钟脉冲为2MHz,输出端OUT0接8259A得IR2,8253得口地址为300H~303H,8259A得口地址为304H与305H,ADC0809得8个输入通道得口地址为308H~30FH,查询EOC信号与状态口地址为306H,ADC0809得输入时钟频率为640KHz,A/D转换得结果依次存入数据段中以BUFFER为始址得内存中,从通道0开始先存入各通道得第一个数据,再存放第二个数据,采集10秒钟后停止工作。
要求:
(1)画出硬件连线图,可以不画具体得译码电路。
(2)编写8253,8259A(只需写入中断屏蔽字)得初始化程序及采集8路模拟信号得中断服务程序。
答:
(1)
(2)因为8253得时钟输入频率为2MHz,而要求得采样频率f=500Hz,即用8253定时,每隔2ms中断一次,因此8253得分频次数(时间常数)N=2MHz/500Hz=4000。
采集10秒钟,共采集10s/2ms=5000次,即8253中断次数为5000次。
DATASEGMENT
BUFFERDB8*5000DUP(?
)
DATAENDS
;数据采集子程序
8253初始化编程,通道0,方式2,先写低字节,后高字节,BCD计数,时间常数4000
MOVDX,303H
MOVAL,00110101B
OUTDX,AL
MOVDX,300H;通道0
MOVAX,4000H;时间常数
OUTDX,AL
MOVAL,AH
OUTDX,AL
;8259A设置屏蔽字,仅允许8259A得IR2与键盘中断,其余禁止
MOVAL,11111001B;屏蔽字
MOVDX,305H
OUTDX,AL;向屏蔽寄存器输出屏蔽字
;设置数据缓冲区始址到SI中,计数初值到BX中,等待中断,每通道采完5000次后结束
中断
MOVSI,OFFSETBUFFER;SI指向数据缓冲区
MOVBX,5000
STI;开中断
AGAIN:
CMPBX,0
JNZAGAIN
MOVAL,11111101B;采集完,禁止IR2中断
MOVDX,305H
OUTDX,AL
MOVAH,4CH;退出中断
INT21H
;中断服务程序,对每个通道均采集一个数据,存入BUFFER
ADINTPROCNEAR
MOVCX,0008H;设置通道计数器初值
MOVDX,308H;DX指向ADC通道0
NEXT:
OUTDX,AL;启动一次转换
PUSHDX;保存通道号
MOVDX,306H;DX指向状态口
POLL:
INAL,DX;读入EOC状态
TESTAL,80H;EOC(D7)=0?
即开始转换了
JNZPOLL;非0,循环等待
NO_END:
INAL,DX;EOC=0,开始转换
TESTAL,80H;再查EOC就是否为1
JZNO_END;EOC=0,等待转换结束
POPDX;EOC=1,恢复通道地址
INAL,DX;读取结果
MOV[SI],AL;存储到缓冲区
INCDX;DX指向下一个通道
INCSI;地址指针指向下一个缓冲单元
LOOPNEXT;通道计数器减1,结果非0则循环
DECBX;为0,缓冲数据计数器减1
MOVAL,20H
MOVDX,304H
OUTDX,AL
STI;开中断
IRET
ADINTENDP
7、利用8255A与AD574A设计数据采集系统,输入模拟电压为0~+10V,若每秒采集100
个数据,转换后得数据字存放在W_BUF开始得缓冲器中,低字节在前,高字节在后,采满
16K字节得数据后停止工作,要求:
(1)画出硬件连线图。
(2)编写启动AD574A工作与读取转换结果得子程序。
(2)16K字节得数据共需要8K=8192次采集
;8255A得端口地址
PORT_AEQU0F0H;A口地址
PORT_BEQU0F1H;B口地址
PORT_CEQU0F2H;C口地址
PORT_CTLEQU0F3H;控制口地址
;8255A控制字:
A口与B口工作于方式0,A口、B口与C口得上半部分为输入,C
口得下半部分为输出
LEADI,W_BUF
MOVCX,8192
AD_CONT:
MOVAL,10011010B;方式字
OUTPORT_CTL,AL;输出方式字
;启动A/D转换
MOVAL,00H
OUTPORT_C,AL;使CS,CE,R/C均为低
NOP;延时
NOP
MOVAL,04H
OUTPORT_C,AL;使CE=1,启动A/D转换
NOP
NOP
MOVAL,03H
OUTPORT_C,AL;使CE=0,CS=R/C=1,结束启动状态
READ_STS:
INAL,PORT_C;读STS状态
TESTAL,80H;转换(STS=0)完了吗?
JNZREAD_STS;否,则循环等待
;转换完成,启动读操作
MOVAL,01H
OUTPORT_C,AL;使CS=0,CE=0,R/C=1
NOP
MOVAL,05H;使CE=1,CS=0,R/C=1
OUTPORT_C,AL
;读取数据,存入BX中
INAL,PORT_A;读入高4位数据
ANDAL,0FH
MOVBH,AL;存入BH
INAL,PORT_B;读入低8位
MOVBL,AL;存入BL
MOV[DI],BX;存入缓冲区
INCDI
INCDI
;结束读操作
MOVAL,03H;使CE=0,CS=1
OUTPORT_C,AL;结束读操作
CALLDELAY_10MS;延时10个毫秒
LOOPAD_CONT