您的当前位置:首页正文

电子时钟的设计

2020-05-22 来源:尚车旅游网


电子时钟的设计

1 课程设计目的 ................................................... 1 2 系统方案设计及确定 ............................................. 2 2.1 方案的提出 ................................................... 2 2.2 方案的论证及确定 ............................................. 2 2.2.1 单片机简介及选择 ......................................... 2 2.2.2 键盘电路的简介及选择 ..................................... 4 2.2.3 LED数码管的简介及选择.................................... 5 3 系统的硬件设计 ................................................. 7 3.1 AT89S51最小系统设计 .......................................... 7 3.1.1 时钟电路硬件设计 ......................................... 7 3.1.2 复位电路硬件设计 ......................................... 7 3.2 键盘电路硬件设计 ............................................. 9 3.3 显示电路硬件设计 ............................................. 9 3.4 蜂鸣器电路硬件设计 .......................................... 10 4 系统软件设计 .................................................. 11 4.1 系统主程序设计 .............................................. 11 4.1.1 系统软件设计内存分配及芯片地址介绍 ...................... 11 4.1.2 系统主程序流程图 ........................................ 11 4.2 定时器的设计 ................................................ 12 4.3 整点报时 ..................................................... 14 5 系统调试 ...................................................... 15 5.1 调试步骤 .................................................... 15 5.2 调试过程中的问题及解决方法 .................................. 22

6 总结 .......................................................... 23 7 参考文献 ...................................................... 24 附录 ............................................................. 25 附录一:程序清单 ................................................. 25 附录二 系统硬件原理图及PCB图 ................................... 46

1 课程设计目的

单片机体积小、成本低,嵌入到工业操纵单元、机器人、智能仪器外表、汽车电子系统、武器系统、家用电器、办公自动化设备、金融电子系统、玩具、个人信息终端及通讯产品中。单片机是运算机技术进展史上的一个重要里程碑,标志着运算机正式形成了通用运算机系统和嵌入式运算机系统两大分支。单片机是集成电路技术与微型运算机技术高速进展的产物。体积小、价格低、应用方便、稳固可靠,因此,给工业自动化等领域带来了一场重大革命和技术进步。

由于体积小,专门容易地嵌入到系统之中,以实现各种方式的检测、运算或操纵,这一点,一样微机全然做不到。

由于单片机本身确实是一个微型运算机,因此只要在单片机的外部适当增加一些必要的外围扩展电路,就能够灵活地构成各种应用系统,如工业自动检测监视系统、数据采集系统、自动操纵系统、智能仪器外表等。

从工业自动化、自动操纵、智能仪器外表、消费类电子产品等方面,直到国防尖端技术领域,单片机都发挥着十分重要的作用。因此单片机的课程设计是十分必要的。

灵活运用单片机的基础知识,依据课程设计内容,能够完成从硬件电路图设计,到PCB制版,再到软件编程及系统调试实现系统功能,完成课程设计,加深对单片机基础知识的明白得,并灵活运用,将各门知识综合应用。

能够上网查询器件资料,培养对新知识新技术的独立的学习能力和应用能力。

独立完成一个小的系统设计,从硬件设计到软件设计,增强分析问题、解决问题的能力,为日后的毕业设计及科研工作奠定良好的基础。

2 系统方案设计及确定

2.1 方案的提出

用单片机及6位LED数码管显示时、分、秒,以24小>时计时方式运行,能整点提醒(短蜂鸣,次数代表整点时刻),使用按键开关可实现时、分调整,秒表(或闹钟)/时钟功能转换,以及实现省电(关闭显示)功能。系统框图如下图

时钟电路显示电路复位电路单片机蜂鸣器电路键盘电路

2.2 方案的论证及确定 2.2.1 单片机简介及选择

单片机是集成电路技术与微型运算机技术高速进展的产物。体积小、价格低、应用方便、稳固可靠,因此,给工业自动化等领域带来了一场重大革命和技术进步。 由于体积小,专门容易地嵌入到系统之中,以实现各种方式的检测、运算或操纵,这一点,一样微机全然做不到。 由于单片机本身确实是一个微型运算机,因此只要在单片机的外部适当增加一些必要的外围扩展电路,就能够灵活地构成各种应用系统,如工业自动检测监视系统、数据采集系统、自动操纵系统、

智能仪器外表等。20世纪80年代以来,进展迅速,世界一些闻名厂商投放市场的产品就有几十个系列,数百个品种,Intel公司的MCS-48、MCS-51,Motorola公司的6801、6802,Zilog公司的Z8系列,Rockwell公司的6501、6502等。此外,荷兰的Philips公司、日本的NEC公司、日立公司等也相继推出了各自的产品。 尽管机型专门多,然而在20世纪80年代以及90年代,在我国使用最多的8位单片机依旧Intel公司的MCS-51系列单片机以及与其兼容的单片机(称为51系列单片机)MCS-51系列单片机要紧包括

差不多型:8031/8051/8751(低功耗型80C31/80C51/87C51)增强型:8032/8052/8752。已为我国宽敞技术人员所熟悉和把握。在上世纪80年代和90年代,MCS-51系列是在我国应用最为广泛的单片机机型之一。

(1)差不多型

典型产品:8031/8051/8751。

8031内部包括1个8位CPU、128B RAM,21个专门功能寄存器(SFR)、4个8位并行I/O口、1个全双工串行口,2个16位定时器/计数器,5个中断源,但片内无程序储备器,需外扩程序储备器芯片。

8051是在8031的基础上,片内又集成有4KB ROM作为程序储备器。因此8051是一个程序不超过4KB的小系统。ROM内的程序是公司制作芯片时,代为用户烧制的。

8751与8051相比,片内集成的4KB EPROM取代了8051的4KB ROM来作为程序储备器。

(2)增强型

Intel公司在差不多型基础上,推出增强型-52子系列,典型产品:8032/8052/8752。内部RAM增到256B,8052、片内程序储备器扩展到8KB,16位定时器/计数器增至3个,6个中断源,串行口通信速率提高5倍。 表2-1列出了差不多型和增强型的MCS-51系列单片机片内的差不多硬件资源

表2-1MCS-51系列单片机片内的差不多硬件资源。

与MCS-51系列的87C51单片机相比,AT89C51/AT89S51单片机片内的4KB Flash储备器取代了87C51片内的4KB EPROM。AT89S51片内的Flash储备器可在线编程或使用编程重视复编程,且价格较低。

因此AT89C51/AT89S51单片机作为代表性产品受到用户欢迎,AT89C5x/AT89S5x单片机是目前取代MCS-51系列单片机的主流芯片之一。本书重点介绍AT89S51单片机的原理及应用系统设计。

