找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2503|回复: 2
打印 上一主题 下一主题
收起左侧

基于51单片机汇编写的校园作息控制系统程序资料

[复制链接]
跳转到指定楼层
楼主
ID:641762 发表于 2019-12-25 16:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机作息时间控制实现了对时间控制的智能化,摆脱了传统由人来控制时间的长短的不便,是现代学校必不可少的教学设备。针对单片机课程的学习与熟练运用,本设计预计完成一套完整的校园作息时间控制系统,锻炼学生的独立思考能力与学习能力,在学生本人积极实践、查阅资料的基础上完成设计。
1.2设计任务要求
能按照作息时间发出铃声提示信息,以蜂鸣器模拟,响铃15秒;能按照需要调整作息时间(夏季和冬季),并能调整当前系统的时间;用数码管显示当前时间。

2. 系统硬件电路的设计
2.1 51单片机时钟电路
时钟电路就是一个振荡器,给单片机提供一个节拍,单片机执行各种操作必须在这个节拍的控制下才能进行。因此单片机没有时钟电路是不会正常工作的。在MCS-51单片机内有一个高增益的反相放大器,反相放大器的输入端为XTAL1,输出端为XTAL2,由该放大器构成的振荡电路和时钟电路一起构成了单片机的时钟方式。
在内部方式时钟电路中,必须在XTAL1和XTAL2引脚两端跨接石英晶体振荡器和两个微调电容构成振荡电路,通常C1和C2一般取30pF,晶振的频率取值在1.2MHz~12MHz之间。晶体振荡器的振荡信号从XTAL2端送入内部时钟电路,它将该振荡信号二分频, 产生个两相时钟信号P1和P2供单片机使用。时钟信号的周期称为状态时间S,它是振荡周期的2倍,P1信号在每个状态的前半周期有效,在每个状态的后半周期P2信号有效。CPU就是以两时钟P1和P2为基本节拍协调单片机各部分有效工作的。
复位信号RST高电平有效,在输入端保持两个机器周期的高电平后,就可以完成复位操作。此外,该引脚还有掉电保护功能,若在该端接+5V备用电源,在使用中若掉电,可保护片内RAM中信息不丢失。
时钟及复位电路如图1所示。

图1 时钟及复位电路

2.2 74LS164寄存器
74LS164 简述:串行输入带锁存、时钟输入、串行输入带缓冲、异步清除、最高时钟频率可高达36Mhz。当清除端(CLEAR)为低电平时,输出端()均为低电平。串行数据输入端(A,B)可控制数据。当 A、B 任意一个为低电平,则禁止新数据输入,在时钟端(CLOCK)脉冲上升沿作用下为低电平。当 A、B 有一个为高电平,则另一个就允许输入数据,并在CLOCK上升沿作用下决定的状态。
74LS164真值表如表1所示。

表1  74LS164真值表

输入
输出
同步清除输入端
时钟输入端
串行数据输入端(A,B)
……
×
×
×
……
×
×
……
……
×
……
×
……

74LS164 逻辑符号及其引脚图如图2所示。

图2 逻辑符号(左)及引脚图(右)

2.3 总体方案设计
根据系统的要求,确定系统的总体方案如图3所示。

图3 系统总体设计方案

本系统设计的原理是利用单片机 AT89S51 的定时器/计数器定时和计数的原
理。通过四联共阴极数码显示管接收由 74LS164 传来的数据并将其转换为十进制BCD 码显示,该设计将软、硬件有机地结合起来,使得系统能够正确地进行计时,
数码管能够正确地显示时间。
按键模块中的按钮 SW1、SW2、SW3 、SW4、SW5与 AT89S51 的 P3 口相连,对单片机起到控制作用,通过按键控制模块把外界响应送到单片机最小系统(AT89S51)中,然后通过接口电路把要显示的时间送到四联 LED 数码管中,四联 LED 数码管的字段由串入并出的移位寄存器74LS164 控制,74LS164 的串行数据输入端由 P1.7控制,移位脉冲由 P1.6 提供,字位由 P1.0至P1.5 控制,P1.0至P1.5 对应控制 L6至L1。SW1至SW5 用来进行时间校准及控制时间点的设定。

2.4 具体电路设计

