资源描述
微机接口技术课程设计报告 设计题目: 秒表设计 _班级:电子0801姓名:计算机科学与技术 学院 电子信息科学与技术 专业 时间:2010-12-25前 言微机接口技术是计算机和电子类专业重要的专业基础课之一,它不仅要求有较好的理论基础,而且还要求有较强的实际动手能力。本课程设计的主要目的是通过课程设计的综合训练,培养学生实际分析问题、编程和动手能力,最终使学生系统掌握接口技术课程的内容,能把学到的知识应用到实际中去,学习解决实际生活和工作中的问题,提高实践能力,包括对计算机接口技术的理解和计算机应用系统的分析、设计能力。课程设计较课程实验复杂,课程设计涉及理论尝试更广,更接近实际应用,要求同学们重视实际动手能力的训练,提前做好预习,学习查找、运用设计资料,完成工程设计所必备的基本训练。一、主要内容本次课程设计的题目为秒表设计。设计的具体要求为:1、利用8253A,用实验箱上的数码管模拟一个秒表,要求具有一般秒表的功能;2、能显示实时时间,时间值的变化可采用查询8253A的计数器值来进行计算;按“1”键时,进入秒表准备状态,再按“1”键开始秒表计时(计时单位为1/100秒),再按“1”键时停止秒表计时。秒表计时的时间在数码管上显示;3、按“2”键退出秒表计时状态,显示实时时间。二、资料收集本论文参考了2008年2月清华大学出版社由戴梅萼和史嘉权编写的第四版微机计算机技术及应用,以及西安电子科技大学出版社出版的唐祎玲和毛月东于2003年8月编写的32位微机原理与接口技术实验教程。三、工作过程在老师的要求下全班进行了自行分组,我们组三名成员,在经过初期选择题目,确定思路后着手写的程序,期间遇到了一些问题,最后在老师的指导、同学的帮助以及自己组内成员的努力下克服了这些困难。由于笔者水平有限,设计报告中难免有错误和不足之处,敬请老师提出宝贵意见。 目 录一、系统概述11.1设计要求11.2系统流程论述及工作原理11.3系统可行性分析4二、单元电路设计与分析62.1硬件电路设计62.2器件选择与简介72.2.1可编程计数器/定时器芯片8254A72.2.2可编程并行通信接口芯片8255A9三、软件编程与调试123.1技术问题123.2调试结果12四、结束语134.1改进分析134.2实验总结13附录14参考文献21一、系统概述1.1设计要求利用8253A,用实验箱上的数码管模拟一个秒表,要求具有一般秒表的功能;能显示实时时间,时间值的变化可采用查询8253A的计数器值来进行计算;按“1”键时,进入秒表准备状态,再按“2”键开始秒表计时(计时单位为1/100秒),再按“3”键时停止秒表计时。秒表计时的时间在数码管上显示;按“4”键退出秒表计时状态,显示实时时间(从0分0秒开始)。下图为各模块的组合框图:8254时间控制模块键盘模块 主 控 制 器 模 块并行通信模块-8255LED显示模块电源模块图1.1 秒表各模块的组合框图1.2系统流程论述及工作原理 本系统主要利用对计数器/定时器多功能接口芯片8254装不同的初值,产生1/100秒信号和1秒信号,并送给可编程并行通信接口芯片8255作为加1信号,再通过按键和8255控制LED模块显示。工作流程图及子程序流程图如下所示:开始YNYNYN时钟计时,AA:秒,BB:分YNN调用显示1设置显示次数8254重装初值调用清屏显示次数=0 ?调用BREAK退出程序存储单元清零是否有“4”按下是否有“1”键按下按下调用显示1是否有“3”按下秒表计时,AA:1/100s,BB:秒8254初始化,装计数初值是否有“2”键按下8255初始化图1.2总程序流程图显示1:获得TAB的偏移地址AA除10取余控制LED最低位亮调用显示2延时控制LED次低位亮调用显示2,显示商延时BB除10 取余控制LED次高位亮调用显示2延时控制LED最高位亮调用显示2,显示商延时返回图1.3显示模块BREAK:6号功能调用N返回键盘是否有键按下Y程序结束 图1.4退出程序流程图 图1.5延时子程序清屏:实现向8255_A输送00H,清除以前显示的数字,使其黑屏。从总流程图可以看出,当操作者按下“1”键时,秒表进入准备状态,等待“2”键的按下,当“2”键按下时,8254初始化,开始产生1/100秒信号,并将该信号送给8255的C口的PC0位,8255不断对PC0位进行检测,检测到上升沿时,8255计数器0加1,同时8255检测键盘是否有“3”键按下,若有键按下,8255A口就将秒表计时的数据送给LED显示,以此来实现秒表的计时及显示功能。显示完后,等待“4”键的按下进入后面的程序,当“4”键按下时,8254重装初值,产生1秒信号,8255不断对PC0位进行检测,检测的方式,是检测上升沿,当检测到上升沿时,8255计数器0(已清0)加1,同时将时间送给LED显示。这样完成了时钟的功能。1.3系统可行性分析本实验的操作都在实验箱上完成,在实验箱完好的前提下,各芯片都能正常工作。根据设计要求,本系统设计为以下几个基本模块,即:主控制器模块,电源模块,LED显示模块,键盘模块,信号产生模块和计时器模块。其中各模块的主要功能和相互之间的关系如下:(1)控制器模块是电子交警的核心,它连接其它各个模块,完成计算、控制、存储、接口等功能。(2)电源模块是独立的直流电源系统,为整个系统供电。(3)LED显示模块完成显示功能,由8255的A口将数据送给其显示。(4)信号产生模块 利用8254,根据宋的初值不同,产生1/100秒信号和1秒信号。(5)计时器模块 利用8255,通过对PC0位的检测产生秒表计时和时钟的功能。以上功能的各个模块相互连接,相互配合,完成秒表计时和时钟的功能。是一个结构清晰,思路分明,模块化设计完整的秒表设计方案。二、单元电路设计与分析2.1硬件电路设计Y1dpaX1X2X3X4Y2XA0XIOWXIORIOY2XA1XD0D7 PB7 8255D0 PB0A1 A0 PA0 WRRD CS PA7 PC7 PC0XD7仿真总线接口键盘LEDLEDLEDLED10kHzXA0XIOWXIORIOY2XA1XD7D0 8254D7A1 OUT0A0 CLK0WRRD GATE0CSXD0PC0仿真总线接口+5V图2.1硬件电路设计图2.2器件选择与简介2.2.1可编程计数器/定时器芯片8254A1. 8254A变成结构和外部信号图2.2 8254编程结构CLK0DB通道0GATE0D7D0OUT0A2A1A1CLK1A0通道1GATE1IOW#OUT1WR#CLK2GATE2OUT2IOR#RD#通道2片选信号CS#图2.3 8254外部信号2. 编程命令和工作模式编程原则:(1)设置初值钱必须先写控制字;(2) 初值设置要符合控制字中的格式规定;(3)要读取计数器的当前值和状态字,必须用控制字先锁定,才能读取。编程命令有两类:(1)读出命令;读计数器计数值;读状态寄存器值(只对8254);(2)写入命令;模式设置控制字命令;读出控制字(锁存命令);设置计数初始值。工作模式(六种)(1) 模式0计数结束产生中断性质:写入控制字,OUT端为低电平,计数初值装入该计数器后,等待到GATE输入高电平时,计数器开始递减计数。在整个计数过程中,OUT保持低电平,当计数器减为0时,OUT输出高电平,并且一直保持高电平,除非写入新的计数值。(2) 模式1 可编程的单稳态触发器性质:写入控制字,OUT端为高电平,计数初值装入该计数器后,在GATE信号的上升沿后的下一个CLK脉冲的下降沿开始计数,OUT变为低电平。在整个计数过程中,OUT保持低电平,当计数器减为0时,OUT变为高电平,输出一个单脉冲,若GATE信号再由低变高,可再产生一个单脉冲,相当一个单稳态。(3) 模式2分频器性质: 写入控制字,OUT端为高电平,计数初值写入计数器后,等待到触发信号时,计数器开始递减计数。减到1,OUT端变成低电平,经过一个时钟脉冲OUT端又变为高电平,然后开始一个新的计数过程,重复进行。(4) 模式3方波发生器性质:CPU写入控制字后OUT变高,写完计数初值并受触发后,开始减1计数,输出保持高电平。当计到一半计数值时,输出变低,直到计数到0,输出又变为高,重新开始计数。(5) 模式4软件触发的选通信号发生器性质:写入控制字,OUT端为高电平,写入计数初值,GATE为高电平,开始计数,计数器计到0时,OUT变为低电平,经过一个CLK脉冲周期,OUT又变高,计数器停止计数,只有写入新计数值才能开始新的计数。(6) 模式5硬件触发的选通信号发生器性质:写入控制字,OUT变高,写入计数初值后,由GATE信号的上升沿触发开始计数。计到0后,OUT变为低电平。经一个CLK周期后,OUT又变为高电平,并停止计数,等下次GATE触发才能再计数。2.2.2 可编程并行接口芯片8255A1.8255A内部结构和引脚信号图2.4 8255内部结构图2.5 8255A引脚信号2. 8255A的控制字控制字分为两类:(1)各端口的方式选择控制字;图2.6 8255A的方式选择控制字(2)C端口按位置1/置0控制字。 图2.7 端口C置1/置0控制字三、软件编程与调试3.1技术问题软件编程中一开始我们实时时钟显示模块不对,它到了60秒的时候没有清零,而是继续加直到100才清的的零,而且秒表记录的时间也不对。经过反复检查和请教老师,最终找到寄存器不清零的错误原因是寄存器重复利用,在很多子程序都被反复用到了,导致计数值混乱,没有在记到60秒或60分的时候清零;而秒表记录时间误差大的原因是计数器8254芯片的初值送错了,我们直接送的是100,但是PC机上把100当做的是十六进制的数,所以导致秒表计时发生偏差。3.2调试结果经过多次试验,我们在数据段上定义一个存储单元,把用来计数的存储器改成了存储单元。这样就使得计数时数据不会混乱,清零问题得到解决。对于秒表计数出现偏差的问题,我们把100改成0100H,这样秒表计数也正确了。DATA SEGMENTTAB DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6HAA DB 00HBB DB 00HLL DB 00HDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA ;定义存储单元A1: ;A1,A2合起来检测上升沿 MOV DX,MY8255_C IN AL,DX ;读取8255C口的值 TEST AL,01H ;检测第0位的值 JNZ A1 ;不为0,返回A1A2: IN AL,DX ;读取8255C口的值 TEST AL,01H ;检测第0位的值 JZ A2 ;为0,返回A1 INC AA ;有上升沿(即1/100s信号),存储单元加1 CMP AA,100 ;比较,判断是否加到了100 JNZ TING ;没加到100,跳到TING MOV AA,0 ;加到100,1/100s计数置0 INC BB ;秒存储单元加1 CMP BB,100 ;判断秒是否加到100 JNZ TING ;没加到100,跳到TING MOV BB,0 ;秒存储单元置0 JMP A1 ;跳转到A1继续检测1/100s信号 四、结束语4.1改进分析我们的程序仍有可以改进的地方,比如:实时时钟的显示模块,我们的程序是让时钟从00:00:00开始计时的。在这方面我们可以把PC机上的时间下载到箱试验上,让七段数码管上显示的是当时的准确时间。4.2实验总结开始做设计时总是会犯一些错误,只有经过不停的改错不停的编译得到正确的程序说明了作为软件编程人员是不能粗心大意的,一个程序的质量的高低与你细心与否有着一定的联系。在编程时,我充分使用了结构化的思想,这样程序检查起来也比较方便,调试时也给了我很大方便,只要一个模块一个模块的进行调就可以了,充分体现了结构化编程的优势。在设计中要求我要有耐心和毅力,还要细心,稍有不慎,一个小小的错误就会导致结果的不正确,而对错误的检查要求我要有足够的耐心,通过这次设计和设计中遇到的问题,也积累了一定的经验,对以后从事集成电路设计工作会有一定的帮助。在应用汇编语言的过程中让我真正领会到了其并行运行与其他软件顺序执行的差别及其在电路设计上的优越性。用汇编描述语言的形式来进行秒表系统的设计方便灵活,利用实验箱仿真极大地减少了电路设计时间和可能发生的错误,降低了开发成本,这种设计方法在秒表系统设计中发挥越来越重要的作用。附 录元器件明细表符号名称型号 参数数量备注8255并行接口D8255AC-21个并行传输8254计数器/定时器 D8254C-21个计数功能电路原理图Y1dpaX1X2X3X4Y2XA0XIOWXIORIOY2XA1XD0D7 PB7 8255D0 PB0A1 A0 PA0 WRRD CS PA7 PC7 PC0XD7仿真总线接口键盘LEDLEDLEDLED10kHzXA0XIOWXIORIOY2XA1XD7D0 8254D7A1 OUT0A0 CLK0WRRD GATE0CSXD0PC0仿真总线接口+5V源程序清单MY8254_COUNT0 EQU 9840HMY8254_COUNT1 EQU 9841HMY8254_COUNT2 EQU 9842HMY8254_MODE EQU 9843HMY8255_A EQU 9860HMY8255_B EQU 9861HMY8255_C EQU 9862HMY8255_MODE EQU 9863HDATA SEGMENTTAB DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6HAA DB 00HBB DB 00HLL DB 00HDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV DX,MY8255_MODEMOV AL,89H ;8255初始化,A口输出,工作在方式0下;B口输出,工作在方式0下;C口输入 OUT DX,AL JIANCE1: CALL BREAK ;按任意键退出,防止程序在以下的程序进入死循环没法退出 MOV DX,MY8255_B MOV AL,0EH OUT DX,AL ;开放X1那一列开关 CALL DALLY ;等待Y1Y2的检测 MOV DX,MY8255_C IN AL,DX ;C口高四位的低两位读取Y1,Y2的按键情况 AND AL,30H ;取C口高四位的低两位 CMP AL,20H ;检测Y1行按键情况 JNZ JIANCE1 ;X1Y1(即“1”键)没有按下返回JIANCE1 JIANCE2: MOV DX,MY8255_B MOV AL,0DH OUT DX,AL ;开放X2那一列开关 CALL DALLY ;等待Y1Y2的检测 MOV DX,MY8255_C IN AL,DX ;C口高四位的低两位读取Y1,Y2的按键情况 AND AL,30H ;取C口高四位的低两位 CMP AL,20H ;检测Y1行按键情况 JNZ JIANCE2 ;X2Y1(即“2”键)没有按下返回JIANCE2 CHUZHI: MOV AL, 35H MOV DX, MY8254_MODE OUT DX, AL ;8254初始化,选择计数器0;先读/写高8位,再读/写低8位;工作在模式2下;计数初值为BCD码格式 MOV AX, 0100H ;存计数初值100,产生1/100s信号 MOV DX, MY8254_COUNT0 OUT DX, AL ; 送低字节到计数器0 MOV AL, AH OUT DX, AL ; 送高字节到计数器0 A1: ;A1,A2合起来检测上升沿 MOV DX,MY8255_C IN AL,DX ;读取8255C口的值 TEST AL,01H ;检测第0位的值 JNZ A1 ;不为0,返回A1A2: IN AL,DX ;读取8255C口的值 TEST AL,01H ;检测第0位的值 JZ A2 ;为0,返回A1 INC AA ;有上升沿(即1/100s信号),存储单元加1 CMP AA,100 ;比较,判断是否加到了100 JNZ TING ;没加到100,跳到TING MOV AA,0 ;加到100,1/100s计数置0 INC BB ;秒存储单元加1 CMP BB,100 ;判断秒是否加到100 JNZ TING ;没加到100,跳到TING MOV BB,0 ;秒存储单元置0 JMP A1 ;跳转到A1继续检测1/100s信号 TING: CALL BREAK MOV DX,MY8255_B MOV AL,0BH OUT DX,AL ;开放X3那一列开关 CALL DALLY MOV DX,MY8255_C IN AL,DX ;读C口的值 AND AL,30H CMP AL,20H ;检测Y1行的按键情况 JNZ A1 ;X3Y1(即“3”)键没按下,返回TING继续检测 CALL BREAKM1: CALL XIANSHI1 ;调用显示子程序显示秒表的计数值 JIANCE3: MOV DX,MY8255_B MOV AL,07H OUT DX,AL ;开放X4那一列开关 CALL DALLY MOV DX,MY8255_C IN AL,DX ;读C口的值 AND AL,30H CMP AL,20H ;检测Y1行的按键情况 JNZ M1 ;X4Y1(即“4”)键没按下,返回JIANCE3继续检测 MOV AA,0 ;清0 MOV BB,0 ;清0 CALL CLEAR ;清除LED的显示情况 CHUZHI1: MOV AL, 35H MOV DX, MY8254_MODE OUT DX, AL ;8254初始化,选择计数器0;先读/写高8位,再读/写低8位;工作在模式2下;计数初值为BCD码格式 MOV AX, 0 ;重装计数初值100000,产生1s信号 MOV DX, MY8254_COUNT0 OUT DX, AL ; 低字节送计数器0 MOV AL, AH OUT DX, AL ; 高字节送计数器0 B1: ;B1和B2合起来检测1s信号 MOV LL,0 ;存储单元清0,存显示次数,用于稳定显示 MOV DX,MY8255_C IN AL,DX ;读8255的C口的值 TEST AL,01H ;检测第0位 JNZ B1 ;不为0,返回B1继续检测B2: MOV DX,MY8255_C IN AL,DX ;再读8255的C口的值 TEST AL,01H ;检测第0位 JZ B2 ;为0,返回B2继续检测 INC AA ;有上升沿,秒存储单元AA加1 CMP AA,60 ;是否加到60s JNZ C1 ;没有加到60s,跳到C1 MOV AA,0 ;有60s,秒存储单元AA置0 INC BB ;分存储单元BB加1 CMP BB,60 ;分是否加到60 JNZ C1 ;没加到60,跳到C1 MOV BB,0 ;到60,分置0 C1: INC LL ;显示次数加1 CALL XIANSHI1 CALL BREAK ;显示完后按任意键退出 CMP LL,9FH ;是否达到显示的次数 JNZ C1 JMP B1 ;一个数显示完毕,返回C1继续计时 XIANSHI1: ;取出AA和BB中的每一位 MOV DI,OFFSET TAB ;获得数字表的偏移地址 MOV AL,AA MOV AH,0 MOV CH,10 DIV CH ;除10,分离AA的两位数 MOV CH,AL ;保存商(即AA的高四位) MOV DX,MY8255_B MOV AL,0F7H OUT DX,AL ;8255_B控制LED的最低位亮 CALL XIANSHI2 ;调用显示2,显示AA低4位数字 CALL DALLY MOV AH,CH ;取出商 MOV DX,MY8255_B MOV AL,0FBH OUT DX,AL ;8255_B控制LED的次低位亮 CALL XIANSHI2 ;调用显示2,显示AA高4位数字 CALL DALLY MOV AL,BB MOV AH,0 MOV CH,10 DIV CH ;除10,分离BB的两位数 MOV CH,AL ;保存商,(即BB的高四位) MOV DX,MY8255_B MOV AL,0FDH OUT DX,AL ;8255_B控制LED的次高位亮 CALL XIANSHI2 ;调用显示2,显示BB低4位数字 CALL DALLY MOV AH,CH ;取出商 MOV DX,MY8255_B MOV AL,0FEH OUT DX,AL ;8255_B控制LED的最高位亮 CALL XIANSHI2 ;调用显示2,显示BB高4位数字 CALL DALLY RET CLEAR: MOV DX,MY8255_A MOV AL,00H OUT DX,AL ;清屏,清除LED的显示RET XIANSHI2: ;显示TAB表中对应的数 PUSH DX PUSH BX MOV BL,AH MOV BH,0 ;把分离后的数存入BX MOV AL,BX+DI ;取出TAB中的对应数,送给AL MOV DX,MY8255_A OUT DX,AL ;把AL的值送给8255_A显示 POP BX POP DX RETDALLY: ;延时 PUSH CX PUSH AX MOV CX,0FFFH ;设置循环次数 D1: MOV AX,00FFH ;设置二重循环 D2: DEC AX JNZ D2 LOOP D1 POP AX POP CX RET BREAK: ;按任意键退出 MOV AH,06H MOV DL,0FFH INT 21H ;6号功能号调用,扫描键盘,看是否有键按下 JE RETURN ;没有键按下,返回继续执行 MOV AX,4C00H INT 21H ;有键按下,整个程序结束 RETURN:RETCODE ENDS END START参考文献1戴梅萼 史嘉权微型计算机技术及应用清华大学出版社2008年2月第四版2荆淑霞微机原理与汇编语言程序设计中国水利水电出版社2005年6月第一版3唐祎玲、毛月东32位微机原理与接口技术实验教程西安电子科技大学出版社2003年8月21
展开阅读全文