AT89S5x的“S”档系列机型是ATMEL公司继AT89C5x系列之后推出的新机型,代表性产品为AT89S51和AT89S52。差不多型的AT89C51与AT89S51以及增强型的AT89C52与AT89S52的硬件结构和指令系统完全相同。使用AT89C51的系统,在保留原先软硬件的条件下,完全能够用AT89S51直截了当代换。 与AT89C5x系列相比,AT89S5x系列的时钟频率以及运算速度有了较大的提高,例如,AT89S51工作频率的上限为24MHz,而AT89S51则为33MHz。AT89S51片内集成有双数据指针DPTR,看门狗定时器、具有低功耗闲暇工作方式和掉电工作方式。目前,AT89S5x系列已逐步取代AT89C5x系列。此次设计使用的是AT89S51。 2.2.2 键盘电路的简介及选择

键盘具有向单片机输入数据、命令等功能,是人与单片机对话的要紧手段。键盘可分为两类:非编码键盘和编码键盘。本报告要紧介绍非编码键盘。

非编码键盘是利用按键直截了当与单片机相连接而成,这种键盘通常使用在按键数量较少的场合。使用这种键盘,系统功能通常比较简单,需要处理的任务较少,然而能够降低成本、简化电路设计。按键的信息通过软件来猎取。

非编码键盘 分为两种结构:独立式键盘和矩阵式键盘 (1)独立式键盘

独立式键盘特点是:一键一线,各键相互独立,每个键各接一条I/O口线,通过检测I/O输入线的电平状态,可容易地判定哪个按键被按下,如图10-8所示。

关于图3-1的键盘,图中的上拉电阻保证按键开释时,输入检测线上有稳固的高电平。

当某一按键按下时,对应的检测线就变成了低电平,与其他按键相连的检测线仍为高电平,只需读入I/O输入线的状态,判别哪一条I/O输入线为低电平,专门容易识别哪个键被按下。

(2) 矩阵式键盘

矩阵式(也称行列式)键盘用于按键数目较多的场合,由行线和列线组成,按键位于行、列的交叉点上。如图3-2所示,一个44的行、列结构能够构成一个16个按键键盘。在按键数目较多的场合,要节约较多的I/O口线。

矩阵中无按键按下时,行线为高电平;当有按键按下时,行线电平状态将由与此行线相连的列线的电平决定。列线的电平假如为低,则行线电平为低;列线的电平假如为高,则行线的电平也为高,这是识别按键是否按下的关键所在。 由于本设计键盘数目较少故采纳独立式键盘。

图3-1独立式键盘 3-2矩阵式键盘 2.2.3 LED数码管的简介及选择

LED(Light Emitting Diode)发光二极管缩写。LED数码管是由发光二极管构成的。常见的LED数码管为“8”字型的,共计8段。每一段对应一个发光二极管。有共阳极和共阴极两种,如图3-3所示。共阴极发光二极管的阴极连在

一起,通常公共阴极接地。当阳极为高电平常,发光二极管点亮。同样,共阳极LED数码管的发光二极管的阳极连接在一起,公共阳极接正电压,当某个发光二极管的阴极接低电平常,发光二极管被点亮,相应的段被显示。

图3-3

LED数码管有静态显示和动态显示两种显示方式。

静态显示方式的显示无闪耀,亮度都较高,静态显示方式接口编程容易,然而占用口线较多(图3-4)。

动态显示的优点是硬件电路简单,显示器越多,优势越明显。缺点是显示亮度不如静态显示的亮度高。假如“扫描”速率较低,会显现闪耀现象(图3-5)。

图2-4静态显示 图2-5动态显示 基于以上缘故本设计采纳动态显示。

总结以上选择,我们单片机选用了AT89S51,键盘选用了非编码式独立式键盘,数码管选择动态显示。

3 系统的硬件设计

3.1 AT89S51最小系统设计

AT89S51的最小系统包括时钟电路、复位电路,和AT89S51芯片。

3.1.1 时钟电路硬件设计

AT89S51内部有一个用于构成振荡器的高增益反相放大器,输入端为芯片引脚XTAL1,输出端为引脚XTAL2。这两个引脚跨接石英晶体振荡器和微调电容,构成一个稳固的自激振荡器。C1和C2的典型值通常选择为30pF。电容大小会阻碍振荡器频率高低、振荡器的稳固性和起振的快速性。晶振频率范畴通常是1.2~12MHz。晶体频率越高,单片机速度就越快。速度快对储备器的速度要求就高,印制电路板的工艺要求也高,即线间的寄生电容要小。晶体和电容应尽可能与单片机靠近,以减少寄生电容,保证振荡器稳固、可靠地工作。为提高温度稳固性,采纳温度稳固性能好的电容。常选6MHz或12MHz的石英晶体。随着集成电路制造工艺技术的进展,单片机的时钟频率也在逐步提高,已达33MHz。本设计选用的是11.0592MHZ。

图3-1时钟电路

3.1.2 复位电路硬件设计

单片机的初始化操作,给复位脚RST加上大于2个机器周期(即24个时钟振荡周期)的高电平就使AT89S51复位。

复位电路采纳上电自动复位和按钮复位两种方式。

上电自动复位是给电容C 充电加给RST引脚一个短的高电平信号,此信号随着VCC对电容C 的充电过程而逐步回落,即RST引脚上的高电平连续时刻取决于电容C 充电时刻。为保证系统可靠复位,RST引脚上的高电平必须坚持足够长的时刻。除了上电复位外,有时还需要按键手动复位,本设计采纳上电自动复位和按钮复位结合的方式。

图3-2复位电路

下图为AT89S51的最小系统

图3-3AT89S51的最小系统

3.2 键盘电路硬件设计

关于图3-8的键盘,图中的上拉电阻保证按键开释时,输入检测线上有稳固的高电平.与门U5B的输出为高电平。

当某一按键按下时,对应的检测线就变成了低电平,与其他按键相连的检测线仍为高电平,与门U5B的输出为低电平(向单片机发出中断要求),只需读入I/O输入线的状态,判别哪一条I/O输入线为低电平,专门容易识别哪个键被按下。

图3-8键盘电路

3.3 显示电路硬件设计

本设计采纳的动态显示,图3-9所示为一个6位8段LED动态显示电路。其中段码线占用一个8位I/O口(P0口),而位选线占用一个6位I/O口(P2口低6位)。必须采纳动态的“扫描”显示方式。即在某一时刻,只让某一位的位选线处于选通状态,而其他各位的位选线处于关闭状态,同时,段码线上输出相应位要有显示的字符的段码(三极管电路起到驱动作用)。

图3-9显示电路

3.4 蜂鸣器电路硬件设计

当单片机测控系统发生故障或处于某种紧急状态时,单片机系统应能发出提醒人们警觉的声音报警。用I/O口专门容易实现该功能。本设计用于整点报时和闹铃用。

购买市售的压电式蜂鸣器,用一根I/O口线驱动蜂鸣器发声。约需10mA的驱动电流,可用7406或7407低电平驱动,也能够用一个晶体管驱动如图3-10所示

