可编程频率计-硬件课程设计-总结报告

更新时间:2024-06-12 11:55:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

中国矿业大学计算机科学与技术学院

硬件课程设计总结报告

题学姓

目: 《可编程频率计》设计 号: 名: LXZ-2008

专业班级: 计08-1 指导老师: 实践日期: 2010年8月31号—10月12号

目录

1引言.............................................................................................................................. 3 1.1编写目的 ................................................................................................................ 3 1.2背景 ....................................................................................................................... 3 1.3定义 ....................................................................................................................... 3 1.4参考资料 ................................................................................................................ 4 2实际开发结果 ............................................................................................................... 4 2.1产品 ....................................................................................................................... 4 2.2主要功能和性能 ..................................................................................................... 5 2.3基本流程 ................................................................................................................ 6 2.4进度 ....................................................................................................................... 8 2.5费用 ....................................................................................................................... 9 3开发工作评价 ............................................................................................................. 10 3.1对产品质量的评价 ............................................................................................... 10 3.3对技术方法的评价 ............................................................................................... 10 3.4出错原因的分析 ................................................................................................... 11 4经验与教训 ................................................................................................................ 11 5附录—程序清单及结构图 .......................................................................................... 19 5.1逻辑结构图及流程图............................................................................................ 19 5.2程序清单 .............................................................................................................. 20

2

项目设计总结报告

--可编程频率计的设计

1引言

1.1编写目的

经过一段时间的努力,我们终于完成了对可编程频率计的设计。为了让读者更加了解我们设计的这个可编程频率计的原理、工作方式、运行环境、功能和我们设计的流程等等,我们写了这个项目设计的总结报告。对于学生的我们,这份报告的主要目的是提高我们规范化的工程实验方法,进行系统的、高效地开发项目,同时也作为指导。在编写报告与实验同步能提高我们做项目和实战的能力。

1.2背景

硬件课程设计的课题是:可编程频率计的设计。

这次可编程频率计的设计是由刘晓泽提出来的,由刘晓泽和刘春一起讨论、共同编程、实践,最后成功完成的。

该可编程频率计能够快速准确的捕捉到被测信号频率的变化,所以该频率计适用于需要精确测量信号频率变化的设备。

本频率计是方波频率计,由于实验箱资源的有限性,我们只能设计这个方波频率计。 该设计的频率计需要在16/32位微机接口技术实验系统的实验箱上完成,连接电脑,用到了8279芯片和键盘,8253计数器和I/O输入输出设备,用汇编语言完成编程驱动可编程频率计的实现。

1.3定义

中文名称:频率计 英文名称:frequency meter 定义:测量周期量频率值的仪表。

3

I/O:输出/输入(Input/Output)

汇编语言:(Assembly Language)是面向机器的程序设计语言。用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址码。 中文名称:计数器 英文名称:counter

定义:通过传动机构驱动计数元件,指示被测量累计值的器件。计时器即计数器。 中文名称:脉冲 英文名称:pulse

定义:一个物理量在短持续时间内突变后迅速回到其初始状态的过程。

LED:(Light Emitting Diode),发光二极管,是一种固态的半导体器件,它可以直接把电转化为光。 中文名称:流程图 英文名称:flow diagram

定义:表示生产过程中事物各个环节进行顺序的简图。

1.4参考资料

[1]. 《微型计算机原理与接口技术》第四版 周荷琴 吴秀清/著 中国科学技术出版

[2]. HK88TE说明书 [3]. 8279芯片使用说明文档

2实际开发结果

2.1产品

程序: Is_Start ;检测是否按下开始脉冲键

程序: InitClock2 ;初始化计数器2,并产生可编程的方波频率 程序: InitClock0 ;初始化计数器0 程序: InitClock1 ;初始化计数器1

4

程序: CheckClock0Over ;检测计数器0是否工作结束,并将读取的结果存入变量a中 程序:Display ;显示变量a的值到LED上 主程序:Main ;整个程序的主程序运行部分

本项目的程序结构是扁平式的,即在一个主程序的作用下,分别调用各个小的程序来完成整个项目的功能。而各个小程序又是不可划分的最小程序模块。

本项目总共200行代码。数据段与代码段共用,均用CS作为段寄存器。数据部分21行,其中19行是宏定义,在编译时用,在生成2进制可执行文件时不用。只有2行是真正的数据,占用程序空间。主程序20行代码。Display程序70行代码,InitClock0、InitClock1、InitClock2程序均为10行代码,CheckClock0Over程序20行代码。

