基于单片机的八路智能抢答器的设计_毕业设计 下载本文

言程序具有完整的程序模块结构,从而为软件开发中采用模块化程序设计方法提

供了有力的保障。与汇编语言相比,有如下优点:

对单片机的指令系统不要求了解,仅要求对5l的存储器结构有初步了解,至于寄存器分配、不同存储器的寻址及数据类型等细节均由编译器管理,降低了对编程人员的要求。

程序有规范的结构,可分为不同的函数。这种方式可使程序结构化,将可变的选择与特殊操作组合在一起,改善了程序的可读性。

编程及程序调试时间显著缩短,从而提高效率。提供的库包含许多标准子程序,具有较强的数据处理能力,已编好程序可容易的植入新程序,因为它具有方便的模块化编程技术。

单片机c语言作为一种非常方便的语言而得到广泛的支持,c语言程序本身并不依赖于机器硬件系统,基本上不做修改就可根据单片机的不同较快地移植进来。

前面已经提及,用单片机汇编语言编写的程序代码虽然效率高,但学习起来相对难度较大,而且对于一个大型项目,如果完全采用汇编语言来编程,就显得很繁琐,尤其是遇到算法方面的问题时,汇编语言根本就应付不了。况且现在单片机的主频在不断的提高,在高频率时钟的作用下,我们完全不需要那么高效率的代码;另外,单片机的ROM和RAM空间也在不断地增加,足够装得下你用c语言写的任何程序代码,单片机c语言相关的资料又多又好找,可移植性非常好,比如只需要改变一个输入输出口写个温度传感器的程序在任何一个单片机上都能使用。由此可见用单片机C语言进行程序设计,已成为单片机软件开发的一个主流。当然,有时候用单片机C语言也不能够实现所有要编写程序的功能,比如当想编写一个精确控制的定时程序时,用起汇编语言来还是比较方便的。

综上所述,单片机的4种编程语言各有各的优缺点。现实中,人们用的单片机编程语言最多的是c语言和汇编语言,作为单片机简单的开发或者用单片机设计的小型系统,还是应该用汇编语言,不一定要很精很熟悉,但有一定的了解就可以进行编程练习。因为汇编语言程序除了具有简洁明快、跳跃性强、占ROM资源少等优点以外,还因它和单片机底层硬件紧密联系,可以让初学者更加了解单片机硬件系统及各种资源,熟悉各个功能模块的作用,从而为编出更高效率的

程序打好扎实的基础。

4.2系统程序设计

本系统由于较简单,程序内容相对较少,本着简单易懂的原则,所以采用汇编语言实现其软件的设计。

进行汇编语言程序的编写应遵循以下四个步骤:

构思:其主要工作是分析题意,制作程序流程图。流程图的逻辑必须符合题意要求。

布局:其主要工作是分配单片机资源,包括程序地址分配,片内储存单元分配。如确定个程序段起始地址,确定某一片内RAM单元作为数组指针等。

编写:根据布局安排,将程序流程图转换为单片机指令。做到在流程图各环节相应指令对应的同时,提高运用指令的技巧性。

修改:对程序进行编译和试运行。如果运行不正确的话,一定要找出其中的差异来。要知道,编写程序就是不断的尝试错误,在调试中不断修改,提供程序的可靠性欲程序结构的合理性。

该系统应用程序由主程序和子程序模块组成。系统应用程序采用结构化模块设计,从功能上看,主要包括:主程序、电源检测程序、报警程序、控制程序等。下边对程序流程进行介绍。

4.3主程序

智能抢答器在正常工作的情况下,首先对控制系统进行初始化,然后进行键盘扫描,判断主持人是否按下了“开始抢答”按键,如果按键没有按下,则执行非法抢答查询子程序,判断是否有选手发生了抢答现象;如果“开始抢答”按键按下则执行倒计时子程序和显示子程序,并调正常抢答处理子程序。其中倒计时程序包括抢答倒计时和回答倒计时。

任何控制系统开始正常工作前都必须要进行初始化,在其它应用程序确定之后,本部分程序设计在于协调各部分程序之间的关系,以促使各部分程序之间有序运行,达到进一步优化程序设计的目的。

本部分程序设计主要包括中断的初始设置和相关系统运行参数的初始设置两大部分。

中断初始设置中除了设置单个中断源是否允许中断和各个中断源互相之间

的优先级关系外,针对于某一类具体的中断源,还有其特定的设置要求。在本文的程序设计中,主要体现在定时/计数器中断和外部中断两类中断源的特定设置。

定时/计数器中断的设置:

由于程序中均使用两个定时/计数器的定时功能,在使用前,需要设置两个定时/计数器为定时功能模式;在确定了定时功能模式后,定时/计数器将有多种工作方式可供选择。本文采用方式1工作方式,在此工作方式下,单片机提供一个16位的定时/计数器,其计数寄存器的位数为16位。该工作方式下,定时初值没有重新装填的功能。定时的初始值存放在TH0、TH1、TL0和TL1中。定时/计数器还需要设定其启动方式,本文中采用软件启动方式。这些功能的设定由定时/计数器方式寄存器TMOD设定。具体实现为:MOV TMOD, #00010001B ,定时/计数器的启动由定时/计数器控制寄存器TCON中的TR0和TR1的置位实现。

外部中断的设置:

外部中断设置除了设定中断优先级和中断允许外,还需要设定中断触发方式。本文程序设计中采用边沿触发方式。通过定时/计数器控制寄存器TCON中的IT0和IT1确定。置位表示边沿触发方式。反之为电平触发方式。指令的实现方法为: SETB IT0。

无论哪种中断请求,当系统响应其请求时,系统都会自动地将程序指针PC的值按照中断向量表调整为该中断源的中断服务程序的入口地址值。在51系列单片机中,在每一个中断服务程序入口地址后,每一个中断服务程序被分配的程序空间大小仅为8字节,不足以放下中断服务程序。故需使用跳转指令跳转至存储器空间中的适当位置。

当某中断请求被响应时,系统将暂时停止执行当前的程序,转而执行相应的中断服务程序。这时将涉及到断点保护和现场保护的问题。断点保护由单片机内部自动完成,不需要外界干预。但是,现场保护则需由程序设置,常用PUSH和POP堆栈指令完成。堆栈的深度也可以根据设计的实际情况重新设定。如果不进行设定,SP的值将为07H,堆栈深度为24B。

以上是中断初始设置时需要注意的问题,除此之外,程序在初始化中,还需要设定大量的程序运行参数等。设定这些运行参数后,系统程序在运行时,就可

以调用这些数据,进行相关的运算输出控制结果。可见,这些值设定的好坏将直接关系到程序是否可以顺利执行及程序控制效果的好坏。

该智能抢答器的初始化子程序主要是两个定时器和两个外部中断的初始化。 主程序流程图如图4-1所示。

图4-1 主程序流程图

主程序:

OK EQU 20H ;抢答开始标志位 RING EQU 22H ;响铃标志位

DATA0 EQU 36H ;抢答按键口数据存放地址 ORG 0000H

AJMP MAIN