图3-10蜂鸣器电路

4 系统软件设计

4.1 系统主程序设计

4.1.1 系统软件设计内存分配及芯片地址介绍

定时器T0、T1溢出周期为50MS,T0为秒计数用, T1为调整时闪耀及秒表定时用,

P1.0、P1.1、P1.2、P1.3为调整按钮,P0口为字符输出口,P2为扫描口,P1.7为蜂呜器口,采纳共阳显示管。

50H-55H为闹钟定时单元,60H-65H为秒表计时单元,72H-75H为显示时刻单元,76H-79H为分时计时单元。

03H标志=0时钟闪耀,=1秒表,05H=0,不闹铃,=1要闹铃. 07H每秒改变一次,用作间隔呜叫。 4.1.2 系统主程序流程图

通过不断地调用显示程序可保证在执行其他子程序时保证数码管亮(除省电模式外)。

开始系统初始化显示子程序扫描键盘子程序

图4-1系统主程序流程图

4.2 定时器的设计

定时器T0、T1溢出周期为50MS,T0为秒计数用, T1为调整时闪耀及秒表定时用。

T0中断服务子程序重置T0定时初值百分位秒位+11S到?Y秒位+1百分秒位清0秒N1分钟到?Y分位+1秒位清0N1小时到?Y小时位+1分位清0N24小时到?Y小时位清0N返回

图4-2用T0实现计时流程图

开始是否按下P1.1设置键NY时间调整模式YN是否退出调整模式Y是否跟闹钟时间一致N显示时间Y启动闹铃

图4-3时刻调整流程图

4.3 整点报时

开始显示时间分钟是否为00? Y蜂鸣器响一次NP1.0键是否按下Y退出N

图4-4整点报时流程图

5 系统调试

5.1 调试步骤

该程序的调试环境是在星研仿真软件环境里面进行的,通过软禁工具里的窗口来对CPU进行选择,在其窗口工具栏下的数据窗口里观看,以判定时钟是否正常的进行,再通过仿真机和星研软件相连通,从而进行仿真调试,最终完成时钟系统的各个功能。 1、建立项目文件。

a)执行[ 主菜单 | 文件 | 新建 ]

选择“创建项目文件”,在“项目文件名”中输入您的项目文件名,例如:example;在“位于哪个名目”中选择一个项目文件存放名目。该名目名决定编译、连接时生成的所有文件所在名目;该项目文件名决定最终生成的代码文件的名称。即假如项目文件名叫“Example”,则最后生成的代码文件为“Example.dob”、“Example.hex”等。“确定”后,进入下一步。 b) 选择仿真头、您需要仿确实CPU的公司、型号。点击“下一步” c) 选择语言

d) 按照您的硬件需要,设置编译、连接操纵项。

e) 设置存贮器出借方式。点击“完成”,您的项目文件建立完毕。 存贮器出借方式分为程序空间出借方式、外部数据空间出借方式。 STAR系列仿真器

仿真器内有128K仿真RAM,其中64K能够出借给您作为程序存贮器,存放机器码;64K可出借给您作为数据存贮器,存放外部数据。通常,您借用仿真RAM作为程序存贮器,便于调试程序;外部数据空间在您的应用系统上,便于对您系统上的I/O、数据RAM操作;假如您的线路板还未制成,您也可借用仿真RAM。

SUPER ICE16 、SUPER ICE51仿真器

仿真器内有64K仿真RAM,能够作为您的程序、数据存贮器。以8K为一个单位,可出借给您作为程序、数据存贮器。假如您选中相应的复选框,该8K空间在您的系统上;不选中相应的复选框,该8K空间在仿真器上。通常,您借用仿真RAM作为程序存贮器,便于调试程序;外部数据空间在您的应用系统上,便于对您系统上的I/O、数据RAM操作;假如您的线路板还未制成,您也可借用仿真RAM。但要注意您借用的程序空间与您借用的外部数据空间地址不能重叠,因为仿真器内只有64K存贮器(仿真RAM)。MCS196类CPU能够依照INST引脚区分程序空间和数据空间,假如您不需要区分程序、数据空间或关于只有64K空间的CPU(如8098),请不要选中使用INST区分程序、

数据空间。

SUPER ICE51S仿真器

仿真器内有64K仿真RAM,可出借给您作为程序、数据存贮器。假如您选中相应的复选框,该64K空间在您的系统上;不选中相应的复选框,该64K空间在仿真器上。通常,您借用仿真RAM作为程序存贮器,便于调试程序;外部数据空间在您的应用系统上,便于对您系统上的I/O、数据RAM操作;假如您的线路板还未制成,您也可借用仿真RAM。但要注意您存放代码的区域与存放数据的区域不能重叠,因为仿真器内只有64K存贮器(仿真RAM)。 2、添加模块文件

工作区窗的项目视中,包含“源文件”、“头文件”、“库文件”、“其它文件”,

“其它文件”中通常包含对该项目用途作一些说明的文件。“库文件”通常包含编译软件自带的OBJ文件、LIB等库文件。

a)假如您的模块文件还没建立,您能够执行[ 主菜单 | 文件 | 新建]

在“文件名”中输入模块文件名,在“位于哪个名目”中,选择一个文件存

放的名目,通常与项目文件名在同一个名目;选中“添加到项目文件中”,系统自动将该模块文件加入到项目中。

b)添加已存在的模块文件,库文件

在工作区窗的文件视中按鼠标右键,系统弹出一个菜单,选择“添加文件”,选择需要添加到项目文件中的各种文件。在选择文件时,按住“Ctrl”,一次可添加多个文件。

使用[ 主菜单 | 项目 | 添加文件],也能够添加文件。

c)在文件窗中,按鼠标右键,系统弹出一个菜单,选择“添加文件至项目”,即可将当前文件添加至项目中。

工作区窗的“Examples”视中包含有一些例子,依照您使用的编译软件,能够选择相应的例子。 3、编辑程序

在工作区窗的项目视中,用鼠标双击程序文件名,即可打开相应的文件,编辑程序。 4、设置项目文件

a)在工作区窗的项目视中按鼠标右键,系统弹出一个菜单,选择“设置项

目文件”,能够重新选择仿真头、CPU的公司、型号、编译软件、设置编译软件、存贮器出借方式。

b)使用[ 主菜单 | 项目 | 设置项目文件],也能够设置项目文件。 5、删除模块文件

在工作区窗的文件视中,选择需要删除的模块文件名: a)按Del键。

b)按鼠标右键,系统弹出一个菜单,选择“删除文件”,即可把它从项目文

件中去除。

c)使用[ 主菜单 | 项目 | 删除文件]。 2 编译、连接 境

1、设置工作环境

星研集成环境软件不带任何编译软件,请依照您使用的编译软件设置工作环