2.4.1 按键控制模块的设计

本模块的控制电路主要由(冬季、夏季)指示灯、蜂鸣器与接于P3口的五个开关组成。SW1控制作息时间(闭合冬季、断开夏季);SW2调节小时,每次加1;SW3调节分钟,每次加1;SW4为手动定时开关,储存数码管当前显示的时间,下次再到这一时间时响铃亮灯;SW5为清除手动定时开关,将所有手动定时数据清除。
按键设计模块的设计图如图4所示

图4 功能按键及指示灯(左)

2.4.2  输入电路的设计

本模块的输入电路主要由单片机的P1管脚及74LS164移位寄存器的输出管口组成。P1.1、P1.2、P1.3、P1.4、P1.5、P1.6分别接数码管的L6、L5、L4、L3、L2、L1管脚,寄存器的3至12管脚分别接数码管的A至G管脚。P1.7管脚接寄存器的1、2管脚,作为串行数据输入端;P1.6管脚接寄存器的8管脚,作为移位脉冲。
本模块的设计电路如图5所示。

图5 输入电路模块

2.4.3  LCD显示模块设计

本模块主要由一个6位共阴极数码管和一个三输入一输出的或非门组成。数码管依次显示L1至L6管脚对应的位数,L6控制第1位及秒个位(从右向左),L5控制第2位及秒十位,L4控制第3位及分个位,L3控制第4位及分十位,L2控制第5位及时个位,L1控制第6位及时分位,高电平有效。或非门的输入端分别连接L2、L4、L6,输出端连接DP,循环点亮L2、L4、L6所对应的数码管的园点,用以区分时、分、秒。
本模块的电路设计如图6所示。

图6 LCD显示模块

2.5  系统总体电路
在此给出整个系统的完整的电路图,如图7所示。

图7 整体电路图

2.6  系统所用元器件
    本系统所用的元器件清单如表2所示。

表2  本系统所用的元器件

元器件名称
数量
指示灯
2
按钮开关
5
5V电源
3
移位寄存器74LS164
1
七段译码显示器7SEG-MAX6-CCBLUE
2
晶振12MHz
1
电容30pF
2
电解电容10uF
1
电阻10K
1
蜂鸣器
1
导线
若干
或非门74LS10
1

3. 系统软件设计
3.1 软件设计思路
对于时钟功能,需要在数码管上显示当前的时间的小时、分钟及秒,因此,可以在内部存储空间分别定义它们的显示缓存空间,来存放小时、分钟、秒的 BCD 码,各2个字节。
由于时钟是不能停止的,因此需要采用内部定时器自动计时,并使用定时器中断处理程序来定时进行时间数值的刷新。51 单片机的2个定时器都具有 16 位时器的工作模式。当晶振为12MHz 时,16 位定时器的最大定时值为 65.536ms,要达到 1 秒钟,采用一个定时器定时与软件计数相结合的方法。例如使用 T0,为了达到较为准确的计时,使 T0 的溢出时间为 50ms,使用一个字节作为软件计数器 MS,计数值为 20。定时器的中断处理程序对 MS 进行减 1 操作,当MS 为 0 时,1 秒到达,此时更新存放小时、分钟、秒的显示缓存区。
3.2 程序设计

3.2.1  主程序设计

本次设计程序代码通过汇编语言编写。首先定义各脚口和变量名称,其次编写各个子程序,最后编写主程序与中断程序实现功能。
主程序开始,设置栈区为70H至7FH,运用T0工作方式1进行中断,定义循环初始值为20,定义分秒时初始值为0(及开机显示00:00);根据50ms中断设置TL0与TH0的参数;设置手动定时初始存储单元为62H;输入分钟值,依次调用拆分子程序、显示子程序、数据存储子程序、读及校时子程序、清除手动定时子程序、比较亮灯子程序,手动定时子程序;循环运行。
主程序流程图如图8所示。

图8 主程序流程图

3.2.2  拆分子程序设计

拆分子程序开始,取秒个位,指向秒个位显示缓冲单元;取秒十位,指向秒十位显示缓冲单元;取分个位,指向分个位显示缓冲单元;取分十位,指向分十位显示缓冲单元;取时个位,指向时个位显示缓冲单元;取时十位,指向时十位显示缓冲单元;最后将秒、分钟、小时数据依次存入6AH至6FH单元中。
拆分子程序流程图如图9所示。

