中南大学自动化微机课程设计报告.docx

上传人:b****7 文档编号:11108213 上传时间:2023-02-25 格式:DOCX 页数:35 大小:264.34KB
下载 相关 举报
中南大学自动化微机课程设计报告.docx_第1页
第1页 / 共35页
中南大学自动化微机课程设计报告.docx_第2页
第2页 / 共35页
中南大学自动化微机课程设计报告.docx_第3页
第3页 / 共35页
中南大学自动化微机课程设计报告.docx_第4页
第4页 / 共35页
中南大学自动化微机课程设计报告.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

中南大学自动化微机课程设计报告.docx

《中南大学自动化微机课程设计报告.docx》由会员分享,可在线阅读,更多相关《中南大学自动化微机课程设计报告.docx(35页珍藏版)》请在冰豆网上搜索。

中南大学自动化微机课程设计报告.docx

中南大学自动化微机课程设计报告

第一章绪论

1.1概述

近年来随着科技的飞速发展,单片机的应用正在不断地走向深入,同时带动传统控制检测日新月益更新。

在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,加以完善。

交通信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。

1.2设计目的

《微机应用系统设计与综合实验(实践)》课程设计是自动化专业本科生必修的一门技术基础课。

通过本课程设计,让学生对微机系统有一个较全面的理解,对典型数字接口电路的应用技术有一个较深入的掌握,并对应用系统进行硬件原理和软件编程进行分析、设计和调试,达到基本掌握简单微型计算机应用系统软硬件的设计方法,提高项目开发能力的目的。

要求同学独立完成课题,写出课程设计说明书,画出电路原理图,说明工作原理,画出电路印制板图,编写设计程序及程序流程图。

希望同学们认真阅读课程设计任务书,认真查阅资料,完成好上机调试,圆满完成本次课程设计。

1.3设计任务和内容

设计题10:

交通灯控制功能设计(限2-3人)

设计要求:

(1)、编程语言为C语言和汇编语言;

(2)、硬件电路基于80x86微机接口;

(3)、程序功能要求:

小键盘给定、数码管(屏幕)显示;

(4)、具备急救车应急响应功能和时间倒计时显示功能。

实验仪器与设备

(1)TPC-H通用微机接口实验系统1台。

(2)IBM-PC微型计算机1台。

第二章总体设计及核心器件简介

2.1总体设计

通过采用8086、8255、I\O接口电路、键盘、LED数字灯显示、发光二极管组成交通灯演示系统。

利用8255与键盘扫描单元,编写程序完成按键扫描功能,并将倒计时时间显示在数码管上。

按键可以完成置数功能和各种控制功能,同时利用8086重复刷新数码管产生一秒延时,延时一秒之后,将倒计时时间减少一秒,并利用刷新数码管显示出当前剩余时间,到倒计时时间为零,通过利用I\O接口电路将控制信号传送给发光二极管,使之发光或者熄灭。

2.2CPU8086

8086简介

8086CPU根据它的基本性能,应包括20条地址线,16条数据线,加上控制信号,电源和地线,芯片的引脚比较多。

但由于制造工艺的限制,8086CPU芯片采用了40条引脚的双列直插式封装。

2.38255A

8255A是Intel公司生产的可编程输入输出接口芯片,它具有3个8位的并I/O

口,具有三种工作方式,可通过程序改变其功能,因而使用灵活,通用性强。

8255有三种基本工作方式,三种工作方式由工作方式控制字决定,方式控制字由CPU通过输入/输出指令来提供.三个端口中PC口被分为两个部分,上半部分随PA口称为A组,下半部分随PB口称为B组.其中PA口可工作与方式0、1和2,而PB口只能工作在方式0和1。

8255共有40个引脚,采用双列直插式封装。

其引脚图如图2-4所示,各引脚功能如下:

(8255A引脚图如下:

D0--D7:

三态双向数据线,与单片机数据总线连接,用来传送数据信息。

CS:

片选信号线,低电平有效,表示芯片被选中。

RD:

读出信号线,低电平有效,控制数据的读出。

WR:

写入信号线,低电平有效,控制数据的写入。

Vcc:

+5V电源。

PA0--PA7:

A口输入/输出线。

PB0--PB7:

B口输入/输出线。

PC0--PC7:

C口输入/输出线。

RESET:

复位信号线。

A1、A0:

地址线,用来选择8255内部端口。

GND:

地线。

2.4键盘扫描与数码显示模块

X1~X4控制4位数码管的公共端,并连接到按键的一端,作为列选,确定是哪一列的按键按下,Y1~Y4连接到按键的另一端,作为行选,用于检测哪一行的按键按下。

结合行选和列选即可得出是哪一个的按键按下,在软件设计上要注意消除按键抖动的处理以及数码管显示的刷新。

键盘及数码管显示单元电路结构图

2.5I\O接口电路模块

I\O接口电路主要是将信号传递给信号灯,使之点亮或者熄灭。

I\O接口利用三态缓冲器74LS245,锁存器74LS374设计微机总线和外部设备的数据通道,实现微机对外部数据的读取和对输出数据的输出。

用开关及LED显示单元的开关和数据灯作为输入和输出显示设备,将开关的数据读入总线或者将总线的数据传递到数据灯。

实验中我们可以利用开关控制交通灯的功能,但是设计中要求我们使用小键盘控制,因此我们主要利用I\O接口电路中的锁存器74LS374将数据从总线送出。

输出接口一般用锁存器实现,从总线送出的数据可以暂存在锁存器中,74LS374是一种8通道上沿触发锁存器。

其管脚结构如下图所示。

D[7:

0]为输入数据线,Q[7:

0]为输出数据线。

CLK引脚为锁存控制信号,上升沿有效。

当上升沿时,输出数据线锁存输入数据线上的数据。

OE引脚为锁存器的片选信号,低电平有效。

74LS374上升沿触发锁存器管脚图

基本I\O接口设计实验参考接线图

第三章软件编程设计

3.1设计思想

先通过小键盘设定路口通行时间,按键A确定。

然后检测按钮B是否按下,按下则进入交通灯演示功能:

(1)南北路口的绿灯,东西路口的红灯同时亮设定的时间。

(2)南北路口的黄灯闪烁5次,同时东西路口的红灯继续亮。

(3)南北路口的红灯,东西路口的绿灯同时亮设定的时间。

(4)南北路口的红灯继续亮,同时东西路口的黄灯闪烁五次。

在交通灯演示功能的同时检测是否有按键按下,当按键B按下,表示系统启动。

当按键C按下,表示系统暂停。

当按键D按下,表示系统重置时间。

当按键E按下,表示系统进入紧急情况。

当按键F按下,表示系统关闭。

当系统启动后,交通灯自动交替闪烁,每隔一秒就将数码管需要显示的数值减一,同时不停地刷新数码管,以显示剩余时间。

当系统暂停时,系统不停的检测是否启动按钮按下,否则就继续检测,同时刷新数码管,是数码管显示暂停时的时间,直到启动按钮按下,系统继续按照暂停前的状态运行,当系统重新设置时间时。

相当于程序从新开始执行。

当紧急按钮按下,将数码管显示时间零,同各个路口的红灯亮,绿灯和黄灯灭。

直到检测到启动按钮按下,启动按钮按下后,跳转到交通灯演示的第一步。

当结束按钮按下,则跳出程序的运行。

3.2典型模块

本实验中有三种典型的程序模块分别为按键扫描、数码管刷新数据和I\O接口电路输出数据。

按键扫描:

按键扫描的程序首先清屏,然后扫描按键,判断是否有按键按下,如果没有按键按下,则不执行扫描按键代码程序。

如果有按键按下,则延时一定时间再次扫描按键,如果这时没有按键按下,则说明是按键抖动,不执行扫描按键代码程序。

如果延时后按键还是按下的,则我们需要检测按下按键的代码,首先设置当前检测的是第几列,选取一列,同时将对应的X1~X4置低电平,读Y1~Y4,用于判断是哪一行的按键闭合,判断是否为第一行,如果是第一行则设置第一行第一列的对应键值,如果不是则判断是否为下一行。

一直检测到最后一行。

如果判断不是,则检测下一列,按照上述方法,从第一列检测最后一列,直到检测出对应的按键后,设置对应按键的键值。

数码管的刷新:

在交通灯功能控制系统中,均采用了8位数码管动态扫描显示(见图1)。

它将所有数码管的8个段线相应地并接在一起,并接到8255单元的PB口,由PB口控制字段输出。

而各位数码管的共阳极由8255单元的PA口控制X1~X4来实现8位数码管的位输出控制。

这样,对于一组数码管动态扫描显示需要由两组信号来控制:

一组是字段输出口输出的字形代码,用来控制显示的字形,称为段码;另一组是位输出口输出的控制信号,用来选择第几位数码管工作,称为位码。

由于各位数码管的段线并联,段码的输出对各位数码管来说都是相同的。

因此,在同一时刻如果各位数码管的位选线都处于选通状态的话,8位数码管将显示相同的字符。

若要各位数码管能够显示出与本位相应的字符,就必须采用扫描显示方式。

即在某一时刻,只让某一位的位选线处于导通状态,而其它各位的位选线处于关闭状态。

同时,段线上输出相应位要显示字符的字型码。

这样在同一时刻,只有选通的那一位显示出字符,而其它各位则是熄灭的,如此循环下去,就可以使各位数码管显示出将要显示的字符。

虽然这些字符是在不同时刻出现的,而且同一时刻,只有一位显示,其它各位熄灭,但由于数码管具有余辉特性和人眼有视觉暂留现象,只要每位数码管显示间隔足够短,给人眼的视觉印象就会是连续稳定地显示。

I\O接口输出电路:

先将I\O接口电路的片选信号选通。

将要传递的信号存放在AL寄存器中,将要传递信号的地址存放在DX寄存器中,再用OUT指令输出。

 

3.2程序流程框图

3.3源程序

汇编语言源代码:

;***************根据CHECK配置信息修改下列符号值*******************

IOY0EQU0C400H;片选IOY0对应的端口始地址

IOYO2EQU0C440H

;*****************************************************************

MY8255_AEQUIOY0+00H*4;8255的A口地址

MY8255_BEQUIOY0+01H*4;8255的B口地址

MY8255_CEQUIOY0+02H*4;8255的C口地址

MY8255_MODEEQUIOY0+03H*4;8255的控制寄存器地址

STACK1SEGMENTSTACK

DW256DUP(?

STACK1ENDS

DATASEGMENT

DTABLEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H

L0DB11H

L1DB41H

L2DB21H

L3DB01H

L4DB14H

L5DB12H

L6DB10H

L7DB0CH

L8DB00H

DATAENDS;键值表,0~F对应的7段数码管的段位值

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

MOVSI,0F000H;建立缓冲区,存放要显示的键值

MOVAL,00H;先初始化键值为0

MOV[SI],AL

MOV[SI+1],AL

MOVDI,0F001H

MOVDX,MY8255_MODE;初始化8255工作方式

MOVAL,81H;方式0,A口、B口输出,C口低4位输入

OUTDX,AL

BEGIN:

CALLDIS

CALLCLEAR;清屏

CALLCCSCAN;扫描按键

JNZRGETKEY1;有键按下则跳置GETKEY1

MOVAH,1;判断PC键盘是否有按键按下

INT16H

JZBEGIN;无按键则跳回继续循环,有则退出

QUIT:

MOVAX,4C00H;返回到DOS

INT21H

RGETKEY1:

CALLDALLY1;显示刷新

CALLCLEAR;清屏

CALLCCSCAN;再次扫描按键

JNZRGETKEY2;有键按下则跳置GETKEY2

JMPBEGIN;否则跳回开始继续循环

RGETKEY2:

MOVCH,0FEH

MOVCL,00H;设置当前检测的是第几列

RCOLUM:

MOVAL,CH;选取一列,将X1~X4中一个置0

MOVDX,MY8255_A

OUTDX,AL

MOVDX,MY8255_C;读Y1~Y4,用于判断是哪一行按键闭合

INAL,DX

RL1:

TESTAL,01H;是否为第1行

JNZRL2;不是则继续判断

MOVAL,00H;设置第1行第1列的对应的键值

JMPRKCODE

RL2:

TESTAL,02H;是否为第2行

JNZRL3;不是则继续判断

MOVAL,04H;设置第2行第1列的对应的键值

JMPRKCODE

RL3:

TESTAL,04H;是否为第3行

JNZRL4;不是则继续判断

MOVAL,08H;设置第3行第1列的对应的键值

JMPRKCODE

RL4:

TESTAL,08H;是否为第4行

JNZRNEXT;不是则继续判断

MOVAL,0CH;设置第4行第1列的对应的键值

RKCODE:

ADDAL,CL;将第1列的值加上当前列数,确定按键值

CMPAL,09H

JGKERR1

CALLPUTBUF;保存按键值

PUSHAX

RKON:

CALLDALLY1;显示刷新

CALLCLEAR;清屏

CALLCCSCAN;扫描按键,判断按键是否弹起

JNZRKON;未弹起则继续循环等待弹起

POPAX

RNEXT:

INCCL;当前检测的列数递增

MOVAL,CH

TESTAL,08H;检测是否扫描到第4列

JZKERR;是则跳回到开始处

ROLAL,1;没检测到第4列则准备检测下一列

MOVCH,AL

JMPRCOLUM

KERR:

JMPBEGIN

KERR1:

CMPAL,0AH

JZKERR2

JMPKERR

KERR2:

MOVL7,0CH

MOVSI,0F000H

MOVAL,[SI]

MOVBL,[SI+1]

SHLBL,4

ADDAL,BL

MOVL8,AL

B:

MOVAL,L0

MOVDX,IOYO2

OUTDX,AL

MOVBX,0000H

CALLCHANGE

CALLBE

CALLDALLY1

T:

MOVAL,L1

MOVDX,IOYO2

OUTDX,AL

MOVBL,L8

T1:

CALLCJIAN

CALLCHANGE

CALLBE

CALLDALLY2

CALLDALLY2

CALLDALLY2

CMPBX,00H

JNZT1

MOVBX,0006H

T2:

MOVAL,L2

MOVDX,IOYO2

OUTDX,AL

CALLCJIAN

CALLCHANGE

CALLBE

CALLDALLY1

CALLDALLY1

MOVAL,L3

MOVDX,IOYO2

OUTDX,AL

CALLDALLY2

CALLDALLY2

CMPBX,0

JNZT2

MOVAL,L4

MOVDX,IOYO2

OUTDX,AL

MOVBL,L8

T3:

CALLCJIAN

CALLCHANGE

CALLBE

CALLDALLY2

CALLDALLY2

CALLDALLY2

CMPBL,00H

JNZT3

MOVBX,0006H

T4:

MOVAL,L5

MOVDX,IOYO2

OUTDX,AL

CALLCJIAN

CALLCHANGE

CALLBE

CALLDALLY1

CALLDALLY1

MOVAL,L6

MOVDX,IOYO2

OUTDX,AL

CALLDALLY2

CALLDALLY2

CMPBX,0

JNZT4

JMPT

CHANGEPROCNEAR

PUSHBX

MOVAX,BX

MOVSI,0F000H

ANDAL,0FH

MOV[SI],AL

ANDBL,0F0H

SHRBL,4

MOV[SI+1],BL

POPBX

RET

CHANGEENDP

CJIANPROCNEAR

MOVAX,BX

DECAX

DAS

MOVBX,AX

RET

CJIANENDP

DISPROCNEAR;显示键值子程序

PUSHAX

PUSHBX;以缓冲区存放的键值为键值表偏移找到键值并显示

MOVSI,0F000H

MOVDL,0F7H

MOVAL,DL

AGAIN:

PUSHDX

MOVDX,MY8255_A

OUTDX,AL;设置X1~X4,选通一个数码管

MOVAL,[SI];取出缓冲区中存放键值

MOVBX,OFFSETDTABLE

ANDAX,00FFH

ADDBX,AX

MOVAL,[BX];将键值作为偏移和键值基地址相加得到相应的键值

MOVDX,MY8255_B

OUTDX,AL;写入数码管A~Dp

CALLCLEAR

INCSI;取下一个键值

POPDX

MOVAL,DL

TESTAL,04H;判断是否显示完?

JZOUT1;显示完,返回

RORAL,1

MOVDL,AL

JMPAGAIN;未显示完,跳回继续

OUT1:

POPBX

POPAX

RET

DISENDP

DALLY1PROCNEAR;软件延时子程序

PUSHCX

MOVCX,1000H

D1:

MOVAX,1000H

D2:

DECAX

CALLDIS

JNZD2

LOOPD1

POPCX

X2:

RET

DALLY1ENDP

PUTBUFPROCNEAR;保存键值子程序

MOVSI,DI

MOV[SI],AL

DECDI

CMPDI,0EFFFH

JNZGOBACK

MOVDI,0F001H

GOBACK:

RET

PUTBUFENDP

DALLY2PROCNEAR;软件延时子程序

PUSHCX

MOVCX,0FFFFH

D3:

MOVAX,0FFFFH

D4:

DECAX

CALLDIS

JNZD4

LOOPD3

POPCX

RET

DALLY2ENDP

CCSCANPROCNEAR;扫描是否有按键闭合子程序

PUSHAX

PUSHDX

MOVAL,00H

MOVDX,MY8255_A;将4列全选通,X1~X4置0

OUTDX,AL

MOVDX,MY8255_C

INAL,DX;读Y1~Y4

NOTAL

ANDAL,0FH;取出Y1~Y4的反值

POPDX

POPAX

RET

CCSCANENDP

BEPROCNEAR

PUSHCX

S:

CALLDALLY1

CALLCLEAR;显示刷新

CALLCCSCAN;扫描按键

JNZGETKEY1;有键按下则跳置GETKEY1

MOVAL,L7

CMPAL,0BH

JZKERRR

CMPAL,0CH

JZS

CMPAL,0DH

JZKERRR3

CMPAL,0EH

JZKERRR1

CMPAL,0FH

JZKERRR2

JMPS

GETKEY1:

CALLDALLY1;显示刷新

CALLCCSCAN;再次扫描按键

JNZGETKEY2;有键按下则跳置GETKEY2

JMPS;否则跳回开始继续循环

GETKEY2:

MOVCH,0FEH

MOVCL,00H;设置当前检测的是第几列

COLUM:

MOVAL,CH;选取一列,将X1~X4中一个置0

MOVDX,MY8255_A

OUTDX,AL

MOVDX,MY8255_C;读Y1~Y4,用于判断是哪一行按键闭合

INAL,DX

Q1:

TESTAL,01H;是否为第1行

JNZQ2;不是则继续判断

MOVAL,00H;设置第1行第1列的对应的键值

JMPKCODE

Q2:

TESTAL,02H;是否为第2行

JNZQ3;不是则继续判断

MOVAL,04H;设置第2行第1列的对应的键值

JMPKCODE

Q3:

TESTAL,04H;是否为第3行

JNZQ4;不是则继续判断

MOVAL,08H;设置第3行第1列的对应的键值

JMPKCODE

Q4:

TESTAL,08H;是否为第4行

JNZNEXT;不是则继续判断

MOVAL,0CH;设置第4行第1列的对应的键值

KCODE:

ADDAL,CL

CMPAL,09H

JLEKERRR3

MOVL7,AL;将第1列的值加上当前列数,确定按键值

JMPS

PUSHAX

KON:

CALLDALLY1;显示刷新

CALLCLEAR

CALLCCSCAN;扫描按键,判断按键是否弹起

JNZKON;未弹起则继续循环等待弹起

JMPS

POPAX

NEXT:

INCCL;当前检测的列数递增

MOVAL,CH

TESTAL,08H;检测是否扫描到第4列

JZKERRR;是则跳回到开始处

ROLAL,1;没检测到第4列则准备检测下一列

MOVCH,AL

JMPCOLUM

KERRR:

POPCX

RET

KERRR1:

POPCX

MOVL7,0CH

JMPB

RET

KERRR2:

POPCX

CALLCOUT

RET

KERRR3:

POPCX

JMPSTART

RET

BEENDP

SAVEPROCNEAR

MOVAL,L0

MOVDX,IOYO2

OUTDX,AL

RET

SAVEENDP

COUTPROCNEAR

MOVAX,4C00H

INT21H

RET

COUTENDP

CLEARPROCNEAR

PUSHDX

PUSHAX

MOVDX,MY8255_B

MOVAL,00H

OUTDX,AL

POPAX

POPDX

RET

CLEARENDP

DALLYPROCNEAR;软件延时子程序

PUSHCX

MOVCX,00FFH

RD1:

MOVAX,00FFH

RD2:

DECAX

JNZRD2

LOOPRD1

POPCX

RET

DALLYENDP

CODEENDS

ENDSTART

C语言源代码:

#include

#include

#include

#include

#include

#include

vo

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 历史学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1