依照您在项目文件中选择的语言、编译器所在名目,设置以上路径。

2、启动编译、连接

对工作区窗项目视的“源文件”中所有模块文件编译,假如没有错误,再与“库文件”中所有库文件连接,生成代码文件(DOB、HEX文件)。 a) 在工作区窗的项目视中按鼠标右键,系统弹出一个菜单,选择“编译、

连接”或“重新编译连接”

b) 使用[ 主菜单 | 项目 | 编译、连接 ]或[主菜单 | 项目 | 重新编译、

连接 ]”。

“编译连接”与“重新编译、连接”区别:“重新编译、连接”不管项目中有无添加、删除模块文件、编译软件是否变化、编译操纵项有无修改、模块文件有无修改,对“源文件”中所有模块文件编译,假如没有错误,再与“库文件”中所有库文件连接,生成代码文件(DOB、HEX文件)。 3、编译、连接结果

编译、连接过程中产生的信息显示在信息窗的“建立”视中。如有错误、警告信息,用鼠标左键双击错误、警告信息或将光标移到错误、警告信息上,回车,系统自动打开对应的出错文件,并定位于出错行上。 进入调试状态

在进入调试状态往常,请正确设置通信口:执行[ 主菜单 | 辅助 | 通信 ]。

仿真器配套的通信线能够与微机并口相连,即为并口通信线,假如并口地址是378H,请选择并口1;并口地址是278H,请选择并口2;并口地址是3BCH,请选择并口3。

仿真器配套的通信线能够与微机串口相连,即为串口通信线: 波特率

STAR系列、SUPER ICE51S使用串口通信时,波特率能够选择115200。 假如您选择串行通信,您可在此选择一个合适的波特率。通常,您能够选择缺省,一样情形下,星研集成环境软件会自动选择一个合适的波特率,用于仿真器与微机之间的通信,然而,关于有的微机可能选择的不合适,显现无法联机,或者过了几分钟,状态条中仍旧显现“正在通信”标志,按Esc键,退出联机状态,然后,由高(通常57600)到底,选择波特率,重新联机。

校验 通常您不必选中它,能够提高传送DOB/HEX文件时的速度。 假如编译、连接正确后,能够开始调试程序。进入调试状态方法:

a) 执行[ 主菜单 | 运行 | 进入调试状态] b) 点击工具条的

c) 执行[ 主菜单 | 运行 | 装载DOB、HEX、BIN文件]

在信息窗的“装载”视中,显示装载的代码文件,装载的字节数,装载完毕后,显示启始地址,终止地址。

装载完毕后,进入调试状态,能够依照您的需要,在[ 主菜单 | 查看]中打开:寄存器窗、存贮器窗1、2、3、观看窗、变量窗、反汇编窗。您也能够通过[ 主菜单 | 辅助 | 设置 | 格式],设置每一种窗口使用的字体、大小、颜色。移动窗口到您喜爱的位置、大小。

第一在“种类”中选择一个窗口,然后选择“字体”、“大小”,在“颜色”中选择某一类,在“前景”、“背景”中选择您喜爱的颜色。

关于高级语言,在您的程序前有一段库文件提供的初试化代码,

(当

前可执行标志)可不能显现在您的文件行上,假如您使用C语言,可将光标移到main函数上,按F4功能键,让CPU全速运行到main行上后停下;假如您使用PL/M语言,按F7功能键,让CPU“单步进入”,运行到您的任何一个可执行后停下。

您能够使用以下命令调试您的程序:

设置或清除断点(功能键为F2) 在当前光标行上设置或清除一个断点

单步进入(功能键F7)

单步执行当前行或当前指令,可进入函数或子程序。SUPER ICE16、SUPER ICE51“单步进入”时,不响应中断。 连续单步进入(功能键Ctrl + F7) 连续执行“单步进入”,用鼠标点击

或按任意键后,停止运行。SUPER

ICE16、SUPER ICE51“单步进入”时,不响应中断。 单步(功能键 F8)

单步执行当前行或当前指令,将函数或子程序作为一条指令来执行。假如当前行中含有函数、子程序、或发生中断,CPU将执行完整个函数、子程序、或中断,停止于当前行或当前指令的下一有代码的行上。SUPER ICE16、SUPER ICE51“单步”时,不响应中断。 连续单步(功能键 Ctrl + F8) 连续执行“单步”,用鼠标点击

或按任意键后,停止运行。SUPER ICE16、

SUPER ICE51“单步”时,不响应中断。 运行到光标行(功能键 F4)

从当前地址开始全速运行用户程序,碰到光标行、断点或用鼠标点击停止运行。

全速断点(功能键 F9)

从当前地址开始全速运行用户程序,碰到断点或用鼠标点击行。

全速运行(功能键Ctrl + F10)

从当前地址开始全速运行用户程序,现在,按用户系统的复位键,CPU从头开始执行用户程序,即关于MCS51类CPU是从0开始执行;关于MCS96、MCS196类CPU是从2080H开始执行。用鼠标点击

停止运行

终止微机与仿真器之间通信(功能键 ESC)。 5.2 调试过程中的问题及解决方法

在调试的过程中,由于源程序有多处错误,在编译时会显现提示,那个时候我们会依照提示对错误的地点进行修改,从而使程序编译成功。尽管编译成功了,然而这只是代表程序的语法方面没有错误,还有可能存在逻辑上的错误,如此也会导致仿确实不正确,从而使得仿真无法通过,那个时候就需要进行单步调试,有的时候也需要设置断点,或者是执行到光标处,运用这些指令,从而将程序进行进一步的调试。

,停止运行。

,停止运

6 总结

为期三周的单片机课程设计终止了,令我感到专门快乐,因为我真正的学到了东西,正所谓严师出高徒,在老师的严格要求下,在我看来差不多是完不成的任务,我按时完成了。往常的实训确实不可与课程设计同日而语,课程设计不仅锤炼我们的动手能力,而且还有自主学习的能力以及团队协作的能力,实训时老师要从旁指导,全程监督,而课程设计完全交给了我们自己去完成,交给了我们自己的团队。

人们都说看花容易绣花难,通过这此课程设计我深刻的明白得了那个道理。这次课程设计,遇到了专门多的困难,编写程序我们就研究了好久,有时做梦都能梦见写程序,达到了日有所思夜有所梦的地步。只是在我和我们组长和组员细心地研究,终于写出来了、去实验室去验证也和我们所想的一样。我们实验不只一次,有时我还要在晚上去实验室,去验证我的程序。功夫不负有心人,我们达到了我们想要的成效。我深深地明白这是老师在培养我们自学习的能力,在学校有专门好的老师告诉你,他们情愿倾囊相授,然而不是那种你问什么老师就回答你,因为如此做会导致我们毕业之后什么也可不能。遇到新的事物就可不能去认识它,因为我们在大学没有学到认识新事物的本领。后来我试着编写,终于实现了我想要的功能,我专门有成就感。