图9 拆分子程序流程图

3.2.3  显示子程序设计

显示子程序开始,送显示缓冲首地址(R0)及字位码(R2),送字形表首地址,关显示器,查字形表取待显示字,传送分个位字形到74LS164,R0加1并显示区下一位,点亮对应码的显示管,修改字位码,修改字位码送到A,判断ACC.6是否为1(是:转到查字形表操作;否:结束该程序)。
显示子程序流程图如图10所示。

图10 显示子程序流程图

3.2.4  数据存储子程序设计

数据存储子程序开始,因为西农上午作息时间夏季与冬季相同,所以直接将上午的十个时间值分别存入20H到3DH;然后判断SW1是否闭合,若闭合将冬季作息时间值存入到3EH到61H,若断开将夏季作息时间值存入到3EH到61H,结束子程序。
数据存储子程序流程图如图11所示。

图11 数据存储子程序流程图

3.2.5  读及校时子程序设计

本子程序设计对分钟和小时进行校时。在设计中用按钮SW3控制分;用按钮SW2控制时。按一下按钮,数值加1;若按钮闭合,则一直加1。分钟每60循环,小时每24循环。本子程序流程图如图12所示。

图12 读及校时子程序流程图

3.2.6  比较子程序设计

本子程序设计主要运用了判断选择结构,定位初始数据时间存储单元20H,将当前时间依次与它们比较。先比较小时,若相等再比较分钟,若分钟相等,接着判断SW1是否闭合,若闭合冬季指示灯亮,否则夏季指示灯亮,最后使蜂鸣器响;
若小时不相等,跳转到下个数据存储单元,判断该存储单元是否为空(若为空,结束比较;不为空,继续执行),判断当前数据的地址是否大于6FH,若大于,结束比较;若小于,继续进行比较。
若分钟不相等,跳转到下个数据存储单元,判断该存储单元是否为空(若为空,结束比较;不为空,继续执行),判断当前数据的地址是否大于6FH,若大于,结束比较;若小于,继续进行比较。本子程序流程图如图13所示。

图13 比较亮灯子程序流程图


3.2.7  手动定时子程序设计

本设计手动定时值为当前时间,按下按钮SW4,存下当前时间并报警,当下一次达到该时间时,会再度报警。因为内存单元的局限性,手动定时最多可存储3个时间,当存储第4个时间时,则会覆盖第1个时间。程序代码如下:
MANUAL:JB SW4,ZZ  ;判断开关是否闭合
MOV R1, B               
CJNE  R1, #69H, $+3              ;判断存储单元小于69H
JC ZY
MOV R1, #62H     ;手动存储单元首地址
MOV B, R1
ZY: MOV @R1,Hour   ;存小时
INC R1
MOV @R1, Minute   ;存分钟
INC R1
MOV @R1, Secs   ;存秒
INC R1
MOV B, R1
ZZ: RET

3.2.8  清除手动定时子程序设计

本子程序目的是清除手动定时的数据,当按下按钮SW5时,将清除之前存储的所有手动定时数据。程序代码如下:
Clear: JB SW5,XX  ;判断按钮SW5是否闭合
MOV  R1, #62H   ;定位手动定时数据初始单元地址
CLRP1: CLR A
MOV @R1, A     ;清除
INC R1
CJNE  R1, #6AH, CLRP1
XX: RET

4. 系统调试与仿真4.1  作息时间切换功能的调试
当按下按钮SW1时,切换为冬季作息时间;当按钮弹开时,切换为夏季作息时间。仿真过程中比较顺利,没有出现问题。仿真结果如图14、15所示。

图14 冬季作息时间亮灯

图15 夏季作息时间亮灯

4.2  调时调分功能的调试
按一下SW2、SW3分别对小时、分钟进行调时,若按钮不弹开,则一直处于调时状态。在本功能的仿真调试过程中,发现按钮有一些抖动,及按一下按钮跳动2个或2个以上的数字,后改动相关参数增加延时时间,基本解决抖动问题。
将分钟、小时调节时间加1,仿真结果如图16所示。

图16 调时(左:调时前,右:调时后)