本项目有两个版本。但实质为一个版本。由于一开始没有频率发生设备,我们利用8253产生频率,其中用到8个开关作为产生频率的种类。但由于我们的模块是高内聚、低耦合的。独立性比较强。这个产生频率的模块可以随时替换。后来老师找来了频率发生器做检验,检验通过。而之前的代码并未用到。因此实质为一个版本。

2.2主要功能和性能

在这次可编程频率计的设计中,我们的项目的计划的主要功能是:完成方波频率的测试。主要原理:对一个脉冲进行频率计数,通过测量它在单位时间内的脉冲数,然后用

,其中为测出的方波频率,N为单位时间内的频率数,T为单位时间(这里为

0.5S)。

首先对8253赋初始值,让0通道在外界输入1/8MHZ的情况下,通过赋值62500计数,在方式0下产生0.5秒的定时。而计时器0的输出接输入芯片,通过一个循环不断检测计时器0是否定时完毕。而计时器1的CLK1端口接带检测的方波频率,这个计时器是在方式2下工作的,每次频率计工作都赋初始值0给它,让它在单位时间内对产生的脉冲计数。通过值,这里是65536,即

,其中N为最终的计数值,

为计数的最大

是计时器1上读出的计数值,N为测出的频率数。

然后将N转换成8279能显示的数码,最后用8279显示出来。在这当中用一个开关负责

5

开启检测和重置。即第一次使用拨动开关,不到1秒及出来结果,以后每拨动2次,即可看到结果。 性能:

本产品为方波频率发生器,只能检测方波,我们用标准的实验频率发生器产生方波进行检测。由于我们的8279附近的数码管只有6个,而8253上的寄存器是16位的,我们就设计出一个0到65535HZ范围的可编程方波频率计,即用到5个数码管来显示。如果数码管增加,本产品的程序只需改动少量代码变可迅速做到扩展。

通过标准的实验频率发生器检测,本产品的精确度为千分之一。这部分误差是由于在定时结束后,在读取计数值的这部分时间内,CPU执行时间占用所导致的误差。还有另一个原因就是芯片的硬件误差引起的。前者通过缩短代码,基本达到极限。因此若想再提高误差,只有用更好的运算芯片或硬件中断来处理。

2.3基本流程

用图给出本程序系统的实际的基本的处理流程。

6

(1)频率计程序流程图

(2)可编程频率计使用流程图

7

(3)硬件框架图

2.4进度

原定进度:

8个学时的时间选定硬件课程设计的课题,提出本项目的任务;

16个学时的时间进行课程设计的分析、编程、硬件连接,最后实现频率计的功能。 8个学时的时间编写硬件课程设计报告。

8

实际进度:

我们课上用了4个学时的时间就选择好了我们的硬件设计课题—可编程频率计的设计。课下花了大量的时间编程。

然后是设计阶段,我们开始对可编程频率计的设计进行分析,讨论该如何设计、编程。我们从网上找了一些有用的资料,编程过程中,连接硬件运行过程中也都遇到过一些问题,不过我们还是通过查找资料,相互讨论,与老师交流等方式成功地解决了。设计阶段课上我们花了12个学时调试完成了。

写设计报告我们用了大概8个学时的时间。 分析:

通过原定计划的进度和实际使用的进度我们可以很容易的看出,我们设计的实际进度提前了。

主要原因是:我们迅速地选定课题,之后我们就尽快地投入到了设计当中去。在课题选择这个阶段我们就节约了很大一部分时间。在实际设计阶段,我们不仅仅在实验室里积极认真的调试硬件,改进方式。同时我们在其它时间还查阅了很多关于我们这个课题的相关资料,包括频率计的原理,实现方式,相关的8253和8279的使用等等。这些充分的课余准备使我们在实验室里比较容易地就设计出了我们满意的结果,并且也用了更少的时间。而且有部分实验箱的问题得到了老师的指点。最重要的是我们对实验原理的深刻理解,然后设计好方案思路之后在课下花大量时间编程,而在实验室里主要是调试。

2.5费用

费用预算:

在设计之前,我们预算实际设计操作并完成可编程频率计需要16个学时,合计为800分钟,大概13.3个小时的时间。