通过了这次课程设计,我不仅大大提高了系统设计和软件编程的能力,自身的各方面的素养也得到了提高。同时也培养了我的团队协作精神。一个人专门难完成的任务,通过团队便能够在最短的时刻和最高的质量完成,只是前提是要明白如何运用团队里的成员,要明白他们各自的长处,好好利用,才能得到事半功倍的成效,否则适得其反。这次课程设计不仅充实了我的自动化专业知识,扩大了知识面,增强分析问题和解决问题的能力,也提高自学的能力与软件开发能力,为今后的工作打下了坚实的基础。感谢老师们辛劳的带着我们学习新的东西!

7 参考文献

[1]谷树忠,刘文洲,姜航.Altium Designer 教程.电子工业出版社,2018 [2] 周航慈. 单片机应用程序设计技术[M].北京航空航天大学出版社,2018.2. [3] 李光才.单片机课程设计实例指导[M].北京:北京航空航天大学出版社 2004 [4] 赵文博.单片机语言C51程序设计[M].北京:人民邮电出版社,2005,10. [5] 徐爱钧, 彭秀华. 单片机高级语言C51应用程序设计[M].北京航空航天大学出版社,2006.

[6]于殿泓,王新年.单片机原理与程序设计实验教程[M].西安电子科技大学出版社,2007.8

附录

附录一:程序清单

;; AT89S52时钟程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;******************************************************************************

;定时器T0、T1溢出周期为50MS,T0为秒计数用, T1为调整时闪耀及秒表定时用,

;P1.1、P1.2、P1.3为调整按钮,P0口为字符输出口,P2为扫描口,P1.2为蜂呜器口,采 ;用共阳显示管。

;50H-55H为闹钟定时单元,60H-65H为秒表计时单元,72H-75H为显示时刻单元,76H-79H

;为分时计时单元。

;03H标志=0时钟闪耀,=1秒表, 05H=0,不闹铃,=1要闹铃. 07H每秒改变一次, ;用作间隔呜叫.

;******************************************************************************

DISPFIRST EQU 30H ;显示首址存放单元 BELL EQU P1.7

CONBS EQU 2FH ;存放报时次数 ;

;**************************************** ;; 中断入口程序 ;; ;**************************************** ;

ORG 0000H ;程序执行开始地址

LJMP START ;跳到标号START执行 ;ORG 0003H ;外中断0中断程序入口 ; LJMP INT00 ;外中断0中断返回 ORG 000BH ;定时器T0中断程序入口

LJMP INTT0 ;跳至INTTO执行

ORG 0013H ;外中断1中断程序入口

LJMP INT01 ;外中断1中断返回

ORG 001BH ;定时器T1中断程序入口 LJMP INTT1 ;跳至INTT1执行 ORG 0023H ;串行中断程序入口地址

RETI ;串行中断程序返回 ;

;**************************************** ;; 以下程序开始 ;; ;**************************************** ;整点报时用

QQQQ: MOV A,#10 MOV B,79H MUL AB ADD A,78H MOV CONBS,A CJNE A,#00H,BSLOOP MOV CONBS,#24H BSLOOP: JNB P1.0,INT_00 LCALL DS21MS LCALL DL1S LCALL DL1S ;LCALL DL1S DJNZ CONBS,BSLOOP

S1: CLR 08H ;清整点报时标志

AJMP START1

INT_00:LCALL DS20MS ;消抖 JB P1.0,BSLOOP

WALL1 : LCALL DISPLAY ;等键 开释 JNB P1.0, WALL1 AJMP S1 ;

;**************************************** ;; 主程序开始 ;; ;**************************************** ;

START: MOV R0,#00H ;清00H-7FH内存单元 MOV R7,#80H ; CLEARDISP: MOV @R0,#00H INC R0 ; DJNZ R7,CLEARDISP ;

MOV 20H,#00H ;清20H(标志用) MOV 55H,#1 MOV 54H,#2

MOV 7AH,#0AH ;放入\"熄灭符\"数据 MOV TMOD,#11H ;设T0、T1为16位定时器 MOV TL0,#00H ;50MS定时初值(T0计时用) MOV TH0,#4CH ;50MS定时初值

MOV TL1,#00H ;50MS定时初值(T1闪耀定时用) MOV TH1,#4CH ;50MS定时初值 SETB EA ;总中断开放 SETB ET0 ;承诺T0中断 SETB TR0 ;开启T0定时器

MOV R4,#14H ;1秒定时用计数值(50MS×20) MOV DISPFIRST,#70H ;显示单元为70-75H

;

;以下主程序循环

START1: LCALL DISPLAY ;调用显示子程序 JB 08H, QQQQ

INT01: JNB P1.1,SETMM1 ;P1.1口为0时转时刻调整程序 JNB P1.2,TSFUN ;定时闹铃设定

