您好,欢迎访问三七文档
1.设8255A的A口、B口、C口和控制字寄存器的端口地址分别为80H、82H、84H和86H。要求A口工作在方式0输出,B口工作在方式0输入,C口高4位输入,低4位输出,试编写8255A的初始化程序。MOVAL,10001010B;方式控制字OUT86H,AL2.8255A的A口、B口、C口和控制字寄存器的端口地址分别为80H、82H、84H和86H,要求PC4输出高电平,PC5输出低电平,PC6输出一个正脉冲,试写出完成这些功能的指令序列。MOVAL,00001001B;PC4输出高电平OUT86H,ALMOVAL,00001010B;PC5输出低电平OUT86H,ALMOVAL,000001100B;PC6先输出低电平OUT86H,ALMOVAL,00001101B;PC6再输出高电平OUT86H,ALMOVAL,00001100B;PC6再输出低电平,形成一个正脉冲OUT86H,AL3.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,AXMOVDX,OFFSETINTRMOVAL,NMOVAH,25HINT21HMOVAL,10010000B;8255初始化OUT83H,ALMOVAL,00110101B;通道0方式2,BCD计数OUT87H,ALMOVAL,00H;置初值1000OUT84H,ALMOVAL,10HOUT84H,ALMOVAL,01110001B;通道1方式0,BCD计数OUT87H,ALMOVAL,99H;置初值999OUT85H,ALMOVAL,09HOUT85H,ALSTIAGAIN:HLTJMPAGAIN中断服务程序:INTR:PUSHAXSTIINAL,80H;检测开关,合上为0NOTAL;取反OUT81H,AL;点亮相应LED(合上)MOVAL,01110001B;通道1方式0,BCD计数OUT87H,ALMOVAL,99H;置初值999OUT85H,ALMOVAL,09HOUT85H,ALCLIMOVAL,20H;普通EOI命令OUT20H,ALPOPAXIRET2)8255A:B口输出8253:通道0工作于方式2,取N0=2000通道1工作于方式3,取N1=1000,即得OUT1频率为1Hz(周期为1秒)的方波,接到8259A的IRi,边沿触发中断请求。主程序如下:MOVAX,SEGINTR;形成中断矢量表MOVDS,AXMOVDX,OFFSETINTRMOVAL,NMOVAH,25HINT21HMOVAL,10000000B;8255初始化OUT83H,ALMOVAL,00110101B;通道0方式2,BCD计数OUT87H,ALMOVAL,00H;置初值2000OUT84H,ALMOVAL,20HOUT84H,ALMOVAL,01110111B;通道1方式3,BCD计数OUT87H,ALMOVAL,00H;置初值1000OUT85H,ALMOVAL,10HOUT85H,ALMOVAL,0FEH;熄灭LED0OUT81H,ALSTIGOON:HLTJMP中断服务程序如下:INTR:PUSHAXSTIROLAL,1;AL左循环移位1位OUT81H,AL;点亮下一位LEDCLIMOVAL,20HOUT20H,AL;普通EOI结束命令POPAXIRET硬件连接图如下:4.设8255A的口地址为300H~303H,A口接4个开关K3~K0,B口接一个七段LED显示器,用来显示4个开关所拨通的16进制数字0~F,开关都合上时,显示0,都断开时显示F,每隔2秒钟检测一次,试画出硬件连线图,并编写实现这种功能的程序。与上题思路相同8255A:A口方式0输入,B口方式0输出,端口地址300H~303H8253:用于2秒定时,端口地址为304H~307H2MHz/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,71HMOVAX,SEGINTR;形成中断矢量表MOVDS,AXMOVDX,OFFSETINTRMOVAL,NMOVAH,25HINT21HMOVAL,10010000B;8255初始化MOVDX,303HOUTDX,ALMOVAL,00110101B;8253初始化,通道0方式2,BCD计数MOVDX,307HOUTDX,ALMOVAL,00H;置初值4000HMOVDX,304HOUTDX,ALMOVAL,40HOUTDX,ALMOVAL,01110001B;通道1方式0,BCD计数MOVDX,307HOUTDX,ALMOVAL,99H;置初值999MOVDX,305HOUTDX,ALMOVAL,09HOUTDX,ALSTIAGAIN:HLTJMPAGAIN中断服务程序:INTR:PUSHAXSTIMOVDX,300HINAL,DX;检测开关,合上为0ANDAL,0FH;只保留低4位PA3~PA0MOVBX,OFFSETTABLEXLATTABLEMOVDX,301HOUTDX,AL;点亮LED,显示数字MOVAL,01110001B;通道1方式0,BCD计数MOVDX,307HOUTDX,ALMOVAL,99H;置初值999MOVDX,305HOUTDX,ALMOVAL,09HOUTDX,ALCLIMOVAL,20H;普通EOI命令OUT20H,ALPOPAXIRET5.利用8255A和ADC0809等芯片设计PC机上的A/D转换卡,设8255A的口地址为3C0H~3C3H,要求对8个通道各采集1个数据,存放到数据段中以D_BUF为始址的缓冲器中,试完成以下工作:(1)画出硬件连接图。(2)编写完成上述功能的程序。(2)AD_SUBPROCNEARMOVCX,8;CX作数据计数器MOVBL,00H;模拟通道号存在BL中LEADI,D_BUF;缓冲区NEXT_IN:MOVDX,3C2H;8255A端口C地址MOVAL,BLOUTDX,AL;输出通道号MOVDX,3C3H;指向控制口MOVAL,00000111B;PC3置1OUTDX,AL;送出开始启动信号NOP;延时NOPNOPMOVAL,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;再查PC7JZNO_EOC;PC7=0,转换未结束,等待MOVDX,3C0H;PC7=1,转换结束,DX指向A口INAL,DX;读入数据MOV[DI],AL;存入缓冲区INCDIINCBL;指向下个通道LOOPNEXT_INRETAD_SUBENDP6.试利用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次。DATASEGMENTBUFFERDB8*5000DUP(?)DATAENDS;数据采集子程序8253初始化编程,通道0,方式2,先写低字节,后高字节,BCD计数,时间常数4000MOVDX,303HMOVAL,00110101BOUTDX,ALMOVDX,300H;通道0MOVAX,4000H;时间常数OUTDX,ALMOVAL,AHOUTDX,AL;8259A设置屏蔽字,仅允许8259A的IR2和键盘中断,其余禁止MOVAL,11111001B;屏蔽字MOVDX,305HOUTDX,AL;向屏蔽寄存器输出屏蔽字;设置数据缓冲区始址到SI中,计数初值到BX中,等待中断,每通道采完5000次后结束中断MOVSI,OFFSETBUFFER;SI指向数据缓冲区MOVBX,5000STI;开中断AGAIN:CMPBX,0JNZAGAINMOVAL,11111101B;采集完,禁止IR2中断MOVDX,305HOUTDX,ALMOVAH,4CH;退出中断INT21H;中断服务程序,对每个通道均采集一个数据,存入BUFFERADINTPROCNEARMOVCX,0008H;设置通道计数器初值MOVDX,308H;DX指向ADC通道0NEXT: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是否为1JZNO_END;EOC=0,等待转换结束POPDX;EOC=1,恢复通道地址INAL,DX;读取结果MOV[SI],AL;存储到缓冲区INCDX;DX指向下一个通道INCSI;地址指针指向下一个缓冲单元LOOPNEXT;通道计数器减1,结果非0则循环DECBX;为0,缓冲数据计数器减1MOVAL,20HMOVDX,304HOUTDX,ALSTI;开中断IRETADINTENDP7.利用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_BUFMOVCX,8192AD_CONT:MOVAL,10
本文标题:微机原理习题-1
链接地址:https://www.777doc.com/doc-4862489 .html