预计我们用到的物料主要是实验室里的电脑和实验箱里的仪器,不会有出差的情况,所以也没有出差费的预算。

实际支出:

9

我们的设计的时间是我们使用了12个学时的,合计为600分钟,10个小时的时间。这段时间我们都在实验室里,在电脑上连通实验仪器试验,改进。

在可编程频率计的设计中,我们主要用到的是实验室里的电脑和实验箱里的仪器,并没有什么物料消耗,也没有出差,所以也没有费等支出。

分析:

按照以上预算与实际支出情况,我们的设计经费是有节余的。

实际物料消耗与费用支出与预算基本上一致,而主要有节余的地方是我们比预计花费了更少的时间,预计要16个学时的设计而我们只用了12个学时的时间就完成了。

3开发工作评价

3.1对产品质量的评价

频率计在质量上满足我们预先的需求。而且稳定性好,精确度达到千分之一,多次检测一直达到这个精确值,没出现什么误差。所不足的是仅能检测方波。而且在无法连续检测不断变化的频率,只能检测出稳定的方波,当要检测另一频率时必须拨动开关重新检测。而且检测速度不是很快,大概0.5S。但是,总体上满足产品预先的要求。

3.3对技术方法的评价

本项目用的是HK88TE实验箱里的8088CPU、8253芯片、IO输入芯片、8279芯片、LED数码管、8个开关、连线若干、HK88TE实验平台。

检测工具是:频率发生器

编程工具及语言:用汇编语言,编程平台是HK88TE实验箱配备的软件。 在开发中用到了模块化的思想,将一个一个的实现功能代码做成高内聚低耦合的独立性强的模块,模块可以单独处理,加快了编程效率,增强了扩展功能。由于硬件平台缺少硬件中断功能的缺陷,我们采用软件中断来实现开关、定时的检测。通过循环条件的设定来跳出循环。

10

3.4出错原因的分析

出错情况:

1. 无法取出数据段的数据。 2. 编译通过,运行无法通过。 3. 单步调试通过,全速运行无法进行。 4. 无法显示频率。 5. 启动开关无法检测。 出错原因分析及解决方法:

1. 我一开始定义一个数据段即data segment….data ends,然后取里面的数据,无论如

何都不行,我看了一下实验箱手册里的例子,他们全没用到data段,而是数据段和代码段共用,用ds :code 及push cs,pop ds来解决。因此我分析的结果是实验箱不支持的问题,我在PC机上用汇编均支持。

2. 经老师指点,是因为代码长了,实验箱的监控程序不支持,通过滑动下载软件上的

延迟到高的部分解决了。

3. 我是用一个循环来检测计时器0的输出情况,由于我在循环里忘了加一条IN指令,

而陷入死循环,加了后解决了。

4. 主要是不了解8279的原理及使用方法,还有数码管的编码方式,通过查看文档资

料及摸索解决了。

5. 这个问题跟第3点类似,也是在循环里忘了先用IN指令读取数据,再用AND截取

数据检测。发现后加了IN指令解决了。

4经验与教训

小组成员:刘晓泽 体会:

这是一个小的项目开发,我试着用规范的方法去做,我在项目开始时先想着确定一个题目,老师推荐了几个题目,又要求一个小组只能有一个且不能重复。因此我们选了频率计作为我们的项目。一开始时我并不知道什么是频率计,然后询问了老师。大概明

11

白了,后来在课上我在百度里打频率计,然后在百度百科里看了一下什么叫频率计以及频率计的主要原理是什么,这个比较重要。我觉得做一个陌生的项目,首先搞明白这个项目的概念及原理,这样才能下手。我看了一下我们那个HK88TE这个实验箱,以及实验箱可用的部分,感觉只能完成方波的测试,因此进行了方波的频率计设计。我进行了需求分析,搞明白了我们到底要干什么,以及是否在规定的时间内可行,以及取得所做项目所需的技术知识及资料,这些统统在第一次课后进行了准备。我把老师给的资料全打印下来了。

由于我们做的是频率计,那么必然有显示的输出部分,以及频率的输入部分,还有处理转换这样3个主要模块。这三个模块中所需的知识只有显示部分之前没遇到过。剩下的在上学期的微机原理用过,而且第一次课的时间又熟悉了一下,还是比较熟悉的,忘了的命令字翻翻书也就能解决了,欠缺的是8279这个芯片的使用方法和原理。第一次课后,我便把8279的资料全看了,由于我只用到显示部分,因此主要看显示部分的原理和操作。