JNB P1.3,FUNPT ;秒表功能(STOP,RUN,CLR AJMP START1 ;P1.1口为1时跳回START1 FUNPT: LJMP FUNPTT START12: LJMP START1 ;以下闹铃时刻设定程序,按P1.2进入设定 TSFUN: LCALL DS20MS

JB P1.2,START1 ;

WAIT113: JNB P1.2,WAIT113 ;等待键开释

JB 05H,CLOSESP ;闹铃已开的话,关闹铃 MOV DISPFIRST,#50H ;进入闹铃52-55H闹钟定时单元 DSWAIT: SETB EA LCALL DISPLAY

JNB P1.3,DSFINC ;分加1 JNB P1.1,DSDEC ;分减1 JNB P1.2,DSSFU ;进入时调整 AJMP DSWAIT

CLOSESP: CLR 05H ;关闹铃标志 CLR BELL AJMP START1

DSSFU: LCALL DS20MS ;消抖 JB P1.2, DSWAIT

LJMP DSSFUNN ;进入时调整 SETMM1: LJMP SETMM ;转到时刻调整程序SETMM DSFINC : LCALL DS20MS ;消抖 JB P1.3, DSWAIT

DSWAIT12: LCALL DISPLAY ;等键 开释 JNB P1.3, DSWAIT12 CLR EA

MOV R0,#53H ;

LCALL ADD1 ;闹铃设定分加1 MOV A,R3 ;分数据放入A CLR C ;清进位标志 CJNE A,#60H,ADDHH22 ;

ADDHH22: JC DSWAIT ;小于60分时返回

ACALL CLR0 ;大于或等于60分时分计时单元清0

AJMP DSWAIT

DSDEC : LCALL DS20MS ;消抖 JB P1.1, DSWAIT

DSWAITEE: LCALL DISPLAY ;等键 开释 JNB P1.1, DSWAITEE CLR EA

MOV R0,#53H ;

LCALL SUB1 ;闹铃设定分减1 LJMP DSWAIT

;以下秒表暂停\\清零功能程序

;按下P1.3切换秒表功能,再按开始计时,暂停或清0,最后按P1.3退出秒表回到时钟计时

FUNPTT: LCALL DS20MS JB P1.3,START12 WAIT22: JNB P1.3,WAIT21 CPL 03H JNB 03H,TIMFUN

MOV DISPFIRST,#60H ;显示秒表数据单元

MOV 60H,#00H MOV 61H,#00H MOV 62H,#00H MOV 63H,#00H MOV 64H,#00H MOV 65H,#00H

MOV TL1,#0F0H ;10MS定时初值 MOV TH1,#0D8H ;10MS定时初值 WAIT88:LCALL DS20MS JB P1.3,WAIT81 WAIT99:JNB P1.3,WAIT99

SETB TR1 ;T1运行操纵软件 SETB ET1 ;T1溢出中断承诺 WAIT33: LCALL DS20MS JB P1.3,WAIT31 WAIT44: JNB P1.3,WAIT41 CLR ET1 CLR TR1 WAIT55: LCALL DS20MS JB P1.3,WAIT51 WAIT66: JNB P1.3,WAIT61 MOV 60H,#00H MOV 61H,#00H MOV 62H,#00H MOV 63H,#00H MOV 64H,#00H MOV 65H,#00H

TIMFUN:MOV DISPFIRST,#70H ;显示时钟数据单元 CLR ET1 CLR TR1

AJMP FUNSS11 FUNSS11: AJMP START1 ;以下键等待开释时显示可不能熄灭用 WAIT21: LCALL DISPLAY AJMP WAIT22 WAIT31: LCALL DISPLAY AJMP WAIT33 WAIT41: LCALL DISPLAY AJMP WAIT44 WAIT51: LCALL DISPLAY AJMP WAIT55 WAIT61: LCALL DISPLAY AJMP WAIT66 WAIT81: LCALL DISPLAY AJMP WAIT88 WAIT91: LCALL DISPLAY AJMP WAIT99

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 1秒计时程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;T0中断服务程序

INTT0: PUSH ACC ;累加器入栈爱护 PUSH PSW ;状态字入栈爱护 CLR ET0 ;关T0中断承诺 CLR TR0 ;关闭定时器T0 MOV A,#07H ;中断响应时刻同步修正 ADD A,TL0 ;低8位初值修正

MOV TL0,A ;重装初值(低8位修正值) MOV A,#4CH ;高8位初值修正 ADDC A,TH0 ;

MOV TH0,A ;重装初值(高8位修正值) SETB TR0 ;开启定时器T0

DJNZ R4, OUTT0 ;20次中断未到中断退出 ADDSS: MOV R4,#14H ;20次中断到(1秒)重赋值 CPL 07H ;闹铃时刻隔呜叫用

MOV R0,#71H ;指向秒计时单元(70H-71H) ACALL ADD1 ; MOV A,R3 ; CLR C ; CJNE A,#60H,ADDMM ;

ADDMM: JC OUTT0 ; ACALL CLR0 ; MOV R0,#77H ; ACALL ADD1 ; MOV A,R3 ; CLR C ; CJNE A,#60H,ADDHH ; ADDHH: JC

OUTT0 ; ACALL CLR0 ; LCALL DS20MS ; SETB 08H

MOV R0,#79H ; ACALL ADD1 ; MOV A,R3 ; CLR C ; CJNE A,#24H,HOUR ;

HOUR: JC OUTT0 ; ACALL CLR0 ; OUTT0: MOV 72H,76H ; MOV 73H,77H ;调用加1程序(加1秒操作) 秒数据放入A(R3制数组合) 清进位标志 小于60秒时中断退出 大于或等于60秒时单元清0 指向分计时单元(76H-77H) 分计时单元加1分钟 分数据放入A 清进位标志 小于60分时中断退出

大于或等于60分时分元清0 正点报时 指向小时计时单元78H-79H) 小时计时单元加1小时 时数据放入A 清进位标志 小于24小时中断退出 大于或等于24小时单元清0 中断退出时将分、时计数据移 入对应显示单元

MOV 74H,78H ; MOV 75H,79H ; LCALL BAOJ

POP PSW ;复原状态字(出栈) POP ACC ;复原累加器 SETB ET0 ;开放T0中断 RETI ;中断返回 ;**************************************** ;; 闪动调时程序\\秒表功能程序 ;; ;****************************************

;T1中断服务程序,用作时刻调整时调整单元闪耀指示或秒表计时 INTT1: PUSH ACC ;中断现场爱护 PUSH PSW ;

JB 03H, MMFUN ;=1时秒表

MOV TL1, #00H ;装定时器T1定时初值 MOV TH1, #4CH DJNZ R2,INTT1OUT MOV R2,#06H CPL 02H JB 02H,FLASH1

;

;0.3秒未到退出中断(5断次) ;重装0.3秒定时用初值 ;0.3秒定时到对闪耀标志取反 ;02H位为1时显示单元\"熄灭\"

MOV 72H,76H ;02H位为0时正常显示 MOV 73H,77H ; MOV 74H,78H ; MOV 75H,79H ; INTT1OUT: POP PSW ;复原现场 POP ACC ; RETI ;中断退出

FLASH1: JB 01H,FLASH2 ;01H位为1时,转小时熄灭操纵 MOV 72H,7AH ;01H位为0时,\"熄灭符\"数据放入分 MOV 73H,7AH ;显示单元(72H-73H),将不显示分数据

MOV 74H,78H ; MOV 75H,79H ;

AJMP INTT1OUT ;转中断退出

FLASH2: MOV 72H,76H ;01H位为1时,\"熄灭符\"数据放入小时 MOV 73H,77H ;显示单元(74H-75H),小时数据将不显示 MOV 74H,7AH ; MOV 75H,7AH ;

AJMP INTT1OUT ;MMFUN : CLR TR1

MOV A,#0F7H ; ADD A,TL1 ; MOV TL1,A ; MOV A,#0D8H ; ADDC A,TH1 ;

MOV TH1,A ; SETB TR1 ; MOV R0,#61H ; ACALL ADD1 ; CLR C ; MOV A,R3 ;

JZ FSS1 ; AJMP OUTT01 ; FSS1: ACALL MOV ACALL ADD1 ; MOV CLR C ; CJNE A,#60H,ADDHH1 ;

ADDHH1: JC LCALL 转中断退出 中断响应时刻同步修正,重装初值(10ms) 低8位初值修正

重装初值(低8位修正值) 高8位初值修正 重装初值(高8位修正值) 开启定时器T1

