|
一、课程设计(论文)的内容 以89C51单片机为核心,制作一个LED显示的双精度电子称设计。具体要求: 1、用4只LED数码管输出显示重量。 2、可通过按键设置重量功能,且停闹无须手工操作。 3、可通过按键设置重量的单位。 4、称重时的误差少于10g。 二、课程设计(论文)的要求与数据 1、系统框图、方案论证; 2、各部分的硬件电路原理图及功能说明; 3、程序流程图及分析; 4、系统调试与分析; 5、源程序清单。 三、课程设计(论文)应完成的工作 1. 画出系统框图,论证系统设计方案; 2、器件选型,给出系统各个组成部分的硬件电路原理图; 3、给出程序流程图; 4、进行源程序的设计及调试; 5、撰写课程设计报告的。 四、课程设计(论文)进程安排 序号 | 设计(论文)各阶段内容 | 地点 | 起止日期 | 1 | 选择课题,明确设计要求,查阅资料 | 校内 | 5.12 | 2 | 方案论证、系统总体设计 | 校内 | 5.13~5.14 | 3 | 硬件电路原理图设计 | 校内 | 5.15~5.16 | 4 | 程序流程图的设计、源程序的编制及系统调试 | 校内 | 5.17~5.18 | 5 | 撰写课程设计报告 | 校内 | 5.19~5.20 | 6 | | | |
五、应收集的资料及主要参考文献 [1] MCS-51系列单片微型计算机及其应用 [2] MCS-51系列单片机实用设计 发出任务书日期: 2017年 05月12 日 指导教师签名: 计划完成日期: 2017年 05月20 日 教学单位责任人签章:
目录 1系统分析 1.1功能要求 1.2方案论证 2 系统设计 2.1 系统硬件电路的设计 2.2 系统程序的设计 9 3 结束语 18 参考文献 19 附录1材料清单 20 附录2电路原理图 21 附录3实物图 22 附录4主要程序清单 23
1系统分析 1.1功能要求 本课题的主要设计思路是:利用压力传感器采集因压力变化产生的电压信号,经过电压放大电路放大,然后再经过模数转换器转换为数字信号,最后把数字信号送入单片机。单片机经过相应的处理后,得出当前所称物品的重量及总额,然后再显示出来。此外,还可通过键盘设定所称物品的价格。 本文主要主要以下几个方面的工作: (1)详细讲解了称重器工作原理。 (2)对称重器系统进行总体方案的设计。 (3)对于称重器的硬件系统,重点介绍关于精度、转换速率的压力传感器和A/D转换模块器件的选取。 (4)对于称重器的软件系统,通过解说LCD液晶显示的使用及键盘的工作原理,对于主程序的编写与调试提供重要的依据。 (5)依据称重系统的总电路,通过Keil软件C语言编程和Proteus仿真,实现模拟的称重显示。 (6)对称重系统的测量值与显示值的差值,进行系统的调试与误差校正。 主要技术指标为:称量范围0~10Kg;分度值0.01kg;精度等级Ⅲ级;电源DC1.5V(一节5号电池供电)。 这种高精度智能电子秤体积小、计量准确、携带方便,集重量称量功能与价格计算功能于一体,能够满足商业贸易和居民家庭的使用需求 图1.1设计思路框图
1.2方案论证 数码管显示。结构如图1.2所示:
图1.2数码管显示方案 此方案利用数码管显示物体重量,简单可行,可以采用内部带有模数转换功能的单片机。此设计的硬件部分简单,接口电路易于实现,并且在编程时大大减少程序量,在电路结构上只有简单的输出输入关系。缺点是:硬件部分简单,虽然可以实现电子称基本的称重功能,但是不能实现外部数据的输入,无法实时地设定各种控制参数。由于数码管只能实现简单的数字和英文字符的显示,不能显示汉字以及其他的复杂字符,不能达到显示购物清单的要求。又因为采用了具有模数转换功能的单片机,系统电路过于简单,系统硬件的扩展必受到限制,电子秤的功能过于单一,达不到设计的标准。 1
2 系统设计 2.1 系统硬件电路的设计 2.1.1 AT89S52的最小系统电路构成 AT89S52单片机的最小系统由时钟电路、复位电路、电源电路及单片机构成。单片机的时钟信号用来提供单片机片内各种操作的时间基准,复位操作则使单片机的片内电路初始化,使单片机从一种确定的初态开始运行。 单片机的时钟信号通常用两种电路形式得到:内部振荡方式和外部振荡方式。在引脚XTAL1和XTAL2外接晶体振荡器(简称晶振)或陶瓷谐振器,就构成了内部振荡方式。由于单片机内部有一个高增益反相放大器,当外接晶振后,就构成了自激振荡器并产生振荡时钟脉冲。 当单片机的复位引脚RST出现2个机器周期以上的高电平时,单片机就执行复位操作。如果RST持续为高电平,单片机就处于循环复位状态。根据应用的要求,复位操作通常有两种基本形式:上电复位和上电或开关复位。上电复位要求接通电源后,自动实现复位操作。 上电或开关复位要求电源接通后,单片机自动复位,并且在单片机运行期间,用开关操作也能使单片机复位。单片机的复位操作使单片机进入初始化状态,其中包括使程序计数器PC=0000H,这表明程序从0000H地址单元开始执行。 系统复位是任何微机系统执行的第一步,使整个控制芯片回到默认的硬件状态下。51单片机的复位是由RESET引脚来控制的,此引脚与高电平相接超过24个振荡周期后,51单片机即进入芯片内部复位状态,而且一直在此状态下等待,直到RESET引脚转为低电平后,才检查EA引脚是高电平或低电平,若为高电平则执行芯片内部的程序代码,若为低电平便会执行外部程序。
图2.1AT89S52最小系统电路 2.2.2 A/D转换器与AT89S52单片机接口电路 AD574是美国Analog Device公司生产的12位单片A/D转换器。它采用逐次逼近型的A/D转换器,最大转换时间为25us,转换精度为0.05%,所以适合于高精度的快速转换采样系统。芯片内部包含微处理器借口逻辑(有三态输出缓冲器),故可直接与各种类型的8位或者16位的微处理器连接,而无需附加逻辑接口电路,切能与CMOS及TTL电路兼容。AD574采用28脚双列直插标准封装。
图2.2AD574芯片引脚图 A/D574有5根控制线,逻辑控制输入信号有: A0:字节选择控制信号。 CE:片启动信号。 /CS:片选信号。当/CS=0,CE=1同时满足时,AD574才处于工作状态,否则工作被禁止。 R/-C:读数据/转换控制信号。 12/-8:数据输出格式选择控制信号。当其为高电平时,对应12位并行输出;为低电平时,对应8位输出。 当R/-C=0,启动A/D转换:当A0=0,启动12位A/D转换方式;当A0=1,启动8位转换方式。 当R/-C=1,数据输出,A0=0时,高8位数据有效;A0=1时,低4位数据有效,中间4位为0,高4位为三态。 输出信号有: STS:工作状态信号线。当启动A/D进行转换时,STS为高电平;当A/D转换结束时为低电平。则可以利用此线驱动一信号二极管的亮灭,从而表示是否处于A/D转换。 由于对AD574 的8、10、12引脚的外接电路有不同连接方式,所以AD574与单片机的接口方案有两种,一种是单极性接法,可实现输入信号0~10V或者0~20V的转换;另一种为双极性接法,可实现输入信号-5~+5V或者-10~+10V之间转换。本次设计采用单极性接法。
图2.3 AD574与AT89S52的接线图 根据芯片管脚的原理,无论启动、转换还是结果输出,都要保证CE端为高电平,所以可以将单片机的/RD引脚和/WR端通过与非门与AD574的CE端连接起来。转换结果分高8位、低4位与P0口相连,分两次读入,所以12/-8端接地。同时,为了使CS、A0、R/-C在读取转换结果时保持相应的电平,可以将来自单片机的控制信号经74LS373锁存后再接入。CPU可采用中断、查询或者程序延时等方式读取AD574的转换结果,本设计采用查询方式。 2.1.3 显示电路与AT89S52单片机的接口电路
图2.4 单片机与LCD接线图 3.4 键盘电路与AT89S52的接口电路设计 键盘一般是由若干按键组成的开关矩阵,若按照其接线方式的不同,可分为两种: 一种是独立式接法,一种是矩阵式接法;若按照按键的结构原理,可分为两类:一类是触点式开关按键,如机械式开关、导电橡胶式开关等,一类是无触点式开关按键,如电气式按键、磁感应按键等。前者造价低,后者寿命长。 按键按下时,与此键相连的行线与列线导通,行线在无键按下时处于高电平。显然如果让所有的列线也处在高电平,那么按键按下与否不会引起行线电平的变化,因此,必须使所有的列线处在低电平。只有这样,当按键按下时,该键所在的行电平才会由高电平变为低电平。CPU根据行电平的变化,便能判定相应的行有键按下。 对应键盘的相应取决于键盘的工作方式,键盘的工作方式应根据实际应用系统中CPU的工作情况而定,其选取的原则既要保证CPU能及时响应按键操作,又不要过多的占用CPU的工作时间。通常,键盘的工作方式有3种,即编程扫描、定时扫描和中断扫描。 ① 编程扫描方式:利用CPU完成其他工作的空余时间,调用键盘扫描子程序来响应键盘输入要求。在执行键功能程序时,CPU不再响应键输入要求,直到CPU重新扫描键值为止。 ② 定时扫描方式,定时扫描方式就是每隔一段时间对键盘扫描一次,它利用单片机内部的定时器产生一定时间(列如10ms)的定时,当定时时间到,就会产生定时器溢出中断。CPU响应中断后对键盘进行扫描,并在有键按下时识别出该键,再执行该键的子程序。 ③ 中断扫描方式:采用上述两种扫描方式时,无论是否有键按下,CPU都要定时扫描键盘,而单片机应用系统工作时,并非经常需要键盘输入,因此,CPU经常处于空扫描状态。为提高CPU工作效率,可采用中断扫描工作方式。其工作过程如下:当无键按下时,CPU处理自己程序,当有键按下时,产生中断请求,CPU转去执行键盘扫描子程序,并识别键号。 说明此(低电平)行没有键被按下。接着进行下一行“0”行扫描与列读入,知道4行关不检查完为止,若无键按下,则返回。 矩阵式键盘的结构与工作原理: 在键盘中按键数量较多时,为了减少I/矩阵式键盘有两种识别键是否被按下的方法:行扫描法和线反转法。行扫描法又称逐行零扫描查询法,及逐行输出行扫描信号“0”,使各行依次为低电平,然后分别读取列数据,检查此(低电平)行中是否有键被按下。如果读得某列线为低电平,则表示此(低电平)行线与列线的交叉处有键按下,再对该键该键译码计算,得到键值,然后转入该键的功能子程序入口地址;如果没有任何一根列线为低电平,则O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。 矩阵式键盘的按键识别方法 :确定矩阵式键盘上何键被按下介绍一种“行扫描法”。行扫描法 行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法,如下图所示键盘,介绍过程如下。判断键盘中有无键按下 将全部行线R0-R3置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。 判断闭合键所在的位置 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。 在本系统中键盘采用矩阵式键盘并采用编程扫描的工作方式。键盘为4 X 4键盘,包括0、1、2、3、4、5、6、7、8、9、十个数字及确认和清除键。
图2.5 单片机与键盘接口电路 各个按键的功能说明: 数字键:.、0、1、2、3、4、5、6、7、8、9被按下时直接显示在LCD液晶显示屏上。 启动键:当按下此键时,LCD液晶显示开启。 单价键:当此按键被按下时,此刻要求输入称重物品单价,即要求按下数字键。 确定键:前提是单价已输入完毕,当此按键被按下时,LCD屏幕显示当前称重物品的总价格。 总价键:当称重物品单价不变、重量改变时,按下此按键时,LCD液晶屏上显示当前重量物品的总价格。 清除键:当此键按下时,单价及总价处的显示清零。 2.2 系统程序的设计 2.2.1 主程序设计 在单片机应用系统的开发中,软件的设计是最复杂和困难的,大部分情况下工作量都较大,特别是对那些控制系统比较复杂的情况。如果是机电一体化的设计人员,往往需要同时考虑单片机的软硬件资源分配。本系统的软件设计主要分为系统初始化、按键、显示处理及信号频率输入处理。 程序设计是一件复杂的工作,为了把复杂的工作条理化,就要有相应的步骤和方法。其步骤可概括为以下三点: (1) 分析系统控制要求,确定算法:对复杂的问题进行具体的分析,找出合理的计算方法及适当的数据结构,从而确定编写程序的步骤。这是能否编制出高质量程序的关键。 (2) 根据算法画流程图:画程序框图可以把算法和解题步骤逐步具体化,以减少出错的可能性。 (3)编写程序:根据程序框图所表示的算法和步骤,选用适当的指令排列起来,构成一个有机的整体,即程序。 程序数据的一种理想方法是结构化程序设计方法。结构化程序设计是对利用到的控制结构类程序做适当的限制,特别是限制转向语句(或指令)的使用,从而控制了程序的复杂性,力求程序的上、下文顺序与执行流程保持一致性,使程序易读易理解,减少逻辑错误和易于修改、调试。根据系统的控制任务,本系统的软件设计主要由主程序、初始化程序、A/D转换子程序、键盘扫描子程序和显示子程序等组成。 2.2.2 C语言在单片机中的应用 C语言是一种通用的计算机程序设计语言,在国际上非常流行。它既可以用来编写计算机的系统程序,也可以用来编写一般的应用程序。以前计算机的系统软件主要用汇编语言编写,单片机应用系统更是如此。C语言是当前最流行的程序设计语言,它像其它高级语言一样,面向用户,面向解题的过程,编程者不必熟悉具体的计算机内部结构和指令;C语言又像汇编语言一样,可以对机器硬件进行操作。如进行端口0,1操作、位操作、地址操作,并可内嵌汇编指令,将汇编指令当作它的语句一样。我们知道,汇编语言将涉及计算机硬件,所以C语言又像低级语言一样,可以对计算机硬件进行控制,因此人们把它称为介于高级语言与低级语言之间的一种中级语言。正是因为C语言具有这样的特性,所以很适合编写要对硬件进行操作的软件程序。本文采用C语言进行编写.因为经系统软件比较,本系统存储量较大,因此必须应用C语言编程了。 4.1.2 电子称的软件设计与实现 电子称软件设计均采用模块化设计,整个程序包括主程序、A/D转换模块程序、键盘扫描程序、液晶显示子程序等模块。所有程序均采用C语言编写。电子计价秤的软件设计思路说明如下:主程序的作用为程序初始化,计算单价×物体重量(单价通过键盘给出,物体重量通过压力传感器获得),并实时显示十进制的物重,单价,总价。设定T0为计数工作方式,T1为定时工作方式。其中R0为标志位寄存器当为OOH时为正常显示方式。当为01H时为累计显示方式,在T1定时中断程序中。一秒钟采样物料重量(已转成脉冲频率),并赋值重量计算RAM区和显示RAM区。在INTO外部中断程序中,采样单价并赋值单价计算。 2.2.3 系统主程序流程图 主程序流程图给出了系统工作的基本过程,描述了信号的基本流向,起到一个向导的作用。 本系统的软件系统主要可分为主程序和定时器中断程序两大模块。在程序过程中,加入了抗干扰措施。下面对部分模块作介绍。
图2.6 称重总设计的仿真图
图2.7 系统总程序图 2.2.4 系统子程序设计 系统子程序主要包括A/D转换启动及数据读取程序设计、键盘输入控制程序设计以及显示程序设计等。 2.2.5 A/D转换启动及数据读取程序设计 A/D转换子程序主要是指在系统开始运行时,把称重传感器传递过来的模拟信号转换成数字信号并传递到单片机所涉及到的程序设计
图2.8 A/D转换启动及数据读取程序流程图
图2.9 A/D0832转换后的显示图像
图2.10 A/D574转换后的显示图像 2.2.6 显示程序设计 显示子程序主要是来判断是否需要显示,以及如何去显示,也是十分重要的程序之一。
图2.11 显示子程序流程图
图2.12 显示启动按键按下后
图2.13 显示欢迎界面 2.2.7 键盘输入控制程序设计 键盘电路设计成4X4矩阵式,由键盘编码方式可以得出0,1,2,3,4,5,6,7,8,9以及启动等功能选择键。在程序中可以先判断按键编码,然后根据编码将键盘代表的数值送到相应的存储单元,再进行功能选择或数据处理。 矩阵式键盘又叫行列式键盘。就是用I/O口线组成行、列结构,按键设置在行列的交点上。在按键较多时多用矩阵键盘,可以节省I/O口线。列如:占用8个I/O口线的4×4矩阵式结构可以构成16个键的键盘。当有键按下时,要逐行或逐列扫描来判断是哪个按键按下。通常的扫描方式有扫描法和反转法。
图2.14 键盘逐行扫描过程 3 结束语 随着全球数字化技术的不断发展,电子衡器已经在我们的生活各个领域得到了广泛的应用,从工业贸易到能源交通都能看到电子衡器的技术应用。本文着眼于目前中小型市场商用电子称智能化低、精度差、易损坏等特点,研发设计了基于AT89S52单片机的双精度电子称。 双精度电子称是针对目前中小型市场上现有的衡器无法同时运用于称量微重物理和较重物体而研发的产品。该仿真设计系统主要包括五大模块,即数据采集和双精度转换模块、单片机处理模块、键盘控制模块、128*64液晶显示模块和软件驱动模块。启动工作后,单片机可根据A/D采集的重量参数能够自动选择转换精度值,完成相应的数据处理,同时在128*64的液晶屏上进行直观的显示重量、单价和总价,4*4键盘控制系统能够实时进行单价调整,操作简单方便,不仅能够测量微重物理,而且能够测量较重物体,完全达到了商品的自动化、数字化和智能化,具有很好的应用价值和意义。 本文唯一的不足是只对研发方案成果的进行了仿真设计,没有运用实物进行验证方案是否可行,有待进一步的研发。虽然没有做出实物,但基于51单片机双精度电子称依然是一个具有前景的电子衡器产品,非常适合于中小型市场的物体称重,如果双精度电子称进一步发展,与虚拟串口技术融合,将会实现与上位机的无线通讯,实现远程监测,将更有价值。
参考文献 [1] 黄坚,金惟伟.中小型电机产品近年出口情况简述[J].中小型电机,2005,32(1) 9--12. [1]赵茂泰. 智能仪器原理及应用[M].北京:电子工业出版社.2004 [2]张毅刚. MCS-51单片机应用设计[M].哈尔滨:哈尔滨工业大学出版社.2003 [3]贾伯年, 俞朴.传感器技术[M].东南大学出版社.2000 [4]单成祥.传感器理论设计基础及其应用[M].北京:国防工业出版社.1999 [5]李道华,李玲,朱艳 .传感器电路分析与[M].武汉:武汉大学出版社.2000 [6]沙占友 ,王彦朋等. 智能传感器系统设计与应用[M].北京:电子工业出版社2004.6 [7]何希才,薛永毅. 传感器及其应用实例[J].北京:机械工业出版社.2004.1 [8]李群芳. 单片机微型计算机与接口技术[M].电子工业出版社. [9]周立功. 单片机实验与实践[M].北京航空航天大学出版社.2004.6 [10]全国大学生电子设计竞赛组委会.全国大学生电子设计竞赛获奖作品汇编[J].北京理工大学出版社.2005.11 [11]何立民 .单片机高级教材[M].北京:航空航天大学出版社.2000 [12]童诗白,华成英 .模拟电子技术基础[M]. 北京:北京高等教育出社.2001 [13]程林 ,超省电型电子秤的设计方案[J].福建:福建省计量科学技术研究所. 2008.3
附录1材料清单 | | | | | | | | | | | | | | | |
3红、透明 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
附录2电路原理图
附录3实物图
附录4主要程序清单
- ALARMHBUFF2 EQU 77H ;闹铃时间的时十位计时绶冲
- ALARMHBUFF1 EQU 76H ;闹铃时间的时个位计时绶冲
- ALARMMBUFF2 EQU 75H ;闹铃时间的分十位计时绶冲
- ALARMMBUFF1 EQU 74H ;闹铃时间的分个位计时绶冲
- HBUFF2 EQU 73H ;时十位计时绶冲
- HBUFF1 EQU 72H ;时个位计时绶冲
- MBUFF2 EQU 71H ;分十位计时绶冲
- MBUFF1 EQU 70H ;分个位计时绶冲
- DP EQU 6FH ;控制数码管点的亮暗
- NUM EQU 78H ;前四秒还是后四秒计数
- SBUFF EQU 79H ;秒十进制计时绶冲(低四位对应个位,高四位对应十位)
- MBUFF EQU 7AH ;分十进制计时绶冲
- HBUFF EQU 7BH ;时十进制计时绶冲
- ALARMMBUFF EQU 7CH ;闹铃时间的分十进制计时绶冲
- ALARMHBUFF EQU 7DH ;闹铃时间的时十进制计时绶冲
- NUMT1 EQU 67H;用于控制时间调整时按键p3.2一次按下时,计数器T1中断的次数
- NUMT2 EQU 68H;用于控制时间调整时按键p3.3一次按下时,计数器T1中断的次数
- KEYNUMT1 EQU 69H ;用于存储NUMT1已经计数到第几个半秒
- KEYNUMT2 EQU 6AH ;用于存储NUMT1已经计数到第几个半秒
- STOREKEYNUMT2 EQU 6BH ;用于存储当前KEYNUMT1的值,以和下次做比较,看是否有变化
- STOREKEYNUMT1 EQU 6CH ;用于存储当前KEYNUMT2的值,以和下次做比较,看是否有变化
- ORG 0000H
- AJMP START
- ORG 000BH
- MOV TH0 , #0BH ;设置计数初值 ,R4用来存储低位的初值
- MOV TL0 , R4
- AJMP INTERT0
- ORG 001BH
- AJMP INTERT1
- ORG 0040H
- START: MOV NUMT1 , #00H
- MOV NUMT2 , #00H
- MOV KEYNUMT1 , #00H
- MOV KEYNUMT2 , #00H
- MOV STOREKEYNUMT2 , #00H
- MOV STOREKEYNUMT1 , #00H
- MOV NUM , #8
- MOV DPTR , #TAB
- MOV ALARMHBUFF , #18H ;置闹铃时间初始值为18:55
- MOV ALARMMBUFF , #55H
- MOV ALARMHBUFF2, #01H
- MOV ALARMHBUFF1, #08H
- MOV ALARMMBUFF2 , #05H
- MOV ALARMMBUFF1 , #05H
- MOV HBUFF2, #01H ;置闹钟时间为18:53
- MOV HBUFF1, #08H
- MOV MBUFF2 , #05H
- MOV MBUFF1 , #03H
- MOV HBUFF , #18H
- MOV MBUFF , #53H
- MOV SBUFF , #3CH ;置初始秒为60,计时时减
- MOV TCON , #05H ;下降沿触发
- MOV TMOD , #11H ;初始化定时器,T0 ,T1 16位计时
- MOV TH0 , #0BH ;设置计数初值,125ms计时
- MOV TL0 , #0DBH
- MOV TH1 , #3CH ;T1置初值,进行100ms计时,用于调整时间
- MOV TL1 , #0B0H
- MOV IE , #82H ;开T0中断
- SETB PT0 ;T0中断优先级最高
- SETB TR0 ;允许T0计数
- SETB P3.2
- SETB P3.3
- START1: MOV A , HBUFF ; 显示时,7点以前及21点以后亮度调暗
- SUBB A , #7H
- JC START2
- MOV A , HBUFF
- SUBB A , #21H
- JNC START2
- ACALL DISPLAY
- ACALL ZDBS
- AJMP START3
- START2: ACALL NIGHTDISPLAY
- START3: MOV A ,ALARMHBUFF ;检测是否是定闹时间
- CJNE A , HBUFF , START4
- MOV A , ALARMMBUFF
- CJNE A , MBUFF ,START4
- MOV C, DP ;若是定闹时间,则利用dp的值来决定蜂鸣
- MOV P3.2, C
- MOV A , SBUFF
- JNZ START1 ;若还没到1分钟,则继续蜂鸣
- SETB P3.2
- START4: JNB P3.2,ADJUSTTIME1 ;循环等待中断,并检测是否键按下,若是,则进入相应程序
- JNB P3.3,ADJUSTTIME2
- AJMP START1
- AJMP START1
-
- ;****************
- ;*int0中断子程序*
- ;****************
-
- ADJUSTTIME1:NOP
- MOV KEYNUMT1 ,#00H
- MOV TH1 , #3CH ;T1置初值,进行100ms计时,用于调整时间
- MOV TL1 , #0B0H
- SETB ET1 ;开T1中断
- SETB PT1 ;设T1中断优先级最高
- SETB TR1 ;允许T1计时
- MOV STOREKEYNUMT1 , KEYNUMT1 ;存储当前次KEYNUMT1的值
- TIME1_1:ACALL DISPLAY
- MOV A , KEYNUMT1
- CJNE A , STOREKEYNUMT1,TIME1_2 ;若当前KEYNUMT1的值与上一次的值不等,则时间加1分,否则继续循环,等等至半分钟
- AJMP TIME1_3
- TIME1_2:MOV STOREKEYNUMT1 , KEYNUMT1 ;加1后存储当前的KEYNUMT1的值
- ACALL ADDBUFF0 ;分加1
- TIME1_3:JNB P3.2,TIME1_1 ;若p3.2已关,则退出增时,否则继续循环
- CLR ET1
- CLR PT1
- CLR TR1
- AJMP START1
-
- ;********************
- ;*****时间增1分******
- ;********************
-
- ADDBUFF0:MOV A , MBUFF ; 若按键小于1s,则分增1
- ADD A , #1
- DA A
- MOV MBUFF , A
- ANL A , #0FH
- MOV MBUFF1 , A
- MOV A , MBUFF
- SWAP A
- ANL A , #0FH
- MOV MBUFF2 , A
- MOV A , MBUFF
- CJNE A , #60H , ADDBUFF1
- MOV MBUFF , #00H
- MOV MBUFF2 , #00H
- MOV MBUFF1 , #00H
- MOV A , HBUFF ;时增1
- ADD A , #1
- DA A
- MOV HBUFF , A
- ANL A , #0FH
- MOV HBUFF1 , A
- MOV A , HBUFF
- SWAP A
- ANL A , #0FH
- MOV HBUFF2 , A
- MOV A , HBUFF
- CJNE A , #24H , ADDBUFF1 ;若没到24小时,则不必初值置0
- MOV HBUFF , #00H
- MOV HBUFF2 , #00H
- MOV HBUFF1 , #00H
- ADDBUFF1:RET
-
- ;*********************************
- ;*int1中断子程序******************
- ;*********************************
-
- ADJUSTTIME2: NOP
- ACALL DL100MS
- MOV C , P3.3
- JC TIME2_6 ;如果(P3.3按键<100ms以上) 则不做处理
- MOV KEYNUMT2 , #00H ;否则进入定闹设置
- MOV STOREKEYNUMT2 , KEYNUMT2 ;记录当前NUMT2的数据,以看下次有没改变
- TIME2_1:NOP
- MOV TH1 , #3CH ;T1置初值,进行100ms计时,用于调整时间
- MOV TL1 , #0B0H
- SETB ET1 ;开T1中断
- SETB PT1 ;设T1中断优先级最高
- SETB TR1 ;允许T1计时
- TIME2_2:ACALL ALARMDISPLAY
- MOV A , KEYNUMT2
- CJNE A , STOREKEYNUMT2 ,TIME2_3
- AJMP TIME2_4
- TIME2_3: MOV STOREKEYNUMT2 , KEYNUMT2
- MOV A , ALARMMBUFF ; 若按键小于1s,则分增1
- ADD A , #1
- DA A
- MOV ALARMMBUFF , A
- ANL A , #0FH
- MOV ALARMMBUFF1 , A
- MOV A , ALARMMBUFF
- SWAP A
- ANL A , #0FH
- MOV ALARMMBUFF2 , A
- MOV A , ALARMMBUFF
- CJNE A , #60H , TIME2_4
- MOV ALARMMBUFF , #00H
- MOV ALARMMBUFF2 , #00H
- MOV ALARMMBUFF1 , #00H
- MOV A , ALARMHBUFF ;时增1
- ADD A , #1
- DA A
- MOV ALARMHBUFF , A
- ANL A , #0FH
- MOV ALARMHBUFF1 , A
- MOV A , ALARMHBUFF
- SWAP A
- ANL A , #0FH
- MOV ALARMHBUFF2 , A
- MOV A , ALARMHBUFF
- CJNE A , #24H , TIME2_4 ;若没到24小时,则初值不必置0
- MOV ALARMHBUFF , #00H
- MOV ALARMHBUFF2 , #00H
- MOV ALARMHBUFF1 , #00H
- TIME2_4:NOP
- JNB P3.3,TIME2_2 ;若按键已经未按,则退出循环
- CLR ET1
- CLR TR1
- MOV KEYNUMT2 , #00H
- MOV NUMT2 , #00H
- MOV R2 , #10 ; 直到p3.3 20s钟内都是未按,此时复原数据,即退出设置
- TIME2_7:MOV R1 , #200
- TIME2_5:ACALL ALARMDISPLAY
- ACALL DL1MS
- JNB P3.3 , TIME2_1
- DJNZ R1 , TIME2_5
- DJNZ R2 , TIME2_7
- TIME2_6:CLR ET1
- CLR PT1
- CLR TR1
- LJMP START1
- ;***********************************
- ;**T1中断子程序*********************
- ;***********************************
-
- INTERT1:NOP
- MOV TH1 , #3CH ;T1置初值,进行100ms计时,用于调整时间
- MOV TL1 , #0B0H
- PUSH ACC
- PUSH PSW
- CLR ET0
- CLR ET1 ;关T1中断
- MOV A , NUMT1
- INC A
- MOV NUMT1 , A ;中断一次则相应的增加NUMT1
- CJNE A , #5 , INTERT1NEXT ;每中断五次,即半秒,都增加KEYNUMT1
- MOV A ,KEYNUMT1
- INC A
- MOV KEYNUMT1 , A
- MOV NUMT1 , #00H ;NUMT1已经是5了,则处理过KEYNUMT1后,重置NUMT1
- INTERT1NEXT:NOP
- MOV A , NUMT2 ;中断一次则相应的增加NUMT1
- INC A
- MOV NUMT2 , A
- CJNE A, #5,ENDINTERT1 ;每中断五次,即半秒,都增加KEYNUMT1
- MOV A , KEYNUMT2
- INC A
- MOV KEYNUMT2 , A
- MOV NUMT2 , #00H ;NUMT1已经是5了,则处理过KEYNUMT1后,重置NUMT1
- ENDINTERT1: SETB ET1
- SETB ET0
- POP ACC
- POP PSW
- RETI
-
-
-
-
- ;**************
- ;** 整点报时 **
- ;**************
- ZDBS: MOV A , MBUFF ;在整点时,响半秒
- JNZ ZDBSEND
- MOV A , SBUFF
- CJNE A , #3CH , ZDBSEND
- CLR P3.2
- ACALL DL0FIVE
- SETB P3.2
- ZDBSEND:RET
-
- ;**************
- ;**定闹显示子程序**
- ;**************
- ALARMDISPLAY: MOV P1 ,#0FFH ;使时的十位亮
- MOV A , ALARMHBUFF2
- MOVC A , @A+DPTR
- SETB ACC.7
- MOV P1 , A
- CLR P3.0
- ACALL DL1MS
- SETB P3.0
- MOV A , ALARMHBUFF1 ;使时的个位亮
- MOVC A , @A+DPTR
- MOV C , DP
- MOV ACC.7 , C
- MOV P1 , A
- CLR P3.1
- ACALL DL1MS
- SETB P3.1
- MOV A ,ALARMMBUFF2 ;使分的十位亮
- MOVC A , @A+DPTR
- MOV C , DP
- MOV ACC.7 , C
- MOV P1 , A
- CLR P3.4
- ACALL DL1MS
- SETB P3.4
- MOV A , ALARMMBUFF1 ;使时的个位亮
- MOVC A , @A+DPTR
- SETB ACC.7
- MOV P1,A
- CLR P3.5
- ACALL DL1MS
- SETB P3.5
- RET
-
- ;********************************
- ;**晚上显示子程序****************
- ;******************************** ;降低显示的占空比,数码管进入节能
- NIGHTDISPLAY: NOP
- MOV P1 ,#0FFH
- MOV A , HBUFF2
- MOVC A , @A+DPTR
- SETB ACC.7
- MOV P1 , A
- CLR P3.0
- ACALL DL1MS ;亮1ms
- SETB P3.0
- ACALL DL1MS
- ACALL DL1MS ;暗2ms
- MOV A , HBUFF1
- MOVC A , @A+DPTR
- MOV C , DP
- MOV ACC.7 , C
- MOV P1 , A
- CLR P3.1
- ACALL DL1MS
- SETB P3.1
- ACALL DL1MS
- ACALL DL1MS
- MOV A ,MBUFF2
- MOVC A , @A+DPTR
- MOV C , DP
- MOV ACC.7 , C
- MOV P1 , A
- CLR P3.4
- ACALL DL1MS
- SETB P3.4
- ACALL DL1MS
- ACALL DL1MS
- MOV A , MBUFF1
- MOVC A , @A+DPTR
- SETB ACC.7
- MOV P1,A
- CLR P3.5
- ACALL DL1MS
- SETB P3.5
- ACALL DL1MS
- ACALL DL1MS
- RET
-
- ;**************
- ;**显示子程序**
- ;**************
- DISPLAY: MOV P1 ,#0FFH
- MOV A , HBUFF2
- MOVC A , @A+DPTR
- SETB ACC.7
- MOV P1 , A
- CLR P3.0
- ACALL DL1MS
- SETB P3.0
-
- MOV A , HBUFF1
- MOVC A , @A+DPTR
- MOV C , DP
- MOV ACC.7 , C
- MOV P1 , A
- CLR P3.1
- ACALL DL1MS
- SETB P3.1
-
- MOV A ,MBUFF2
- MOVC A , @A+DPTR
- MOV C , DP
- MOV ACC.7 , C
- MOV P1 , A
- CLR P3.4
- ACALL DL1MS
- SETB P3.4
- MOV A , MBUFF1
- MOVC A , @A+DPTR
- SETB ACC.7
- MOV P1,A
- CLR P3.5
- ACALL DL1MS
- SETB P3.5
- RET
-
- TAB: DB 88H,0BBH,94H,91H,0A3H ; 0 1 2 3 4
- DB 0C1H,0C0H,9BH,80H,81H ; 5 6 7 8 9
-
- ;**************
- ;***延时程序***
- ;**************
-
- DL1MS: MOV R6 , #20 ;延时1ms
- DL11: MOV R7 , #25
- DL12: DJNZ R7 , DL12
- DJNZ R6 , DL11
- RET
-
- DL100MS:MOV R6 , #200 ;延时100ms
- DL100MS1:MOV R7 , #250
- DL100MS2:DJNZ R7 , DL100MS2
- DJNZ R6 , DL100MS1
- RET
-
- DL11S: MOV R5 , #10
- DL1S0: MOV R6 , #200 ;延时1s 10*250*200
- DL1S1: MOV R7 , #250
- DL1S2: DJNZ R7 , DL1S2
- DJNZ R6 , DL1S1
- DJNZ R5 , DL1S0
- RET
-
- DL0FIVE:MOV R5 , #5
- DL0: MOV R6 , #100 ;延时0.5s
- DL1: MOV R7 , #250
- DL2: DJNZ R7 , DL2
- DJNZ R6 , DL1
- DJNZ R5 , DL0
- RET
-
- ;**************
- ;*T0中断子程序*
- ;**************
- INTERT0:PUSH ACC
- PUSH PSW
- CLR ET0 ;关T0中断
- MOV A , SBUFF
- CJNE A ,#028H, SET1
- MOV R4 , #0DCH ;后四十秒的初值
- SET1: DJNZ NUM , ENDINTT0 ;若还没到1s,则退出该次中断
- MOV NUM , #8 ;设置NUM初值
- CPL DP
- DJNZ SBUFF , ENDINTT0 ; 若还没到60s,则退出该次中断
- MOV SBUFF , #03CH
- MOV R4 , #0DBH ;前20秒的初值
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
完整论文下载地址(word格式 可编辑):
http://www.51hei.com/bbs/dpj-86574-1.html
|
|