第一次课时我并不清楚6个数码管的显示方法,后来仔细看了实验台上的数码管,通过看例子以及自己的推测,发现一个数码管是用1个字节里的数据来显示的,按照数码管上的标号,从a到h,按照顺时针方式旋转,0表示灭,1表示亮,这样的信息用8位数据里的低字节到高字节表示。

我是这样认为的,实验课的时间是十分宝贵的,主要是用来搞硬件的,即主要是用来验证自己对硬件的理解以及调试自己的电路和代码的,不是主要用来编程和看资料的。而实验箱比较贵,听说几千块,而且实验结束或者十分了解实验箱后,实验箱对自己的作用也不大,实验箱主要是教学用,不必一人买一个。不像学习单片机,买个51芯片,自己焊电路那样,可以长期持有,使用。而且用51单片机芯片自己搞一个电子产品,价格也很低,很实用。因此,我在课下尽量地花时间编程和看资料,在课上尽可能地调试程序,以及检验自己的电路。

我在假期时,有自己买过一些单片机芯片自己玩。但是,我跟别人学单片机不太一样。由于自己是计科的,专业方向不同,很难花大量的时间在电子方面。但由于有些兴趣,也自己在假期有空时学学。发现单片机的核心还是编程,当把电路搭好后,原理也明白后,剩下的大量时间是在编程。因此,总的来说对自己的专业方向偏差不大。

我是在网上听说有人用面包板来学习单片机的。就是买上一块面包板和线,由于面包板上有一个个小孔,用线插拔十分方便,不用焊东西,对自己的学习十分有利。然后

12

我就照着别人的推荐买了51单片机,不过这个是国产的STC系列的芯片,因为它是国产,自然网上的官方文档是中文版的,对于英语不好的我来说比较方便。买了一些晶振什么的就在面包板上接起来,然后照着例子看着原理图学习。用的是C语言编程。

后来在实验课上想用C语言,发现实验平台的软件不支持,而我用的芯片是8088CPU。所以最终就用汇编来编程了,尽管过程中有一段痛苦的过程,但是随着我把自己的实验完成,又自己玩了一下其它人做的什么时钟、计算器、电子琴和交通灯,这样我间接在硬件课程的这段时期编了几千行的汇编代码。尽管我自己的实验是只有200行代码,但是我在这几千行的代码编程中中对汇编比较自信,也不再恐惧它了。

我在使用汇编中没用到多少种指令,也就是常用的那20几种。什么MOV、JMP、LEA、RET、CALL、ADD、SUB、MUL、ADD、DIV、IN、OUT、JL、JZ、JA、JNZ、LOOP、INC、DEC、AND、NOT、SLL、SLR、PUSH、POP。

我也就熟悉这么些指令。

我在网上看到的频率计的原理是:通过在单位时间内检测出的频率数,用

其中为测出的方波频率,N为单位时间内的频率数,T为单位时间(项目里为0.5S)。这样求出的即为频率,单位是HZ。

我就用这条几句话的原理进行方波频率计的设计。开始时想自己买芯片来焊(尽管我不是很自信,但是知道一点原理,我觉得可行),但是我们大三上学期的课程太多了,一天8节课,不光有硬件的课程设计,还有软件工程的课程设计,觉得在时间上可能安排不过来。而且这学期的专业课程比较重要,很多都是原理,而且有些课程的老师不错,不花时间的话,可能过了这村就没这店了。我认为本科生与专科生的差别在于理论原理的研究。本科生普遍比职业学校的学生缺少动手时间和经历,而职业学校的学生由于一开始的生源不同,他们在理论学习上的时间要少,学习能力稍差。而缺乏理论原理的学习,在技术上很快会到达瓶颈。而他们再学习能力有限,再自我学习理论原理时就会遇到困难,自学能力也有限。因此,就必须找到一个平衡点。因此,我在不落下平常的课程的学习下,尽可能多地动手做实验,编程。

我把我们的项目分析了一下,发现必须用中断。而实验箱有缺陷,上学期马海波老师教我们微机原理,当时他说我们实验箱缺少中断的连接口,所以我们上学期的实验也就没有中断的实验。中断有两种方法实现,即软中断和硬中断。而硬件中断方式,实验

13

