微机原理与接口实验系列一、IO端口扩展(8255)二、定时器/计数器(8253)三、串口通信(8251)四、模数转换(ADC0809)五、数模转换(DAC0832)六、液晶屏显示(LCD1602)七、中断控制器(8259)赖晓铮博士华南理工大学laixz@scut.edu.cnQQ:68046508(三)串口通信(8251)实验实验内容:●构建一个“CPU+8253+8251”的微型计算机系统,其中8253定时器为8251芯片提供工作时钟。编写机器语言程序,令CPU通过8251芯片实现与外设(虚拟端口)的串行通信。实验目的:●了解串行通信的基本原理,比较串行通信与并行通信的异同及各自的优势。●掌握串行接口芯片8251的编程方法,通过8251芯片实现CPU与外设的串行通信。微程序版“CPU+8251”电路图初始化过程1)时钟信号CLK接手动开关MANUAL,启动仿真,使能复位信号#RESET=0;2)手动按钮MANUAL开关“010”,然后令信号#RESET=1.注:初始化完成后,若时钟信号CLK继续接开关MANUAL,则CPU进入手动模式,手动MANUAL开关,生成时钟信号CLK,程序单步执行;若时钟信号CLK接信号源AUTO-CLK(主频10Hz),则CPU进入自动模式,程序自动运行,直到HLT指令的“断点”处暂停。重启过程(跳出“断点”)1)时钟信号CLK接开关MANUAL,手动令复位信号端#RESET的状态“101”变化,即重启完成,跳出“断点”继续执行。注:跳出“断点”后,CPU进入HLT指令的后续下一条指令的取指周期。8251应用电路图可编程串行接口芯片8251A结构图#CS#RD#WRC/#D功能0010CPU从8251A读数据0100CPU向8251A写数据0011CPU向8251A读状态0101CPU向8251A写控制字1XXX禁止访问,总线D7~D0接口呈现高阻态8251A读/写控制逻辑8251A同步通信格式8251A异步通信格式8251A芯片工作流程图8251A芯片状态字格式8251A芯片方式控制字格式8251A芯片操作控制字格式实验步骤:1)8251A数据发送测试程序UART_TX.asm存放在实验4.3项目的子文件夹test里,其功能实现了CPU从8251A芯片的串行通信接口自动发送一段ASCII码字符序列“HELLO!”,并且在外接的虚拟串口终端屏幕上显示。具体代码如后页所示。2)编译、烧写、自动运行上述UART_TX源程序,在程序自动运行过程中,观察虚拟串口终端屏幕的显示。(编译和烧写asm文件的方法参见“2.6存储器实验:ROM批量导入数据”)3)自行设计所要发送的字符序列,修改并自动执行UART_TX源程序。在运行过程中观察虚拟串口终端屏幕的显示。4)若需要把本实验改成8251A数据接收测试实验,请问硬件电路和程序怎么修改?汇编助记符注释(M地址:机器指令)JMP08H00H:0001000001H:0000100048H“H”02H:0100100045H“E”03H:010001014CH“L”04H:010011004CH“L”05H:010011004FH“O”06H:0100111121H“!”07H:00100001SETR3,01HR3用来检测8253状态字08H:0011110009H:00000001SETR2,02HR2用以记录发送字符地址发送字符地址初始化[02H]0AH:001110000BH:00000010UART_TX汇编助记符注释(M地址:机器指令)SETR0,06HR0用作待发送字符的计数器总共6个数据0CH:001100000DH:00000110SETR1,A6H;8253计数器设置R1用于外设端口读写8253地址[1010xxxxH],控制口A1A0=110EH:001101000FH:10100110OUTAR1,PORT0选择8253的控制寄存器10H:01010110SETR1,16H控制字:选计数器0/只读写低8位数据/方式3(方波)/二进制11H:0011010012H:00010110OUTR1,PORT0输入8253控制字后OUT端应该拉高13H:01010100SETR1,A0H0通道计数寄存器地址打入R18253地址[1010xxxxH]控制口A1A0=0014H:0011010015H:10100000OUTAR1,PORT0选择8253的0通道计数寄存器16H:01010110UART_TX汇编助记符注释(M地址:机器指令)SETR1,0DH计数初始值N=13,CLK=125KHZ,计数时长8us*13=104us,输出9600HZ方波17H:0011010018H:00001101OUTR1,PORT0输入初始值N,做N个CLK周期循环方波19H:01010100HLT8253芯片配置结束,观测示波器界面波形1AH:00000001SETR1,F8H;8251串口设置8251芯片复位8251地址[1111xxxxH]RESET=11BH:001101001CH:11111000OUTAR1,PORT0选择8251的端口1DH:01010110SETR1,F2H8251地址[1111xxxxH]控制字1EH:001101001FH:11110010OUTAR1,PORT0选择8251控制字状态工作20H:01010110SETR1,4DH方式控制字:1个停止位/无校验/数据8位/异步x121H:0011010022H:01001101UART_TX汇编助记符注释(M地址:机器指令)OUTR1,PORT0输入8251方式控制字23H:01010100SETR1,15H;若循环发送下一个字符,则跳转到此处操作控制字:清出错标志/接收允许/发送允许24H:0011010025H:00010101OUTR1,PORT0输入8251操作控制字26H:01010100SETR1,F0H8251地址[1111xxxxH]数据27H:0011010028H:11110000OUTAR1,PORT0选择8251数据状态工作29H:01010110POPR1,[R2]把待发送数据从堆栈弹出,赋值R12AH:10000110INCR2堆栈指针+12BH:00101000OUTR1,PORT0输入8251数据2CH:01010100SETR1,F2H8251地址[1111xxxxH]控制字2DH:001101002EH:11110010UART_TX汇编助记符注释(M地址:机器指令)OUTAR1,PORT0选择8251控制字状态工作2FH:01010110INR1,PORT0读取8251状态字30H:01000100ANDR1,R3检测状态字最后一位,“1”则发送成功,“0”则失败31H:11100111JZ30H发射尚未成功,继续读取8251状态字循环检测32H:0001100033H:00110000DECR0待发送字符计数器递减“-1”34H:00100001NOP断点:单个字符发送完成后观察串口输出35H:00000000JZ3AH待发送字符计数器为0,结束发送36H:0001100037H:00111010JMP24H状态字检测发送成功,继续发送下一个字符38H:0001000039H:00100100HLT3AH:00000001UART_TX思考题:●请把本实验的微程序版“CPU+8253+8251”电路改成硬布线版和流水线版“CPU+8253+8251”电路,并且运行本实验步骤所示的8251发送数据测试程序。请问上述程序在硬布线或流水线版本中需要修改么?若需要,请修改并测试。(三)串口通信(8251)实验附录:CPU指令集(OP码表)OP码(I7I6I5I4)指令助记符OP码(I7I6I5I4)指令助记符0111IRET1111OR/ORI0110MOV1110AND/ANDI0101OUT/OUTA1101ADD/ADDI0100IN1100SUB/SUBI0011SET1011XOR/XORI0010SOP(INC/DEC/NOT/THR)1010SHT(RLC/LLC/RRC/LRC)0001JMP/JMPR/Jx/JxR1001STO/PUSH0000NOP/HLT1000LAD/POP一、系统指令:汇编语言功能I7I6I5I4I3I2I1I0NOP;无操作(延时4个T)00000/0x/0HLT;停机(断点)00000/0x/1IRET;中断返回BP_PCPC;BP_PSWPSW01110/0x/x汇编语言注释I7I6I5I4I3I2I1I0MOVRA,RB;(RB)RA0110RARBSETRA,IMM;IMMRA0011RAx/xIMM二、寄存器及I/O操作指令:汇编语言功能I7I6I5I4I3I2I1I0INRA,PORTx;(PORTx)RA0100RAPORTxOUTRA,PORTx;(RA)PORTx0101RA0/PORTxOUTARA,PORTx;(RA)PORTx0101RA1/PORTx汇编语言功能I7I6I5I4I3I2I1I0LADRA,[ADDR];[ADDR]RA1000RA0/0ADDRPOPRA,[RB];[RB]RA1000RARBSTORA,[ADDR];(RA)[ADDR]1001RA0/0ADDRPUSHRA,[RB];(RA)[RB]1001RARB三、存储器及堆栈操作指令:汇编语言功能I7I6I5I4I3I2I1I0JMPADDR;ADDRPC00010/00/0ADDRJMPRRB;(RB)PC00010/0RBJCADDR;IFCF=1,ADDRPC00010/10/0ADDRJCRRB;IFCF=1,(RB)PC00010/1RBJZADDR;IFZF=1,ADDRPC00011/00/0ADDRJZRRB;IFZF=1,(RB)PC00011/0RBJSADDR;IFSF=1,ADDRPC00011/10/0ADDRJSRRB;IFSF=1,(RB)PC00011/1RB四、跳转系列指令:五、算术逻辑运算指令:汇编语言功能I7I6I5I4I3I2I1I0RLCRA;(RA)右逻辑移位1010RA0/0LLCRA;(RA)左逻辑移位1010RA1/0RRCRA;(RA)右循环移位1010RA0/1LRCRA;(RA)左循环移位1010RA1/1汇编语言功能I7I6I5I4I3I2I1I0INCRA;(RA)+1RA0010RA0/0DECRA;(RA)-1RA0010RA0/1NOTRA;#(RA)RA0010RA1/0THRRA;(RA)RA0010RA1/1五、算术逻辑运算指令:汇编语言格式功能I7I6I5I4I3I2I1I0ADDRA,RB;(RA)+(RB)RA1101RARBADDIRA,IMM;(RA)+IMMRA1101RA0/0IMMSUBRA,RB;(RA)-(RB)RA1100RARBSUBIRA,IMM;(RA)-IMMRA1100RA0/0IMMANDRA,RB;(RA)∧(RB)RA1110RARBANDIRA,IMM;(RA)∧IMMRA1110RA0/0IMMORRA.RB;(RA)∨(RB)RA1111RARBORIRA,IMM;(RA)∨IMMRA1111RA0/0IMMXORRA,RB;(RA)⊕(RB)RA1011RARBXORIRA,IMM;(RA)⊕IMMRA1011RA0/0IMM