4.3  手动定时功能的调试
按一下SW4进行手动定时,将数码管当前显示的时间保存(当前秒的数据不进行保存),同时进行报警并在下一次到达该时间时再次报警(报警定时不分冬季夏季)。在仿真过程中,发现00:00:00~00:59:00无法进行手动定时,分析问题后,认为在比较模块的判断结构上有一些问题,只进行了时判断,没有进行分判断,从而导致在该段时间无法定时。但更改程序后,仍无法在该段时间进行手动定时,需要继续进行调试改进。
增设01:00手动定时,仿真如图17所示。

图17 手动定时

4.4  清除手动定时功能的调试
按下按键SW5清除之前设置的所有手动定时数据。在该功能调试过程中没有出现问题。
清除01:00手动定时,仿真如图18所示。

图18 清除手动定时(左:定时灯亮,右:清除定时灯灭)

4.5  蜂鸣器定时报警15s功能的调试
在到达程序设定时间或手动设置时间时,指示灯亮并且蜂鸣器开始报警,报警时长15s。仿真如图19所示。

图19 定时报警15s(左:开始报警,右:结束报警)


5. 总结5.1 本系统的优缺点
本系统优点:本设计可以方便快捷的按照作息时间进行响铃报警提示,可以调节当前系统时间,可以手动增加或删除定时时间,操作简单容易推广。
本系统不足:在手动定时方面有一些问题,无法在00:00:00~0:59:00进行手动定时;定时精度尚要进行调整;可以在程序代码和仿真电路上进一步优化。

本设计的第一步是确定电路的整体框架,包括调节时间模块、数据存储模块、手动定时模块、清除模块等,然后是开始各个子程序的编写与逐步调试。在这一过程中我遇到了许多问题,比如转移指令的使用,堆栈的创建。我积极的询问老师、查阅书籍,最后解决了问题。
本设计的第二部是仿真电路的设计,首先确定各个模块所需的元器件,然后分布空间进行总的电路图的搭建。在这一过程中,老师也提出了有针对性的建议,比如我一开始设计了8个指示灯进行报警提示,但由于指示灯亮灭较为无序,改为只有冬季与夏季两个指示灯;然后进行按钮功能的明确化与简洁化,使操作者能比较容易的使用该套系统。