箱无法实现,那么只能采取软件中断。软中断就是用循环来实现,尽管很浪费CPU资源,但是也算是一种响应不错的方法。软中断也是比较不好把握的,因为必须把全局所需要处理的内容的顺序安排好。把需要不断检测及更新的部分全部安排在一起,一次一次地扫描。而其余的安排在这个代码段的外面。

开这门课之前,我在课余时间看了几页反汇编的书,就是看原先C语言编的代码在转成汇编时如何实现的。里面的函数在转成汇编代码时,是在调用前把所谓的参数入栈,然后用CALL命令将程序段调入(在C里叫函数),在程序段的末尾用RET指令返回调用处。我大概看了一些CALL指令,这个指令可以用JMP和PUSH指令代替,其本质是把当前的CPU状态入栈,把IP寄存器内容入栈,然后用JMP跳到相应的标号,即代码段上偏移的地址处执行指令。而RET就是把之前入栈的内容按顺序出栈。由于用这两条指令省事,而且让人更了解代码的内容和思想,我在以后的编码中经常用。

编汇编是十分头疼的事情,至少在开这门课之前。编300行的汇编和编300行的C绝对不是一个数量级的,如果不处理好汇编代码的结构,那么将比较痛苦。

借鉴了这些思想,我采用模块化的思想将这个程序划分成一个个功能独立的代码,用一些PUSH、POP语句充当像C语言中的形参。我尽量将这些功能代码做成像软件工程这门课说的高内聚低藕合的模块。当一个模块有小问题时,影响不大,只修改这个模块即可,而模块又可以迅速地组合,扩展。我用这个方法,在完成自己小组的实验下,自己又做了一些别人的项目内容。而我在这有限的几周内完成了几个项目,当然,交报告肯定只是自己该交的部分,其它的就当自己练练手。学习学到手,毕竟是最重要的,不闭拘于形式。

我平常花比较多的时间在编程,一些开发辅助工具没怎么关注。因此当画我们这个项目的流程图以及原理的逻辑结构图时是用WINDOWS里的画图工具和WORD配合完成的,尽管就三幅图,花了一个下午,可能有4个小时,比较艰难和辛苦。

项目程序分为主程序和功能小程序。通过在主程序中依次调用功能小程序来完成全部功能,旁边也附加大量的注释,方便小组成员的交流,以及代码的修改。

这个程序的主体思想是这样的:

首先用一段循环检测程序段检测是否有开关按键按下,没有就一直循环检测,检测到便对8253赋初始值,让0通道在外界输入1/8MHZ的情况下,通过赋值62500计数,在方式0下产生0.5秒的定时。而计时器0的输出接输入芯片,通过一个循环不断检测计时器0是否定时完毕。而计时器1的CLK1端口接带检测的方波频率,这个计时器是

14

在方式2下工作的,每次频率计工作都赋初始值0给它,让它在单位时间内对产生的脉冲计数。通过里是65535,即

,其中N为最终的计数值,

为计数的最大值,这

是计时器1上读出的计数值,N为测出的频率数。然后

将N转换成8279能显示的数码,最后用8279显示出来。接着继续用一段代码检测在这当中用一个开关负责开启检测和重置。有的话,代码又跳转到最开始执行。即第一次使用拨动开关,不到1秒即出来结果,以后每拨动2次,即可看到结果。

在编程的过程中也遇到不少的问题,例如: 出错情况:

6. 无法取出数据段的数据。 7. 编译通过,运行无法通过。 8. 单步调试通过,全速运行无法进行。 9. 无法显示频率。 10. 启动开关无法检测。 出错原因分析及解决方法:

6. 我一开始定义一个数据段即data segment….data ends,然后取里面的数据,无论如

何都不行,我看了一下实验箱手册里的例子,他们全没用到data段,而是数据段和代码段共用,用ds :code 及push cs,pop ds来解决。因此我分析的结果是实验箱不支持的问题,我在PC机上用汇编均支持。

7. 经老师指点,是因为代码长了,实验箱的监控程序不支持,通过滑动下载软件上的

延迟到高的部分解决了。

8. 我是用一个循环来检测计时器0的输出情况,由于我在循环里忘了加一条IN指令,

而陷入死循环,加了后解决了。

9. 主要是不了解8279的原理及使用方法,还有数码管的编码方式,通过查看文档资

料及自己摸索解决了。

10. 这个问题跟第3点类似,也是在循环里忘了先用IN指令读取数据,再用AND截取