指向秒计时单元(71H-72H) 调用加1程序(加1秒操作) 加1后为00,C=0 加1后不为00,C=1 CLR0 ;大于或等于60秒时对秒计时单元清0 R0,#63H ;指向分计时单元(76H-77H) 分计时单元加1分钟 A,R3 ;分数据放入A 清进位标志 OUTT01 ;小于60分时中断退出 CLR0 ;大于或等于60分时分计时单元清0

MOV R0,#65H ;指向小时计时单元(78H-79H)

ACALL ADD1 ;小时计时单元加1小时 OUTT01:

POP PSW ;复原状态字(出栈) POP ACC ;复原累加器

RETI ;中断返回 ; ;**************************************** ;; 加1子 程 序 ;; ;****************************************

ADD1: MOV A,@R0 ;取当前计时单元数据到A DEC R0 ;指向前一地址

SWAP A ;A中数据高四位与低四位交换 ORL A,@R0 ;前一地址中数据放入A中低四位 ADD A,#01H ;A加1操作 DA A ;十进制调整 MOV R3,A ;移入R3寄存器 ANL A,#0FH ;高四位变0 MOV @R0,A ;放回前一地址单元 MOV A,R3 ;取回R3中暂存数据 INC R0 ;指向当前地址单元

SWAP A ;A中数据高四位与低四位交换 ANL A,#0FH ;高四位变0

MOV @R0,A ;数据放入当削地址单元中 RET ;子程序返回 ;**************************************** ;; 分减1子 程 序 ;; ;**************************************** ;

SUB1: MOV A,@R0 ;取当前计时单元数据到A

DEC R0 ;指向前一地址

SWAP A ;A中数据高四位与低四位交换 ORL A,@R0 ;前一地址中数据放入A中低四位 JZ SUB11

DEC A ;A减1操作 SUB111: MOV R3,A ;移入R3寄存器 ANL A,#0FH ;高四位变0 CLR C ;清进位标志 SUBB A,#0AH SUB1111: JC SUB1110

MOV @R0,#09H ;大于等于0AH,为9 SUB110: MOV A,R3 ;取回R3中暂存数据 INC R0 ;指向当前地址单元

SWAP A ;A中数据高四位与低四位交换 ANL A,#0FH ;高四位变0

MOV @R0,A ;数据放入当削地址单元中 RET ;子程序返回 SUB11: MOV A,#59H AJMP SUB111

SUB1110:MOV A,R3 ;移入R3寄存器 ANL A,#0FH ;高四位变0 MOV @R0,A AJMP SUB110

;**************************************** ;; 时减1子 程 序 ;; ;****************************************

SUBB1:MOV A,@R0 ;取当前计时单元数据到A DEC R0 ;指向前一地址

SWAP A ;A中数据高四位与低四位交换 ORL A,@R0 ;前一地址中数据放入A中低四位

JZ SUBB11 ;00减1为23(小时) DEC A ;A减1操作 SUBB111:MOV R3,A ;移入R3寄存器 ANL A,#0FH ;高四位变0 CLR C ;清进位标志 SUBB A,#0AH ;时个位大于9为9 SUBB1111: JC SUBB1110 ;

MOV @R0,#09H ;大于等于0AH,为9 SUBB110: MOV A,R3 ;取回R3中暂存数据 INC R0 ;指向当前地址单元

SWAP A ;A中数据高四位与低四位交换 ANL A,#0FH ;高四位变0 MOV @R0,A ;时十位数数据放入 RET ;子程序返回 SUBB11: MOV A,#23H AJMP SUBB111

SUBB1110:MOV A,R3 ;时个位小于0A不处理 ANL A,#0FH ;高四位变0 MOV @R0,A ;个位移入 AJMP SUBB110

;**************************************** ;; 清零程序 ;; ;**************************************** ;对计时单元复零用 CLR0: CLR MOV DEC MOV

A ;清累加器 @R0,A ;清当前地址单元 R0 ;指向前一地址 @R0,A ;前一地址单元清0

RET ;子程序返回 ;

;**************************************** ;; 时钟时刻调整程序 ;; ;**************************************** ;当调时按键按下时进入此程序

SETMM: cLR ET0 ;关定时器T0中断 CLR TR0 ;关闭定时器T0 LCALL DL1S ;调用1秒延时程序 LCALL DS20MS ;消抖

JB P1.1,CLOSEDIS;键按下时刻小于1秒,关闭显示(省电) MOV R2,#06H ;进入调时状态,赋闪耀定时初值 MOV 70H,#00H ;调时时秒单元为00 秒 MOV 71H,#00H

SETB ET1 ;承诺T1中断 SETB TR1 ;开启定时器T1 SET2: JNB SETB SET4: JB

P1.1,SET1 ;P1.1口为0(键未开释),等待 00H ;键开释,分调整闪耀标志置1 P1.1,SET3 ;等待键按下

LCALL DL05S ;有键按下,延时0.5秒 LCALL DS20MS ;消抖

JNB P1.1,SETHH ;按下时刻大于0.5秒转调小时状态 MOV LCALL MOV CLR

R0,#77H ;按下时刻小于0.5秒加1分钟操作 ADD1 ;调用加1子程序 A,R3 ;取调整单元数据 C ;清进位标志

CJNE A,#60H,HHH ;调整单元数据与60比较 HHH: JC LCALL CLR AJMP

SET4 ;调整单元数据小于60转SET4循环 CLR0 ;调整单元数据大于或等于60时清0 C ;清进位标志 SET4 ;跳转到SET4循环

CLOSEDIS: SETB ET0 ;省电(LED不显示)状态。开T0中断

SETB TR0 ;开启T0定时器(开时钟) CLOSE: JB P1.1,CLOSE ;无按键按下,等待。 LCALL DS20MS ;消抖 JB WAITH: JNB LJMP

P1.1,CLOSE ;是干扰返回CLOSE等待 P1.1,WAITH ;等待键开释

START1 ;返回主程序(LED数据显示亮)

SETHH: CLR 00H ;分闪耀标志清除(进入调小时状态) SETB 01H ;小时调整标志置1 SETHH1: JNB SET6: JB

P1.1,SET5 ;等待键开释 P1.1,SET7 ;等待按键按下

LCALL DL05S ;有键按下延时0.5秒 LCALL DS20MS ;消抖

JNB P1.1,SETOUT ;按下时刻大于0.5秒退出时刻调整 MOV LCALL MOV CLR

R0,#79H ;按下时刻小于0.5秒加1小时操作 ADD1 ;调加1子程序 A,R3 ; C ;

CJNE A,#24H,HOUU ;计时单元数据与24比较 HOUU: JC LCALL AJMP SETOUT: JNB

SET6 ;小于24转SET6循环 CLR0 ;大于或等于24时清0操作 SET6 ;跳转到SET6循环

P1.1,SETOUT1 ;调时退出程序。等待键开释

LCALL DS20MS ;消抖 JNB CLR CLR CLR CLR CLR SETB

