中南大学自动化微机课程设计报告.docx
《中南大学自动化微机课程设计报告.docx》由会员分享,可在线阅读,更多相关《中南大学自动化微机课程设计报告.docx(35页珍藏版)》请在冰豆网上搜索。
![中南大学自动化微机课程设计报告.docx](https://file1.bdocx.com/fileroot1/2023-2/24/31e80937-9cef-43a0-8b3b-d30b20e85b49/31e80937-9cef-43a0-8b3b-d30b20e85b491.gif)
中南大学自动化微机课程设计报告
第一章绪论
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