数据检测。发现后加了IN指令解决了。

经过这些过程我们小组便在第三周的开始接受老师的检验并通过了。老师拿来一个频率发生器,开到方波进行检验,在我们的频率计可显示的范围内通过了。

后来我们便是作报告,以及自己做自己想做的其它实验。

15

在本次课程中我学到了和熟悉了不少汇编指令,而且汇编的编程积累量也有两、三千行,提高了不少的动手能力以及独立思考、解决问题的能力。感觉收获挺大的。

建议:

建议以后实验箱的功能更多点,像8279中断这种功能缺陷,我们也就缺少了一次用中断的机会。

建议实验箱能允许的代码多些,这样我们可以发挥自己的想象和能力编出更加多彩的程序。

建议学校安排更多的实验课,来弥补我们在理论学习下缺少实践的情况。少开一些与专业课相差比较大的学科。

建议课程安排合理一些,将每天的课安排平均一些,像我们上半学期课很多,下半学期课很少,这样我们充分消化和学习的时间有冲突。

建议多些扩展的实验模块,例如像数码管这样的模块比较少,学校是否可以多采购一些这样的模块再课程设计时让学生尽可能地发挥想象力和创造力。我觉得创造力的基础是环境和有一定学习知识基础。否则写写报告只是空谈。

建议扩展一些更有趣的模块,如LCD屏(黑白或彩色的),无线网络模块。 建议尽可能多地提供技术文档,例如尽可能多地提供实验室里的所有实验箱的文档,让学生能尽可能地自学里面的东西。

这就是我个人的经验、体会、教训和建议。

小组成员:刘春 体会:

在做“可编程频率计的设计”这个课题时,我学到了很多。很多知识确实只有从实践中获得,想要只从书本上学到,那是没办法的。虽然以前我们在微机原理与接口技术可课上也学习了很多硬件知识,包括 8086、8253等等,还到实验室里做过很多实验,但是我们这个课题也用到了我们没有学过,没有用过的硬件—8279键盘显示器。

对硬件知识我最多的收获就是8279了。一开始我还是不懂8279的,在老师给的资料里有这方面的用法。这次我对硬件知识收获最多的就是明白了很多8279的功能,主要是显示功能。在显示数字时,数字被分成了7个部分,外加一个小数点,由八位代表这八个部分,0表示不亮,1表示亮,比如:00000000B表示全部熄灭,00000110B表示1,01011011B表示2等等。在显示数字时,我遇到了一个问题,就是当我输出后2

16

位之后要输出3,4位数字是,8279输不出来。当时我觉得很奇怪,后来我知道8279显示第3,4位是不显示出来的。而键盘上的3,4位数字在实际的编程中却是第5,6位。这一点在当时我困惑了好久,后来我问了一下同学,然后又上网查了一下才明白过来。在8279初始化的时候,输入控制端的扫描频率38H我就不懂了,因为编程的时候直接用就可以了,所以我也没有仔细研究,我想大概是显示数字的速度吧。

在可编程频率计的设计中,还用到了8253和I/O输入接口。在上学期的微机原理与接口技术课,我们也做了很多硬件设计实验,对汇编语言和实验仪器也有一定的了解,知道一些8253和I/O接口的原理与使用。现在通过这个课题的设计使我对汇编语言编程和硬件的原理与使用有了更深的认识。

在刚开始上这门课的时候,当时我考虑到我的专业是计算机科学与技术,选的又是软件工程方向,所以对这门课没有引起足够的重视。以前我的家里人在电话里也叫我也软件、硬件一起学,后来大家都很认真地在查找资料,设计汇编程序,一起讨论,我也下定决心认真学,即使不能做到对各个语句、各个硬件了如指掌的地步,但是也要知道他们的基本原理和使用方法吧。刚开始还有些吃力,毕竟学习微机原理与接口技术这门课已经过去了一个暑假,很多知识忘记了,比如8253初始化的各种命令字等等。后来看微机原理与接口技术的书,对汇编语言更加熟悉后,对汇编语句编写程序,硬件连接就很轻松了。

在以前学习微机原理与接口技术的时候,学了很多汇编语言,虽然也有实验课,但