P1.1,SETOUT ;是抖动,返回SETOUT再等待 01H ;清调小时标志 00H ;清调分标志 02H ;清闪耀标志 TR1 ;关闭定时器T1 ET1 ;关定时器T1中断 TR0 ;开启定时器T0

SETB ET0 ;开定时器T0中断(计时开始)

LJMP START1 ;跳回主程序

SET1: LCALL DISPLAY ;键开释等待时调用显示程序(调分) AJMP SET2 ;防止键按下时无时钟显示 SET3: LCALL DISPLAY ;等待调分按键时时钟显示用 JNB P1.2, FUNSUB ;减1分操作 AJMP SET4 ;调分等待

SET5: LCALL DISPLAY ;键开释等待时调用显示程序(调小时) AJMP SETHH1 ;防止键按下时无时钟显示 SET7: LCALL DISPLAY ;等待调小时按键时时钟显示用 JNB P1.2, FUNSUBB ;小时减1操作 AJMP SET6 ;调时等待

SETOUT1: LCALL DISPLAY ;退出时钟调整时键开释等待 AJMP SETOUT ;防止键按下时无时钟显示 ;FUNSUB,分减1程序

FUNSUB: LCALL DS20MS ;消抖

JB P1.2,SET41 ;干扰,返回调分等待 FUNSUB1: JNB P1.2,FUNSUB1 ;等待键放开 MOV R0,#77H ;

LCALL SUB1 ;分减1程序 LJMP SET4 ;返回调分等待 SET41: LJMP SET4 ;

;FUNSUBB,时减1程序 ; FUNSUBB: LCALL DS20MS ;消抖

JB P1.2,SET61 ; 干扰,返回调时等待 FUNSUBB1: JNB P1.2,FUNSUBB1 ; 等待键放开 MOV R0,#79H ;

LCALL SUBB1 ; 时减1程序 LJMP SET6 ; 返回调时等待 SET61: LJMP SET6

;*************************************** ;; 显示程序 ;; ;***************************************

; 显示数据在70H-75H单元内,用六位LED共阳数码管显示,P0口输出段码数据,P2口作

; 扫描操纵,每个LED数码管亮1MS时刻再逐位循环。 DISPLAY: MOV MOV PLAY: MOV MOV MOV MOV MOVC MOV

R1,DISPFIRST ;指向显示数据首址 R5,#0FEH ;扫描操纵字初值 A,R5 ;扫描字放入A P2,A ;从P2口输出 A,@R1 ;取显示数据到A DPTR,#TAB ;取段码表地址 A,@A+DPTR ;查显示数据对应段码 P0,A ;段码放入P1口

MOV A,R5 ;

JB ACC.2,LOOP5 ;小数点处理 CLR P0.7 ;

LOOP5: JB ACC.4,LOOP6 ;小数点处理 CLR P0.7 ; LOOP6: LCALL INC MOV JNB RL MOV MOV

DL1MS ;显示1MS R1 ;指向下一地址 A,R5 ;扫描操纵字放入A ACC.5,ENDOUT ;ACC.5=0时一次显示终止 A ;A中数据循环左移 R5,A ;放回R5内 P0,#0FFH

AJMP PLAY ;跳回PLAY循环

ENDOUT: MOV P2,#0FFH ;一次显示终止,P2口复位 MOV

P0,#0FFH ;P0口复位

RET ;子程序返回

TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH ;共阳段码表 \"0\"\"1\"\"2\" \"3\"\"4\"\"5\"\"6\"\"7\" \"8\"\"9\"\"不亮\"“A”“-” ;************************************* ;以下是闹铃时刻设定程序中的时调整程序 ;*************************************

DSSFUNN: LCALL DISPLAY ;等待键开释 JNB P1.2, DSSFUNN WAITSS: SETB EA LCALL DISPLAY

JNB P1.3,FFFF ;时加1键 JNB P1.1,DDDD ;时减1

JNB P1.2,OOOO ;闹铃设定退出键 AJMP WAITSS

OOOO: LCALL DS20MS ;消抖 JB P1.2,WAITSS

DSSFUNNM: LCALL DISPLAY ;键开释等待 JNB P1.2, DSSFUNNM MOV DISPFIRST,#70H LJMP START1

FFFF: LCALL DS20MS ;消抖 JB P1.3, WAITSS

DSSFUNMM: LCALL DISPLAY ;键开释等待 JNB P1.3, DSSFUNMM CLR EA MOV R0,#55H LCALL ADD1

MOV A,R3 ; CLR C ; CJNE A,#24H,ADDHH33N ; ADDHH33N: JC WAITSS ;小于24点返回

ACALL CLR0 ;大于等于24点清零 AJMP WAITSS

DDDD : LCALL DS20MS ;消抖 ; JB P1.1, WAITSS

DSSFUNDD: LCALL DISPLAY ;键开释等待 JNB P1.1, DSSFUNDD CLR EA MOV R0,#55H LCALL SUBB1 LJMP WAITSS ;********************* ;以下是闹铃判定子程序 ;*********************

BAOJ: MOV A,79H ;位顺序比较

CJNE A,55H,BBAO MOV A,78H CLR C

BB3: CJNE A,54H,BBAO MOV A,77H CLR C

CJNE A,53H,BBAO MOV A,76H CLR C CJNE A,52H,BBAO CLR C CLR BELL RET

BB2: CJNE A,52H,BBAO

JNB 07H,BBAO ;07H从时十位、个位、分十位、分个在1秒到时会取反

QQ: CLR BELL ;时分相同时呜叫(1秒间隔叫) JNB P1.0,WOQ RET

WOQ: LCALL DS20MS ;消抖 JB P1.0,QQ

WALL1a : LCALL DISPLAY ;等键 开释 JNB P1.0, WALL1a

BBAO: SETB BELL ;不相同或闹铃不开 RET

;******************************************* ;; 延时程序 ;; ;******************************************* ;

;1MS延时程序,LED显示程序用 DL1MS: MOV R6,#14H DL1: MOV R7,#19H DL2: DJNZ DJNZ RET

;20MS延时程序,采纳调用显示子程序以改善LED的显示闪耀现象 DS20MS: CLR BELL LCALL DISPLAY LCALL DISPLAY LCALL DISPLAY SETB BELL RET

DS21MS: CLR BELL LCALL

DISPLAY R7,DL2 R6,DL1

LCALL DISPLAY LCALL DISPLAY

SETB BELL RET

;延时程序,用作按键时刻的长短判定 DL1S: LCALL DL05S LCALL DL05S RET

DL05S: MOV R3,#20H ;8毫秒*32=0.196秒 DL05S1: LCALL DISPLAY DJNZ R3,DL05S1 RET

;******************************************************** END ;程序终止

附录二 系统硬件原理图及PCB图

图一:

系统硬件原理图

图二:

PCB图

因篇幅问题不能全部显示,请点此查看更多更全内容