logo资料库

微机课设报告.doc

第1页 / 共17页
第2页 / 共17页
第3页 / 共17页
第4页 / 共17页
第5页 / 共17页
第6页 / 共17页
第7页 / 共17页
第8页 / 共17页
资料共17页,剩余部分请下载后查看
合肥工业大学 课程设计 课 程:微机原理与接口技术设计 专业班级: 学 姓 号: 名:
一、设计题目及要求: 【课题 7】利用 8251 实现串行口自发自收,并显示。 设计要求: 1. 按“E”键:清除数码管显示,并通过键盘输入四位十六进制数(说明:由于 E 和 F 键被占用,故此题中每位十六进制数仅从 0~D),同时显示在右侧四个数码 管上。 2. 按“F”键:执行串行发送,完成后在最右侧数码管上显示“P.”,并以 1 秒(注 意:必须通过硬件实 现)间隔闪烁 8 次。 3. 将经串口接收到的四位十六进制数转换为十进制数,若结果大于 9999,则在 数码管上显示“Error8”, 否则在右侧四个数码管上显示计算结果(十进制)。 二、设计思想: 本题目要求利用 8251A 来实现串行口自发自收,并且要显示出来。通过小组 成员的讨论并且分析题目,设计思想主要是通过 8255A 芯片、8251A 芯片和 8253 芯片三个芯片共同完成题目要求。具体要求与分析如下: 1. 按 E 键清零:首先需要从小键盘中的接受到 E 键按下,根据键盘的连接 原理通过 8255A 的 PC 口作为输入,PA 口和 PB 口作为数码管的输出。通过程序 不断判断是否有键按下和判断按下的键是否为 E 键来进行循环,此处用到汇编的 跳转指令。通过按行扫描的方式来进行判断。当检测到 E 键按下时,将数码管的 显示区 buffer 数据变为 FFH ,此时由于数码管低电平有效,则当由于 FFH 时,数 码管进行了清零操作。 2. 显示输入数据(0-D),由于题目要求 E 键和 F 键是作为清零和发送键, 所以需要对这两个键特殊扫描,即判断到这两个键时跳转到清零功能区和发送功 能区。将其余的键输入的数据输入后利用 8255A 芯片并行接受数据的功能和数码 码管显示的功能来进行显示输出。PA 口作为数据段的接受,而 PB 口来进行扫描 模式的。而判断有无闭合键则专门有判断有无闭合键子程序来实现功能。而 8255A 则是利用通道 1,方式 0 来进行初始化编程。 3. 按“F”键执行发送,题目要求执行串行发送,则是需要 8251A 芯片来进
行发送,在完成此功能过程中,我们利用先定义好的接受缓冲区 RECEIVE_BUFFER 来将数据从 8255A 中装入,分四次存入数据。当数据存入完成后,利用 8251A 芯片进行发送。将接受到的数据存入到发送缓冲区 SEND_BUFFER ,此时数据就 在此缓冲区中。将 8251A 芯片初始化为异步通信,一个停止位,偶校验和 8 个 数据位。由于 8251A 是串行发送,所以每次发送前还必须做判断是否可以接受, 可以接受则进行发送。 4. 每次发送的时候还要显示“P”,并且还需要闪烁 8 次,在实现此功能的 时候,需要利用到 8253A 芯片,其初始化为计数器 0,方式 3,利用方波计数器, 来进行技术,由于题目要求间隔 1 秒闪烁一次并且要用硬件实现,所以初始化就 必须要完成。“P”的实现只需要定义显示的数码管为 0CH,则能得到此要求。 5. 要求将接受到的 16 进制数据转换为 10 进制并在数码管上显示,首先需 要将 16 进制数据转换为 10 进制,由于发送接受的数据是串行数据,即每个字节 中只有一个有效位数据,还需要将其转换为 16 进制数据。方法是将在缓冲器接 受到的数据将后面两个字节数据进行或运算,将前面两个字节数据进行或运算, 然后分别作为 16 位数据的高低位,此时就收接受到真正的 16 位数据,然后将数 据进行除以 10 运算,将得到的余数放在 DX,商放在 AX 中,通过不断除商最后 测试得到 AX 为 0,即得到的商为 0 时停止除商,将每次得到的余数倒序显示出 来就可以得到 10 进制数显示。此时由于题目虽然是 16 进制显示十进制要求,但 相对于 CPU 来说,并不知道到底是 16 进制还是 10 进制数,所以此时的除 10 操 作并不是我们认为的 16 进制转 10 进制。 6. 最后要求当显示的数据大于 9999 时,显示出 ERROR8,我们在实现此功 能时候,首先将 ERROR8 作为一个要显示的数据存放在缓冲区中,当判断到显示 数据大于 9999 时,调用此数据直接输出显示即可。判断大于 9999 利用了当转换 后的数据要显示的时候不能将十进制数据在数码管上显示完,则跳到出错子程序 来显示错误。并不需要和 9999 数据做判断。只需要利用 10 进制位数与 4 个数码 管的作比较即可。在显示输出的 10 进制数据时,我们做了判断,即如果输出是 一位数,则在前面补三个 0 输出,两位数,则前面补两个 0 输出,三位数,则补 一个 0 到前面。如果是 4 位数,则直接输出,不需要补 0。 7. 在实现过程中还需要用到延时程序,数码管的控制和与寄存器中数据的 转换等程序编写。
三、功能流程图: 四、结果讨论: 经过一周多一点的时间,我们五个人完成了题目的功能,虽然从一开始的毫 无头绪到后来对题目进行逐渐分析和对题目开始的错误导向,经过多次改写代码 和电路调试,完成了题目要求。根据题目要求,将程序烧写到实验箱之后,数码 管显示全亮,按别的键不进行变化,按 E 键之后数码管全暗,此时表示清零完成。 然后输入四位数据,能够正常显示出来。然后点击 F 键,数码管显示“P”字样, 显示 8 次。然后显示转换成 10 进制数的结果,经过多次测试,显示结果与运算 结果一致。所以结果符合题目要求。主要存在不足是,只能进行一次发送数据, 发送完成后,不能进行清零操作,只能进行复位操作,重新开始操作。 实验实现的结果图如下: 初始化:
发送时闪烁“P”字样: 出错显示“ERROR8”: 五、数字签名 附录:实验代码:(完整的源程序) DISPLAY8:NEAR .MODEL TINY EXTRN COM_8255 EQU 0273H ;8255 控制口 PA_8255 EQU 0270H
PB_8255 EQU 0271H PC_8255 EQU 0272H STAT_8251 EQU 0241H ;控制字或状态字;8251 DATA_ADDR EQU 0240H COM_ADDR EQU 0253H T0_ADDR EQU 0250H T1_ADDR EQU 0251H W_8253_T0 EQU 0250H ;计数器 0 地址 W_8253_C EQU 0253H ;控制字 .STACK 512 ;读写数据 ;8253 .DATA BUFFER DB 8 DUP(?) ERROR8 SEG_TAB ;8 个字节显示缓冲区 DB 86H, 88H, 88H, 0C0H, 88H, 80H DB 0C0H, 0F9H, 0A4H, 0B0H, 099H, 092H, 082H, 0F8H DB 080H, 090H, 088H, 083H, 0C6H, 0A1H, 086H, 08EH, 0FFH ;ERROR8 RECEIVE_BUFFER SEND_BUFFER .CODE DB 10 DUP(0) ;接受缓冲器 DB 10 DUP(0) ;发送缓冲器 START: MOV AX,@DATA MOV DS,AX MOV ES,AX NOP CLD MOV DX,COM_8255 MOV AL,89H ;10001001 OUT DX,AL LEA DI,BUFFER MOV AL,0FFH MOV CX,08H REP STOSB CALL DIR WAITE: CALL KEYI;清零 CMP AL,0EH JNZ WAITE LEA DI,BUFFER MOV AL,10H MOV CX,08H REP STOSB CALL DIR MAIN3: LEA DI,BUFFER MAIN2: CALL KEYI ;0->DF, 地址自动递增 ;PA、PB 输出,PC 输入 ;初始化 BUFFER 为 8 个 FF ;初始化 BUFFER 为
;等待 F 键输入 CX,4 BX,0 ;分四次 CMPAL,0EH;按 E 继续清零,别的数据继续执行,分 4 次读入 JZ MAIN2 CMPAL,0FH JZ MAIN2 STOSB CALL DIR CMP DI,OFFSET BUFFER+4 JNZ MAIN2 WAIT_F: CALL KEYI;fffffffffffff CMPAL,15 JNZ WAIT_F ;键入 F 键后对 8251 发送 4 位 16 进制数,发送的数据存到 "RECEIVE_BUFFER" MOV MOV MOVE: MOV AL,[BUFFER+BX] MOV [RECEIVE_BUFFER+BX],AL INC BX LOOP MOVE CALL INIT_8253 CALL INIT_8251 SR0: LEA SI,RECEIVE_BUFFER LEA DI,SEND_BUFFER MOV CX,4 SR1: MOV AH,[SI] CALL SEND CALL RECIVE MOV [DI],AH ;接收到的数据存目的地址 INC SI INC DI LOOP SR1 CALLDIS_PAUSE ;提取 RECEIVE_BUFFER 到 AX XOR DX,DX XOR AX,AX MOV MOV ROL DH,4 OR AL,DH XOR DX,DX MOV ;源地址加 1 ;目的地址加 1 ;发送字符长度指针不为 0?继续发送 AL,[SEND_BUFFER+3] DH,[SEND_BUFFER+2] ;从源地址中取第一个数据 ;调用发送子程序 ;调用接收子程序 AH,[SEND_BUFFER+1]
DH,[SEND_BUFFER+0] ; FLAG OF ENDING DX, -1 DX ; FLAG TO STACK CX, 10 BX,0 MOV ROL DH,4 OR AH,DH ;得到 AX MOV PUSH MOV MOV L_DIV10: XOR DIV CX ; DX:AX / CX PUSH INC BX TESTAX, AX JNE L_DIV10 CMPBX,4 JG NEXT DX, DX DX MOV CMP JNZ PUSH ADD_1: CMP JNZ PUSH PUSH ADD_2: CMP JNZ PUSH PUSH PUSH ADD_3: CMP JNZ PUSH PUSH PUSH PUSH DX ,0 BX,3 ADD_1 DX BX,2 ADD_2 DX DX BX,1 ADD_3 DX DX DX BX,0 ADD_4 DX DX DX DX ADD_4: CALLDIS_TEN;yyyyyyy NEXT:
分享到:
收藏