是还有很多语句不熟,甚至有些语句根本就不知道什么意思,不会用。在这次设计中也用到了不少汇编语句,有知道的,不熟的,也有一些我根本不知道什么意思。通过学习与讨论,我熟悉了很多汇编语句,也学习了很多语句,在汇编程序知识上拓展了很多,学习了很多。对于8253的初始化,我在学习微机原理与接口技术的时候就很清楚了,现在就又学习了一遍,加深印象。有些细小的知识,应用,比如分离一个数的各个位就需要用到除法div,然后将各个位一个一个的显示出来。除法div根据除数、被除数的位不同而使用方法也有所不同,如果被除数是16位,商或余数都是八位,那么就可以将被除数放在ax中,指令:div 源(除数),计算结果是商放在al中,余数放在ah中。如果商或余数超过8位,那么被除数的低16位就必须放在ax中,高16位必须放在dx中,如果被除数低于16位,那么高位dx就得赋值00H,指令:div 源(除数),计算结果是商放在ax中,余数放在dx中。如果还用前面那种除法,就会出现计算结果溢出,程序会卡在这一语句上。当时我用除法显示一个5位数,8279显示不出来,我就按F7

17

来跟踪,就发现程序卡在了div 语句上了。还有关于有符号的除法,跟这个设计没多少关系,所以我也没有做过多少研究。温故而知新嘛,现在我对除法div语句已经很了解了。当然,有符号的除法还得查资料。

我在这次硬件课程设计中,收获最多的还是动手能力,在学校里除了实验课,动手

的机会还真不多。有些书本知识学习的很好的同学,一看到那些复杂的电路,接口,连接线路就不知所措,毕竟书本知识和实际实验器件还是有差别的,有些差别还挺大的。通过这次实际动手,我的动手能力也提升了不少啊。

对今后的项目开发工作的建议:

我觉得硬件设计最看重的是亲自动手能力,不管你对课题了解得怎么样,一定要亲

自动手写汇编程序,亲自连接硬件,亲自调试。

鉴于亲自动手对项目开发工作的重要性,我觉得我们应多上实验课,多对实际硬件

操作,书本上的知识很重要,但实际操作也同样重要。并且参加工作,公司看重的也主要是你的实际动手能力。

18

5附录—程序清单及结构图

5.1逻辑结构图及流程图

(1)频率计程序流程图

19

(2)可编程频率计使用流程图

(3)硬件框架图

5.2程序清单

Z8279 D8279

equ 20ah ;命令字地址 equ 208h ;数据地址

equ 00h ;左边输入,八位显示,外部译码八位显示 equ 38h ;扫描频率

20

LEDMOD LEDFEQ

Clock0 Clock1

equ 210h ;定时器0的地址 equ 211h ;定时器1的地址

Clock2 equ 212h ;定时器2的地址 clockc

equ 213h ;计数器控制端口地址

Clock0Mode equ 00110000b ;通道0,先读写低位再读写高位,方式0,2进制 Clock1Mode equ 01110100b ;通道1,先读写低位再读写高位,方式2,2进制 Clock2Mode equ 10110100b ;通道2,先读写低位再读写高位,方式2,2进制 Clock1Read equ 01000100b ;通道1计数器锁存,供CPU读

Clock0Count equ 0f424h ;计数器0计数值62500,在1M/8Hz下0.5秒所需计数值) Clock1Count equ 0 ;计数器1计数值 Clock2Count equ 16 ;计数器2计数值 InputAdr equ 218h ;IO输入端口地址

StartWork equ 01h ;开始工作的检测状态(通过与运算截获第一位) Clock0End equ 02h ;检测计数器0是否工作结束(通过与运算截获第二位) Data_K equ 10 ;变量K,初始值10

CODE SEGMENT ;主函数

MAIN PROC FAR

ASSUME CS:CODE DS:CODE START: push cs pop ds

call Is_Start ;检测是否按下开始脉冲键

call InitClock2 ;初始化计数器2,并产生可编程的方波频率 call InitClock0 ;初始化计数器0 call InitClock1 ;初始化计数器1

21

call CheckClock0Over ;检测计数器0是否工作结束,并将读取的结果存入变量a中 call Display ;显示变量a的值到LED上 EndTime:

mov dx,InputAdr ;IO输入端口地址

in al,dx

and al,StartWork ;开始工作的检测状态(通过与运算截获第一位) cmp al,01h ;判断是否为高电平 jz START

jmp EndTime MAIN ENDP

;这个函数负责将提取出的变量a的值输出到LED上,最大16位 Display proc near