单片机源程序如下:
  1. ;作息时间控制系统
  2. OUT BIT P3.7
  3. F1 BIT 1BH                            ;T1的位置
  4. SDATA BIT P1.7  ;定义74LS164串行移位数据端
  5. SCLK BIT P1.6  ;定义74LS164串行移位时钟端
  6. DIS EQU P1 ;定义字形口
  7. CWINTER EQU P0.7 ;冬季灯输出
  8. CSUMMER              EQU P0.6 ;夏季灯输出
  9. SW1 EQU P3.2    ;控制切换季节
  10. SW2 EQU P3.3              ;控制调时
  11. SW3 EQU P3.4              ;控制调分
  12. SW4 EQU P3.1
  13. SW5 EQU P3.5
  14. MS EQU 10H ;定义50ms计数器
  15. Secs  EQU 11H ;定义秒计数器
  16. Minute EQU 12H ;定义分钟计数器
  17. Hour  EQU 13H ;定义时计数器
  18. ;---------------------------------
  19. ORG 0000H
  20. LJMP  Main                              ;长转移指令
  21. ;---------------------------------------------------------------------
  22. ORG 000BH
  23. LJMP  T0INT                           
  24. ;---------------------------------------------------------------------
  25. Main: MOV SP, #70H ;将栈区设置在70H,7FH
  26. MOV IE, #10000010B  ;允许T0中断
  27. MOV TMOD, #01H ;T0定时方式1
  28. MOV MS, #20  ;50ms单元初值?使20×50ms=1s
  29. MOV Secs, #0
  30. MOV Minute, #0
  31. MOV Hour, #0 ;开机显示00:00:00
  32. CLR F0
  33. CLR F1
  34. MOV R7, #80
  35. MOV TL0, #00H ; 50ms定时参数
  36. MOV TH0, #4CH  ;此参数小于实际参数,为仿真调试所调整获得
  37. SETB  TR0 ;启动定时器
  38. MOV B, #62H
  39. LOOP: MOV R1, #Secs
  40. LCALL Split ;调用拆分子程序NOP                实际就是分钟小时数据输入
  41. LCALL DISP  ;调用显示子程序NOP                实际就是分钟小时数据显示
  42. LCALL STORE  ;存储的数据
  43. LCALL Verify              ;读,校时
  44. NOP
  45. LCALL MANUAL  ;手动定时
  46. NOP
  47. LCALL Clear   ;清除手动定时
  48. NOP
  49. MOV A, Secs
  50. CJNE   A, #5, $+3 ;定时精度控制在5秒以内
  51. JNC LOOP
  52. LCALL Compare                            ;比较,响铃亮灯
  53. SJMP  LOOP
  54. ;----------------------------------------------------------------------------------------
  55. T0INT: MOV TL0, #00H
  56. MOV TH0, #4CH
  57. PUSH  ACC
  58. DJNZ  MS, T0Exit
  59. MOV MS, #20
  60. MOV A, Secs
  61. ADD A,#1
  62. DA A
  63. MOV Secs, A
  64. CJNE  A, #60H, $+3  ;
  65. JC T0Exit ;若秒小于60,则直接返回
  66. MOV Secs, #0 ;若秒大于或等于60,则回零
  67. MOV A, Minute
  68. ADD A, #1
  69. DA A ;对分进行十进制调整,以便送显示器显示
  70. MOV Minute, A
  71. CJNE  A, #60H, $+3 ;60后一定要加H?表示该数为BCD码
  72. JC T0Exit ;若分小于60,则直接返回
  73. MOV Minute, #0 ;若分大于或等于60,则回零
  74. MOV A, Hour
  75. ADD A, #1
  76. DA A
  77. MOV Hour, A
  78. CJNE  A, #24H, $+3
  79. JC T0Exit
  80. MOV Hour, #0
  81. T0Exit:  POP ACC
  82. RETI
  83. ;---------------------------------------------------------------------

  84. Compare: MOV R0, #20H ;定位数据存储区,见下方store
  85. NextTime: LCALL DISP
  86. MOV A, @R0
  87. CJNE  A, Hour, CLP1
  88. INC R0
  89. MOV A, @R0
  90. CJNE  A, Minute, CLP2
  91. INC R0
  92. SWITCH:JB SW1,SWITCH1  ;判断按键1,如果闭合,顺序执行;断开,跳转
  93. CPL CWINTER
  94. JNB SW1,SWITCH2
  95. SWITCH1:CPL CSUMMER
  96. SWITCH2:lcall SONGER
  97. INC R0
  98. RET
  99. ;---------------------------------------------------------------------
  100. CLP1: INC R0 ;指向分
  101. INC R0                            ;              指向秒
  102. INC R0
  103. MOV A, @R0
  104. JNZ CLP3              ;A=0,顺序执行;A不等于0,跳转
  105. INC R0                   ;指向下个报警计时点的分钟位
  106. MOV A, @R0
  107. JNZ CLP3              ;当分钟也为0时才终止程序
  108. RET
  109. ;---------------------------------------------------------------------
  110. CLP2:INC R0
  111. INC R0
  112. MOV A, @R0
  113. JNZ CLP3              ;A=0,顺序执行;A不等于0,跳转
  114. INC R0                   ;指向下个报警计时点的分钟位
  115. MOV A, @R0
  116. JNZ CLP3      ;当分钟也为0时才终止程序   
  117. RET
  118. ;---------------------------------------------------------------------
  119. CLP3: CJNE R0, #69H, $+3 ;因为时间数据存在6AH~6FH,所以不能大于69H
  120. JC NextTime
  121. RET
  122. ;---------------------------------------------------------------------
  123. SONGER:                                                                                    ;声音报警 ,控制时间结束后停止
  124. PUSH PSW                                                           
  125. PUSH ACC
  126. PUSH 05H
  127. PUSH 06H
  128. SONGER1:
  129. MOV R1,#Secs
  130. LCALL Split
  131. LCALL DISP
  132. CPL OUT
  133. DJNZ R6,SONGER1
  134. MOV R6,#7
  135. DJNZ R5,SONGER1                            ;跳转过一次后
  136. MOV R5,#10
  137. LCALL DISP
  138. MOV A,#Secs
  139. CJNE A,#5,$+3
  140. JC SONGER1                               ;A=0,跳转;A不等于0,顺序执行
  141. MOV P0,#0FFH
  142. POP 06H
  143. POP 05H
  144. POP ACC
  145. POP PSW
  146. RET

  147. Verify:  JB SW3, VLP3 ;判断是否需要校"分"
  148. CLR EA
  149. CLR TR0 ;校时期间,暂时关闭定时器
  150. VLP1: MOV A, Minute ;SW3闭合时,则对分钟加1
  151. ADD A, #1
  152. DA A
  153. MOV Minute, A
  154. CJNE  A, #60H, VLP2                 ;比较,不等于跳转,大于CY=0;小于CY=1
  155. MOV Minute, #0
  156. VLP2: MOV R6, #150
  157. MOV R1, #Secs
  158. LCALL Split
  159. LCALL DISP
  160. DJNZ  R6, $-3                            ;一定程度上保护按键的稳定性
  161. JNB SW3, VLP1 ;若SW3未释放,则继续对分钟加1
  162. MOV Secs, #0 ;校时期间,将秒清零
  163. SETB  EA
  164. SETB  TR0 ;恢复计数
  165. RET
  166. ;---------------------------------------------------------------------

  167. VLP3: JB SW2, VExit ;判断是否需要校"时"
  168. CLR EA
  169. CLR TR0 ;校时期间,暂时关闭定时器
  170. VLP4: MOV A, Hour  ;SW2闭合时,则对小时加1
  171. ADD A, #1
  172. DA A
  173. MOV Hour, A
  174. CJNE  A, #24H, VLP5
  175. MOV Hour, #0
  176. VLP5: MOV R6, #150
  177. MOV R1, #Secs
  178. LCALL Split
  179. LCALL DISP
  180. DJNZ  R6, $-3
  181. JNB SW2, VLP4 ;若SW2未释放,则继续对小时加1
  182. MOV Secs, #0 ;校时期间,将秒清零
  183. SETB  EA
  184. SETB  TR0 ;恢复计数
  185. VExit: RET
  186. ;---------------------------------------------------------------------
  187. STORE:
  188. MOV R1, #20H                ;存储报警时间(分为冬夏两种)
  189. MOV @R1, #06H
  190. INC R1
  191. MOV @R1, #00H
  192. INC R1
  193. INC R1
  194. MOV @R1, #07H
  195. INC R1
  196. MOV @R1, #50H
  197. INC R1
  198. INC R1
  199. MOV @R1, #08H
  200. INC R1
  201. MOV @R1, #00H
  202. INC R1
  203. INC R1
  204. MOV @R1, #08H
  205. INC R1
  206. MOV @R1, #50H
  207. INC R1
  208. INC R1
  209. MOV @R1, #09H
  210. INC R1
  211. MOV @R1, #00H
  212. INC R1
  213. INC R1
  214. MOV @R1, #09H
  215. INC R1
  216. MOV @R1, #50H
  217. INC R1
  218. INC R1
  219. MOV @R1, #10H
  220. INC R1
  221. MOV @R1, #10H
  222. INC R1
  223. INC R1
  224. MOV @R1, #11H
  225. INC R1
  226. MOV @R1, #00H
  227. INC R1
  228. INC R1
  229. MOV @R1, #11H
  230. INC R1
  231. MOV @R1, #10H
  232. INC R1
  233. INC R1
  234. MOV @R1, #12H
  235. INC R1
  236. MOV @R1, #00H
  237. INC R1
  238. INC R1
  239. ;--------------------------------------------------------
  240. PANDUAN:JNB SW1,PANDUAN1
  241. MOV @R1, #14H
  242. INC R1
  243. MOV @R1, #20H
  244. INC R1
  245. INC R1
  246. MOV @R1, #14H
  247. INC R1
  248. MOV @R1, #30H
  249. INC R1
  250. INC R1
  251. MOV @R1, #15H
  252. INC R1
  253. MOV @R1, #20H
  254. INC R1
  255. INC R1
  256. MOV @R1, #15H
  257. INC R1
  258. MOV @R1, #30H
  259. INC R1
  260. INC R1
  261. MOV @R1, #16H
  262. INC R1
  263. MOV @R1, #20H
  264. INC R1
  265. INC R1
  266. MOV @R1, #16H
  267. INC R1
  268. MOV @R1, #30H
  269. INC R1
  270. INC R1
  271. MOV @R1, #17H
  272. INC R1
  273. MOV @R1, #20H
  274. INC R1
  275. INC R1
  276. MOV @R1, #17H
  277. INC R1
  278. MOV @R1, #30H
  279. INC R1
  280. INC R1
  281. MOV @R1, #18H
  282. INC R1
  283. MOV @R1, #20H
  284. INC R1
  285. INC R1
  286. MOV @R1, #19H
  287. INC R1
  288. MOV @R1, #30H
  289. INC R1
  290. INC R1
  291. MOV @R1, #21H
  292. INC R1
  293. MOV @R1, #30H
  294. INC R1
  295. INC R1
  296. MOV @R1, #23H
  297. INC R1
  298. MOV @R1, #30H
  299. INC R1
  300. INC R1
  301. JB SW1,PANDUAN2
  302. ;--------------------------------------------------------
  303. PANDUAN1:MOV @R1, #13H
  304. INC R1
  305. MOV @R1, #50H
  306. INC R1
  307. INC R1
  308. MOV @R1, #14H
  309. INC R1
  310. MOV @R1, #00H
  311. INC R1
  312. INC R1
  313. MOV @R1, #14H
  314. INC R1
  315. MOV @R1, #50H
  316. INC R1
  317. INC R1
  318. MOV @R1, #15H
  319. INC R1
  320. MOV @R1, #00H
  321. INC R1
  322. INC R1
  323. MOV @R1, #15H
  324. INC R1
  325. MOV @R1, #50H
  326. INC R1
  327. INC R1
  328. MOV @R1, #16H
  329. INC R1
  330. MOV @R1, #00H
  331. INC R1
  332. INC R1
  333. MOV @R1, #16H
  334. INC R1
  335. MOV @R1, #50H
  336. INC R1
  337. INC R1
  338. MOV @R1, #17H
  339. INC R1
  340. MOV @R1, #00H
  341. INC R1
  342. INC R1
  343. MOV @R1, #17H
  344. INC R1
  345. MOV @R1, #50H
  346. INC R1
  347. INC R1
  348. MOV @R1, #19H
  349. INC R1
  350. MOV @R1, #30H
  351. INC R1
  352. INC R1
  353. MOV @R1, #21H
  354. INC R1
  355. MOV @R1, #30H
  356. INC R1
  357. INC R1
  358. MOV @R1, #23H
  359. INC R1
  360. MOV @R1, #00H
  361. INC R1
  362. INC R1
  363. PANDUAN2:
  364. RET
  365. ;---------------------------------------------------------------------
  366. ;手动定时,定时值为当前时间
  367. MANUAL:JB SW4,ZZ
  368. MOV R1, B               
  369. CJNE  R1, #69H, $+3                           
  370. JC ZY
  371. MOV R1, #62H
  372. MOV B, R1
  373. ZY: MOV @R1,Hour
  374. INC R1
  375. MOV @R1, Minute
  376. INC R1
  377. MOV @R1, Secs
  378. INC R1
  379. MOV B, R1
  380. ZZ:RET
  381. ;---------------------------------------------------------------------
  382. ;清除手动定时数据
  383. Clear:JB SW5,XX
  384. MOV  R1, #62H
  385. CLRP1: CLR A
  386. MOV @R1, A
  387. INC R1
  388. CJNE  R1, #6AH, CLRP1
  389. XX:RET
  390. ;---------------------------------------------------------------------
  391. ;拆分子程序
  392. Split: MOV R0, #6AH ;秒个位显示缓冲单元
  393. MOV A, @R1                                             ;A=((R1))
  394. ANL A, #0FH  ;取秒个位              ‘与’指令,去相交值
  395. MOV @R0, A                               ;(R0)=(A)
  396. INC R0 ;指向秒十位显示缓冲单元              R0+1
  397. MOV A, @R1
  398. SWAP  A                 ;将A的高低字节交换
  399. ANL A, #0FH  ;取秒十位
  400. MOV @R0, A
  401. INC R0 ;指向分个位显示缓冲单元
  402. INC R1                            ;R1加1后为12H,指向分按键
  403. MOV A, @R1
  404. ANL A, #0FH  ;取分个位
  405. MOV @R0, A
  406. INC R0 ;指向分十位显示缓冲单元
  407. MOV A, @R1
  408. SWAP  A
  409. ANL A, #0FH  ;取分十位
  410. MOV @R0, A
  411. INC R0 ;指向时个位显示缓冲单元
  412. INC R1                            ;R1加1后为13H,指向时按键
  413. MOV A, @R1
  414. ANL A, #0FH  ;取时个位
  415. MOV @R0, A
  416. INC R0 ;指向时十位显示缓冲单元
  417. MOV A, @R1
  418. SWAP  A
  419. ANL A, #0FH  ;取时十位
  420. MOV @R0, A
  421. RET                                                                                    ;R0从6AH到6FH,依次存秒、分钟,小时数据。
  422. ;---------------------------------------------------------------------
  423. DISP: PUSH  00H                            ;堆栈操作,将栈顶指针SP的内容加1,然后将直接寻址单元中的数据传到sp所指单元;即将00H中的内容放入71H单元中 sp=(sp+1),(SP)=(direct)
  424. MOV R0, #6AH ;显示缓冲区首地址
  425. MOV R2, #11111110B  ;对应个位的字位码
  426. MOV DPTR, #WordTab  ;将TAB表首地址赋给指针
  427. JNB F0, DISP0                ;(F0)=0,(PC)=(PC)+3,跳转;否则,还要加3,顺序执行

  428. DJNZ  R7, DISP1                              ;减1不为0,转移;否则,顺序执行
  429. CPL F1
  430. MOV R7, #60                                          ;这四行主要为了确保关显示器操作,没什么用
  431. SJMP  DISP1              ;短转移

  432. DISP0: CLR F1
  433. DISP1: ORL DIS, #00111111B ;关显示器 ORL并操作
  434. MOV R3, #20
  435. DJNZ  R3, $ ;延时40μ s,意思为R3不为0时反复执行该指令,$为当下执行指令的地址
  436. MOV A, @R0 ;取待显示数字
  437. MOVC  A, @A+DPTR ;查字形
  438. WordOut: MOV R3, #8 ;传送字形码到74LS164
  439. NEXTB: RLC A ;取待发送,进位循环左移
  440. MOV SDATA, C ;送数据到数据口,C就是CY
  441. SETB SCLK  ;产生时钟设置为1
  442. CLR SCLK
  443. DJNZ R3, NEXTB ;继续送下一位
  444. INC R0
  445. JB F1, HIDE                            ;为1跳转
  446. MOV A, R2 ;取字位码
  447. ANL DIS, A
  448. HIDE: MOV R3, #5 ;延时1ms
  449. MOV R4, #100
  450. DJNZ  R4, $
  451. DJNZ  R3, $-4
  452. MOV A, R2 ;修改字位码
  453. RL A                              ;左移
  454. MOV R2, A
  455. JB ACC.6, DISP1  ;循环次,依次显示秒、分钟、小时
  456. DExit: POP 00H
  457. RET
  458. ;-------------------------------------------------------------------
  459. WordTab: DB 3FH, 06H, 5BH, 4FH  ;"0","1","2","3"   共阴极
  460. DB 66H, 6DH, 7DH, 07H  ;"4","5","6","7"
  461. DB 7FH, 6FH, 77H, 7CH ;"8","9","A","B"
  462. DB 39H, 5EH, 79H, 71H ;"C","D","E","F"
  463. DB 40H, 38H ;"-", "L"
  464. ;-------------------------------------------------------------------
  465. END
复制代码

以上的Word格式文档51黑下载地址:
文档.doc (667.36 KB, 下载次数: 11)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:865960 发表于 2020-12-23 00:18 | 只看该作者
有电路图和程序嘛
回复

使用道具 举报

板凳
ID:328014 发表于 2020-12-23 00:23 | 只看该作者
bj000315 发表于 2020-12-23 00:18
有电路图和程序嘛

电路图和程序都在网页上,需要自己画,可惜楼主没有提供工程文件
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表