;初始化8279

mov di,ax ;保存频率至BX

mov al,LEDMOD ;左边输入,八位显示,外部译码八位显示 mov dx,Z8279 out dx,al

mov al,LEDFEQ ;扫描频率 out dx,al

;向LED输出数据,显示结果 mov cx,5 First1:

mov ax,di ;保存频率至AX mov dx,00h mov si,Data_K

div si

mov di,ax ;将商保存至BX mov ax,dx ;将余数保存至AX

22

lea bx,LED add ax,bx mov bx,ax mov ax,[bx]

OutPut1: mov dx,D8279 ;8279数据端口

out dx,al

dec cx cmp cx,3 ja Continu1 lea bx,Signed mov ax,[bx] cmp ax,0 ja Next1 jmp Next2 Continu1:

jmp First1

Next1: mov dx,D8279 mov al,00h

out dx,al out dx,al lea bx,Signed

mov ax,00h

mov [bx],ax Next2: cmp cx,0 ja Continu1

jmp Next3

Next3:

;空操作 ;空操作 23

mov dx,D8279 mov al,00h

out dx,al ;空操作 lea bx,Signed

mov ax,[bx] inc ax mov [bx],ax ret Display endp

;检查是否按下开始按钮,判断脉冲信号 Is_Start proc near Again:

mov dx,InputAdr ;IO输入端口地址

in al,dx

and al,StartWork ;开始工作的检测状态(通过与运算截获第一位) cmp al,00h ;判断是否为低电平 jz EndCheck jmp Again

EndCheck: ;判断结束,可以工作了 ret Is_Start endp

;设置计数器0的工作方式及计数值 InitClock0 proc near 次

mov dx,clockc ;计数器控制端地址

mov al,Clock0Mode ;通道0,先读写低位再读写高位,方式0,2进制,只定时1

out dx,al

mov dx,Clock0 ;定时器0的地址

24

mov ax,Clock0Count ;计数器0计数值62500,在1M/8Hz下0.5秒所需计数值) out dx,al mov al,ah out dx,al ret

InitClock0 endp

;设置计数器1的工作方式及计数值 InitClock1 proc near

mov dx,clockc ;计数器控制端地址

mov al,Clock1Mode ;通道1,先读写低位再读写高位,方式2,2进制 out dx,al

mov dx,Clock1 ;定时器1的地址

mov ax,Clock1Count ;计数器1计数值0 out dx,al mov al,ah out dx,al ret

InitClock1 endp

;设置计数器2的工作方式及计数值,工作频率1MHZ InitClock2 proc near

mov dx,InputAdr ;IO输入端口地址 in al,dx mov cl,2 not al

and al,11111100b

shr al,cl ;右移两位 mov ah,00h

mov cx,ax ;保存频率倍数

25

mov dx,clockc ;计数器控制端地址

mov al,Clock2Mode ;通道2,先读写低位再读写高位,方式2,2进制 out dx,al

cmp cx,0 je CX_1 jmp Next CX_1:

mov cx,1 ;1倍频 Next:

mov ax,Clock2Count ;计数器2计数值16 mov dx,00h mul cx

mov dx,Clock2 ;定时器2的地址 out dx,al mov al,ah out dx,al ret

InitClock2 endp

;检测定时器0是否定时0.5秒结束 CheckClock0Over proc near

mov dx,InputAdr ;IO输入端口地址 Compare:

in al,dx

and al,Clock0End ;检测计数器0是否工作结束(通过与运算截获第二位)

cmp al,00h ;比较该位是否为低电平 je Compare

mov dx,clockc ;计数器控制端地址

mov al,Clock1Read ;设置计数器1锁存,供CPU读 out dx,al

26

mov dx,clock1 ;定时器1的地址 in al,dx ;读低位

xchg ah,al ;交换AL与AH的值 in al,dx ;读高位

xchg ah,al ;交换AL与AH的值 mov cx,ax ;用CX临时储存AX mov ax,0ffffh ;将最大值65535赋值给AX sub ax,cx ;得出计数的最终频率的一半

mov cx,2 ;乘数2 mov dx,00h

mul cx ;ax * 2 ret

CheckClock0Over endp

LED db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,67h ;0~9 LED数码管显示 Signed db 01h ;使用标志 CODE ENDS END START

27

本文来源:https://www.bwwdw.com/article/8lg6.html

Top