电子时钟汇编程序

合集下载

数字钟汇编程序

数字钟汇编程序
CLR IE1
MOV NUM,#8
RETI
/*********************设置闹钟**********************/
SET_ALARM:
MOV A,ALARM_X
CJNE A,#1,SET_ALARM_BACK
SET_ALARM1:
ORG 0013H
LJMP SERVE_ALARM
ORG 0020H
MAIN:
MOV TMOD,#11H
MOV NUM_D1,#20
MOV SEC,#59 ;时间初始化
MOV MIN,#59
MOV HOU,#12
MOV NUM,#0
MOV NUM_KEY,#0
MOV ALARM_2_SEC,#00 ;闹钟2
MOV ALARM_2_MIN,#58
MOV ALARM_2_HOU,#12
MOV ALARM_3_SEC,#00 ;闹钟3
MOV ALARM_3_MIN,#05
MOV ALARM_3_HOU,#13
MOV ALARM_4_SEC,#00 ;闹钟4
CPL P1.0
RETURN4:
RETI
/******************外部中断0重置秒分时位置选择************/
ORG 0200H
SERVE_PLACE:
MOV MODE,#0 ;标记为外部中断0
LCALL DELAY
LCALL DELAY
MOV SECX,40H
MOV MINX,41H
MOV HOUX,42H
LCALL CHECK_KEY14

电子闹钟汇编程序

电子闹钟汇编程序
shuchu:mov r7,#8 ;输出子程序
lop3:rrc a
clr p3.4
mov p3.5,c
setb p3.4
djnz r7,lop3
ret
dis:mov dptr,#tab
movc a,@a+dptr
lcall displaymin
mov 61h,#0
lcall displaymin
setkey:setb p1.7
jb p1.2,shizhong
lcall keydelay1
jb p1.2,shizhong
jnb p1.2,$
setb p2.2 ;设置小时灯亮
nhourset: jb p1.1,nlop2
lcall keydelay1
jb p1.1,nlop2
jnb p1.1,$
mov r0,#0
shizhong:setb tr0
clr p2.0
clr p2.1
clr p2.2
;lcall displaymin
;闹铃设置模块
naolingset:
jb p2.6,naoling ;闹铃设置开关按下,进行闹铃时间设置
nlop1: jb p2.6,nminset ;再次按下闹铃设置开关时进行闹铃小时设置
lcall keydelay1
jb p2.6,nminset
jnb p2.6,$
clr p2.1 ;设置分钟灯灭
org 0000h
jmp main
org 000bh
jmp ts
org 0030h
main:mov 70h,#2

单片机汇编语言电子时钟设计

单片机汇编语言电子时钟设计

单片机汇编语言电子时钟设计随着科技的快速发展,单片机技术已经成为了现代电子工程中不可或缺的一部分。

使用单片机设计电子时钟,可以通过编程语言对单片机进行控制,从而实现精确的时间显示和时间控制。

本文将介绍一种基于单片机汇编语言的电子时钟设计方案。

一、设计原理电子时钟是一种以数字形式显示时间的装置,它通常由单片机、显示模块、电源模块等组成。

其中,单片机作为核心控制单元,负责处理各种信号和指令,并控制显示模块显示时间。

在这个系统中,单片机的任务包括读取时钟芯片的时间数据、处理按键输入、控制显示模块等。

二、硬件设计1、单片机选择在单片机选择方面,我们选用AT89S52型号的单片机。

该单片机具有低功耗、高性能的特点,内部含有8K字节的Flash存储器和256字节的RAM,同时具有丰富的外设接口,如UART、SPI、I2C等。

2、时钟芯片选择时钟芯片选用DS1302型号,该芯片具有精度高、稳定性好的优点,可以提供年、月、日、时、分、秒等时间信息。

DS1302芯片通过SPI 接口与单片机进行通信。

3、显示模块选择显示模块选用LCD1602型号,该模块具有体积小、功耗低、显示内容丰富的优点,可以同时显示时间、日期和星期几等信息。

LCD1602模块通过并行接口与单片机进行通信。

4、按键模块选择按键模块选用四个独立按键,分别实现小时加、小时减、分钟加、分钟减功能。

按键通过单片机的外部中断引脚与单片机进行通信。

三、软件设计1、程序流程程序流程主要包括以下几个部分:系统初始化、读取DS1302芯片的时间数据、处理按键输入、控制LCD1602模块显示时间等。

具体流程如图1所示。

图1程序流程图2、关键代码实现在程序的关键部分,我们需要实现读取DS1302芯片的时间数据、处理按键输入、控制LCD1602模块显示时间等功能。

下面是一些关键代码的实现:(1)读取DS1302芯片的时间数据:MOV DPTR, #0x68 ; DPTR指向DS1302的空间MOV R7, #0x00 ;设置寄存器R7为0x00,用于读取时间数据MOV A, R7 ;将R7的值存入A寄存器MOVC A, @A+DPTR ;从DS1302中读取一个字节的数据,存入A寄存器中MOV B, A ;将A寄存器的值存入B寄存器,准备送入LCD1602模块中显示本文…(省略其他代码)…… ;处理其他数据和指令SJMP $ ;无限循环,等待下一次中断或指令执行完毕后再次回到此处执行下一轮循环。

电子时钟工具的程序设计及代码示例

电子时钟工具的程序设计及代码示例

电子时钟工具的程序设计及代码示例为满足现代生活的需求,电子时钟成为人们生活中的常见工具。

除了具备实时显示时间的功能外,电子时钟还可以根据用户需求进行各种定制,如显示日期、倒计时、闹钟等功能。

本文将探讨电子时钟的程序设计方法,并提供一个简单的代码示例。

一、程序设计方法在进行电子时钟的程序设计前,我们需要确定以下几个关键因素:1. 使用的编程语言:根据实际情况选择合适的编程语言,如C++、Java、Python等。

2. GUI框架:确定使用什么图形界面框架,如Qt、Tkinter等。

3. 实时更新:确定时间的实时更新方式,可以利用计时器、循环等方式进行时间更新。

4. 用户交互:考虑用户是否需要与电子时钟进行交互,如设置闹钟、选择日期等。

二、代码示例以下是一个基于Python和Tkinter的电子时钟代码示例,代码注释中详细说明了每个函数的功能和实现方法:```pythonimport tkinter as tkfrom datetime import datetimedef update_time():# 获取当前时间current_time = datetime.now().strftime("%H:%M:%S")# 更新时间标签time_label.config(text=current_time)# 每隔1秒更新一次时间time_label.after(1000, update_time)# 创建窗口window = ()window.title("电子时钟")# 创建时间标签time_label = bel(window, font=("Arial", 100), bg="white") time_label.pack(pady=50)# 更新时间update_time()# 运行窗口主循环window.mainloop()```以上代码创建了一个简单的窗口,使用标签实时显示当前时间。

单片机汇编程序电子闹钟

单片机汇编程序电子闹钟

电子闹钟课程设计摘要:本课程设计主要就是通过单片机系统,综合运用定时器、中断、数码显示等知识设计一个可定时的电子钟。

它包括系统总体方案及硬件设计,软件设计,Proteus软件仿真等部分。

硬件设计的主要任务就是根据总体设计要求,以及在所选机型的基础上,确定系统扩展所要用的存储器,I/O电路及有关外围电路等然后设计出系统的电路原理图。

合理的软件结构就是设计出一个性能优良的单片机应用性系统软件的基础,因此必须充分重视。

编写完程序后在用Proteus软件仿真检查设计就是否合理。

一.课程设计的概况通过对51单片机的扩展,接键盘,显示器等相应的外围器件。

在LED显示器中分成静态显示与动态显示两类,在本设计中主要用了它的动态显示功能,动态显示利用了人视觉的短暂停留,在数据的传输中就是一个一个传输的,且先传输低位。

键盘就是由若干个按键组成的开关矩阵,就是一种廉价的输入设备。

键盘通常包括有数字键,字母键以及一些功能键。

操作人员可以通过对键盘向计算机输入数据,地址,指令或其她的控制命令,实现简单的人机对话。

这里采用非编码式键盘。

通过51单片机的P1口扩展出独立连接式键盘。

外围扩展复位,时钟电路,利用软件源程序代码实现相应的功能。

二.课程设计实现的功能:1.能显示时时-分分-秒秒。

2、能够设定定时时间,修改定时时间。

3、定时时间到能发出警报声或者启动继电器,从而控制电器的起停。

三.设计方案使用就是单片机作为核心的控制元件,使得电路的可靠性比较高,功能也比较强大, 而且可以随时的更新系统,进行不同状态的组合。

本系统采用单片机AT89C51作为本设计的核心元件,利用7段共阴LED作为显示器件。

接入共阴LED显示器,可显示时,分钟,秒,单片机外围接有定时报警系统,定时时间到,扬声器发出报警声,提示预先设定时间电器的起停时间到,从而控制电器的起停。

电路由下列部分组成:时钟电路、复位电路、控制电路、LED显示,报警电路,芯片选用AT89C51 单片机。

单片机电子时钟报告及汇编代码

单片机电子时钟报告及汇编代码

单片机电子日历时钟设计一、设计的目的及其意义(1)巩固、加深和扩大51系列单片机应用的知识面,提高综合及灵活运用所学知识解决工业控制的能力;(2)培养针对课题需要,选择和查阅有关手册、图表及文献资料的自学能力,提高组成系统、编程、调试的动手能力;(3)对课题设计方案的分析、选择、比较、熟悉用51单片机做系统开发、研制的过程,软硬件设计的方法、内容及步骤。

二、本实验设计的功能2.1 基本功能1)显示北京时间2)校准时间;3)使用汇编语言4)时、分、秒之间或年、月、日间以小数点分隔;2.2 扩展功能(1)显示公历日期(2)校准日期(3)运动秒表(4)闹钟功能三、总体设计方案本实验使用汇编语言设计,程序的流程图大致如下:主程序流程图:显示闹钟子程序流程图:运动秒表子程序流程图:校准闹钟,日期和时间的子程序流程图:四、源程序ORG 0000HAJMP BEGINORG 000BHLJMP TINTOYEARH EQU 30H ;年高位存放地址YEARL EQU 31H ;年低位存放地址MONTH EQU 32H ;月存放地址DAY EQU 33H ;日存放地址HOUR EQU 34H ;时存放地址MIN EQU 35H ;分存放地址SEC EQU 36H ;秒存放地址MSEC EQU 37H ;10ms存放地址SECM EQU 38HYDMSEC EQU 39H ;运动秒针存放地址YDSECM EQU 40HBEEP BIT P1^3 ;蜂鸣器AHOUR EQU 41H ;闹钟时存放地址AMIN EQU 42H ;闹钟分存放地址DEDA EQU 43H ;5ms计数值PFOUR BIT P0.4PFIVE BIT P0.5PSIX BIT P0.6PSEVEN BIT P0.7BEGIN:CALL INITIALLOOP:CALL SHOW_TIME1 ;默认为显示时间CALL RINGCALL SCAN_KEY ;键盘扫描CJNE A,#0EEH,JUDGE1 ;如果A=EEH,则显示日期年和月CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2JUDGE1:CJNE A,#0DEH,JUDGE2 ;如果A=DEH,则显示闹钟SA:CALL SHOW_ALARMCALL SCAN_KEYCJNE A,#0EEH,SA ;在显示闹钟时按下EEH键则是返回时间模式JUDGE2:CJNE A,#0EDH,JUDGE3 ;如果A=EDH,则依次调闹钟,日期和时间CALL ADJUSTJUDGE3:CJNE A,#0DDH,JUDGE4 ;如果A=DDH,则显示时间分,秒ST2:CALL SHOW_TIME2CALL SCAN_KEYCJNE A,#0EDH,OTHER ;在显示分,秒时按下EDH 键则是运动秒表模式CLRYD:MOV MSEC,#0MOV SECM,#0AJMP ST3OTHER:CJNE A,#0EEH,ST2 ;按下EEH键则是返回时间模式AJMP JUDGE4ST3: ;运动秒表计时开始MOV YDMSEC,MSECMOV YDSECM,SECMCALL SHOW_TIME3CALL SCAN_KEYCJNE A,#0DEH,ST3 ;按下DEH键则是停止秒表STOP:CALL SHOW_TIME3CALL SCAN_KEYCJNE A,#0DDH,OW ;按下DDH键,运动秒表则从零从新开始计时AJMP CLRYDOW: CJNE A,#0EDH,OTHERWISE ;按下EDH键则继续运动秒表的计时,仍按DEH停止秒表MOV MSEC,YDMSECMOV SECM,YDSECMAJMP ST3OTHERWISE:CJNE A,#0EEH,STOP ;按下EEH键返回时间模式JUDGE4:AJMP LOOPRING: ;若闹钟时钟为24,则闹钟为关闭状态MOV A,HOURCJNE A,AHOUR,RTMOV A,MINCJNE A,AMIN,RTCLR BEEPRT:RETSHOW_TIME1: ;显示时间(时和分)MOV DPTR,#TABLE ;数字编码表基址MOV A,MIN ;显示分,minMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#04H ;点亮第三个数码管CALL SHOW ;显示数值CALL DELAYMOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#08H ;点亮第四个数码管CALL SHOWCALL DELAYMOV A,HOUR ;显示小时,hourMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#01H ;点亮第一个数码管CALL SHOWCALL DELAYMOV DPTR,#TABLE2MOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#02H ;点亮第二个数码管CALL SHOWCALL DELAYMOV P0,#00HRETSHOW_TIME2: ;显示时间(分和秒)MOV DPTR,#TABLE ;数字编码表基址MOV A,SEC ;显示秒,secMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#04H ;点亮第三个数码管CALL SHOWCALL DELAYMOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#08H ;点亮第四个数码管CALL SHOWCALL DELAYMOV A,MIN ;显示分钟minMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#01H ;点亮第一个数码管CALL SHOWCALL DELAYMOV DPTR,#TABLE2MOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#02H ;点亮第二个数码管CALL SHOWCALL DELAYMOV P0,#00H ;P0置零,熄灭数码管RETSHOW_TIME3: ;显示运动秒针(s和10ms) MOV DPTR,#TABLE ;数字编码表基址MOV A,YDMSEC ;显示10msMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#04H ;点亮第三个数码管CALL SHOWCALL DELAYMOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#08H ;点亮第四个数码管CALL SHOWCALL DELAYMOV A,YDSECM ;显示秒MOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#01H ;点亮第一个数码管CALL SHOWCALL DELAYMOV DPTR,#TABLE2MOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#02H ;点亮第二个数码管CALL SHOWCALL DELAYMOV P0,#00H ;P0置零,熄灭数码管RETSHOW_DATE1: ;显示日期(年)MOV DPTR,#TABLE ;数字编码表基址MOV A,YEARHMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#01HCALL SHOWCALL DELAYMOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#02HCALL SHOWCALL DELAYMOV A,YEARLMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#04HCALL SHOWCALL DELAYMOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#08HCALL SHOWCALL DELAYRETSHOW_DATE2: ;显示日期(月和日)MOV DPTR,#TABLE ;数字编码表基址MOV A,DAYMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#04H ;点亮第3个数码管CALL SHOWCALL DELAYMOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#08H ;点亮第4个数码管CALL SHOWCALL DELAYMOV A,MONTHMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#01H ;点亮第1个数码管CALL SHOWCALL DELAYMOV DPTR,#TABLE2MOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#02H ;点亮第2个数码管CALL SHOWCALL DELAYMOV P0,#00HRETADJUST: ;调整闹钟,日期和时间ALARM1: ;调整闹钟的小时数MOV DPTR,#TABLEMOV A,AHOURMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#01H ;点亮第一个数码管CALL SHOWCALL DELAYMOV DPTR,#TABLE2MOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#02H ;点亮第二个数码管CALL SHOWCALL DELAYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCJNE A,#0DEH,CHECK1 ;如果A=DEH,则闹钟小时加1MOV A,AHOURCJNE A,#24,INC1MOV AHOUR,#0CALL LDELAYAJMP ALARM1INC1:INC AMOV AHOUR,ACALL LDELAYAJMP ALARM1CHECK1:CJNE A,#0EEH,CHECK2 ;如果A=EEH,则闹钟小时减1MOV A,AHOURCJNE A,#0,DEC1MOV AHOUR,#24 ;当闹钟时钟调到24的时候,则相当于关闭闹钟CALL LDELAYAJMP ALARM1DEC1:DEC AMOV AHOUR,ACALL LDELAYAL1:AJMP ALARM1CHECK2:CJNE A,#0DDH,CHECK3 ;如果A=DDH,则返回RETCHECK3:CJNE A,#0EDH,AL1 ;如果A=EDH,则调整闹钟的分钟数ALARM2: ;调整闹钟的分钟数MOV DPTR,#TABLEMOV A,AMINMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#04H ;点亮第三个数码管CALL SHOW ;显示数值CALL DELAYMOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#08H ;点亮第四个数码管CALL SHOWCALL DELAYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCJNE A,#0DEH,CHECK4 ;如果A=DEH,则闹钟分钟加1 MOV A,AMINCJNE A,#59,INC2MOV AMIN,#0CALL LDELAYAJMP ALARM2INC2:INC AMOV AMIN,ACALL LDELAYAJMP ALARM2CHECK4:CJNE A,#0EEH,CHECK5 ;如果A=EEH,则闹钟小时减1 MOV A,AMINCJNE A,#0,DEC2MOV AMIN,#59CALL LDELAYAJMP ALARM2DEC2:DEC AMOV AMIN,ACALL LDELAYAL2:AJMP ALARM2CHECK5:CJNE A,#0DDH,CHECK6 ;如果A=DDH,则返回RETCHECK6:CJNE A,#0EDH,AL2 ;如果A=EDH,则调整日期(年)DA TE1: ;调整年的高位MOV DPTR,#TABLEMOV A,YEARHMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#01H ;点亮第一个数码管CALL SHOWCALL DELAYMOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#02H ;点亮第二个数码管CALL SHOWCALL DELAYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCJNE A,#0DEH,CHECKYH1 ;如果A=DEH,则日期年高位加1MOV A,YEARHCJNE A,#99,INCYRH1MOV YEARH,#0CALL LDELAYAJMP DA TE1INCYRH1:INC AMOV YEARH,ACALL LDELAYAJMP DA TE1CHECKYH1:CJNE A,#0EEH,CHECKYH2 ;如果A=EEH,则日期年高位减1MOV A,YEARHCJNE A,#0,DECYRH1MOV YEARH,#99CALL LDELAYAD1:AJMP DA TE1DECYRH1:DEC AMOV YEARH,ACALL LDELAYAJMP DA TE1CHECKYH2:CJNE A,#0DDH,CHECKYH3 ;如果A=DDH,则返回RETCHECKYH3:CJNE A,#0EDH,AD1 ;如果A=EDH,则调整日期年的低位DA TE2: ;调整年的低位MOV DPTR,#TABLEMOV A,YEARLMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#04H ;点亮第3个数码管CALL SHOWCALL DELAYMOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#08H ;点亮第4个数码管CALL SHOWCALL DELAYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCJNE A,#0DEH,CHECKYL1MOV A,YEARLCJNE A,#99,INCYRL1MOV YEARL,#0CALL LDELAYAJMP DA TE2INCYRL1: ;年低位加1INC AMOV YEARL,ACALL LDELAYAJMP DA TE2CHECKYL1:CJNE A,#0EEH,CHECKYL2MOV A,YEARLCJNE A,#0,DECYRL1MOV YEARL,#99CALL LDELAYAD2: AJMP DA TE2DECYRL1: ;年低位减1DEC AMOV YEARL,ACALL LDELAYAJMP DA TE2CHECKYL2:CJNE A,#0DDH,CHECKYL3 ;返回RETCHECKYL3:CJNE A,#0EDH,AD2 ;跳到调整月,日MON:MOV DPTR,#TABLEMOV A,MONTHMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#01H ;点亮第一个数码管CALL SHOWCALL DELAYMOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#02H ;点亮第二个数码管CALL SHOWCALL DELAYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCJNE A,#0DEH,CHECKM1 ;如果A=DEH,则月份加1MOV A,MONTHCJNE A,#12,INCM1MOV MONTH,#1CALL LDELAYAM: AJMP MONINCM1:INC AMOV MONTH,ACALL LDELAYAJMP MONCHECKM1:CJNE A,#0EEH,CHECKM2 ;如果A=EEH,则月份减1MOV A,MONTHCJNE A,#1,DECM1MOV MONTH,#12CALL LDELAYAJMP MONDECM1:DEC AMOV MONTH,ACALL LDELAYAJMP MONCHECKM2:CJNE A,#0DDH,CHECKM3 ;如果A=DDH,则返回RETCHECKM3:CJNE A,#0EDH,AM ;如果A=EDH,则调整日ADAY:MOV DPTR,#TABLEMOV A,DAYMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#04H ;点亮第3个数码管CALL SHOWCALL DELAYMOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#08H ;点亮第4个数码管CALL SHOWCALL DELAYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCJNE A,#0DEH,CH1 //如果A=DEH,判断月份MOV A,MONTHCJNE A,#1,N2AJMP T31N2:CJNE A,#2,N3AJMP T2N3:CJNE A,#3,N4AJMP T31N4:CJNE A,#4,N5AJMP T30N5:CJNE A,#5,N6AJMP T31N6:CJNE A,#6,N7AJMP T30N7:CJNE A,#7,N8AJMP T31N8:CJNE A,#8,N9AJMP T31N9:CJNE A,#9,N10AJMP T30N10:CJNE A,#10,N11AJMP T31N11:CJNE A,#11,T31AJMP T30CH1:AJMP CHECKD1T31: //该月份有31天MOV A,DAYCJNE A,#31,INCD1 //判断是否为31号MOV DAY,#0CALL LDELAYAJMP ADAYINCD1:INC AMOV DAY,ACALL LDELAYAJMP ADAYT30: //该月份有30天MOV A,DAYCJNE A,#30,INCDD1 //判断是否为30号MOV DAY,#0CALL LDELAYAJMP ADAYINCDD1:INC AMOV DAY,ACALL LDELAYAJMP ADAYT2: ;特殊的2月MOV B,#4MOV A,YEARLCJNE A,#0,NORMAL1AJMP CENTURY1NORMAL1:DIV ABMOV A,BCJNE A,#0,COMMON1BISSEXTILE1:MOV A,DAY ;闰年CJNE A,#29,INC2DAY ;未够29天MOV DAY,#1CALL DELAYAJMP ADAYINC2DAY:INC DAYCALL LDELAYAJMP ADAYCOMMON1:MOV A,DAY ;平年CJNE A,#28,INC2DAY2 ;未够28天MOV DAY,#1CALL DELAYAJMP ADAYINC2DAY2:INC DAYCALL LDELAYAJMP ADAYCENTURY1: ;世纪年MOV A,YEARHDIV ABMOV A,BCJNE A,#0,COMMON1AJMP BISSEXTILE1CHECKD1:CJNE A,#0EEH,CH2MOV A,MONTHCJNE A,#1,NN2AJMP U31NN2:CJNE A,#2,NN3AJMP U2NN3:CJNE A,#3,NN4AJMP U31NN4:CJNE A,#4,NN5AJMP U30NN5:CJNE A,#5,NN6AJMP U31NN6:CJNE A,#6,NN7AJMP U30NN7:CJNE A,#7,NN8AJMP U31NN8:CJNE A,#8,NN9AJMP U31NN9:CJNE A,#9,NN10AJMP U30NN10:CJNE A,#10,NN11AJMP U31NN11:CJNE A,#11,U31AJMP U30CH2:AJMP CHECKD2U31:MOV A,DAYCJNE A,#0,DECD1MOV DAY,#31CALL LDELAYAJMP ADAYDECD1:DEC AMOV DAY,ACALL LDELAYAJMP ADAYU30:MOV A,DAYCJNE A,#0,DECDD1MOV DAY,#30CALL LDELAYAJMP ADAYDECDD1:DEC AMOV DAY,ACALL LDELAYAJMP ADAYU2: ;特殊的2月MOV A,YEARLCJNE A,#0,NORMAL2AJMP CENTURY2NORMAL2:DIV ABMOV A,BCJNE A,#0,COMMON2BISSEXTILE2:MOV A,DAY ;闰年CJNE A,#1,DEC2DAY ;未够29天MOV DAY,#29CALL DELAYAJMP ADAYDEC2DAY:DEC DAYCALL LDELAYAJMP ADAYCOMMON2:MOV A,DAY ;平年CJNE A,#1,DEC2DAY2 ;未够28天MOV DAY,#28CALL DELAYAJMP ADAYDEC2DAY2:DEC DAYCALL LDELAYADA:AJMP ADAYCENTURY2: ;世纪年MOV A,YEARHDIV ABMOV A,BCJNE A,#0,COMMON2AJMP BISSEXTILE2CHECKD2:CJNE A,#0DDH,CHECKD3 ;如果A=DDH,则返回RETCHECKD3:CJNE A,#0EDH,ADA ;如果A=EDH,则调整时间;跳到调整月,日TIME1: ;调整时间的小时数MOV DPTR,#TABLEMOV A,HOURMOV B,#10MOVC A,@A+DPTRANL P0,#0F0HORL P0,#01H ;点亮第一个数码管CALL SHOWCALL DELAYMOV DPTR,#TABLE2MOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#02H ;点亮第二个数码管CALL SHOWCALL DELAYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCJNE A,#0DEH,CHECKT1 ;时间小时数加1 MOV A,HOURCJNE A,#23,INCT1MOV HOUR,#0CALL LDELAYAJMP TIME1INCT1:INC AMOV HOUR,ACALL LDELAYAJMP TIME1CHECKT1:CJNE A,#0EEH,CHECKT2MOV A,HOURCJNE A,#0,DECT1MOV HOUR,#23CALL LDELAYTI1:AJMP TIME1DECT1: ;时间小时数减1 DEC AMOV HOUR,ACALL LDELAYAJMP TIME1CHECKT2:CJNE A,#0DDH,CHECKT3RETCHECKT3:CJNE A,#0EDH,TI1 ;调整时间的分钟数TIME2:MOV DPTR,#TABLE ;数字编码表基址MOV A,MINMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#04H ;点亮第三个数码管CALL SHOW ;显示数值CALL DELAYMOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#08H ;点亮第四个数码管CALL SHOWCALL DELAYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCJNE A,#0DEH,CHECKT4MOV A,MINCJNE A,#59,INCT2MOV MIN,#0CALL LDELAYLJMP TIME2INCT2: ;时间分钟数加1 INC AMOV MIN,ACALL LDELAYLJMP TIME2CHECKT4:CJNE A,#0EEH,CHECKT5MOV A,MINCJNE A,#0,DECT2MOV MIN,#59CALL LDELAYLJMP TIME2DECT2: ;时间分钟数减1 DEC AMOV MIN,ACALL LDELAYTI2:LJMP TIME2CHECKT5:CJNE A,#0DDH,CHECKT6RETCHECKT6:CJNE A,#0EDH,TI2RETSHOW_ALARM: ;显示闹钟MOV DPTR,#TABLE ;数字编码表基址MOV A,AMINMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#04H ;点亮第三个数码管CALL SHOWCALL DELAYMOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#08H ;点亮第四个数码管CALL SHOWCALL DELAYMOV A,AHOURMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#01H ;点亮第一个数码管CALL SHOWCALL DELAYMOV DPTR,#TABLE2MOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#02H ;点亮第二个数码管CALL SHOWCALL DELAYMOV P0,#00HRETSCAN_KEY: ;P2低4位控制行,高4位控制列MOV P2,#0FH ;行扫描MOV A,P2CJNE A,#0FH,KEY1 ;A不等于#0F,表示当前有键按下KEY1:CALL DELAYMOV A,P2CJNE A,#0FH,SCAN1 ;延时排除按键抖动情况MOV A,#0FFHRETSCAN1:MOV A,P2 ;记录行状态SCAN2:MOV P2,#0F0H ;列扫描MOV R6,P2ORL A,R6 ;行列读取结果相或得出键值,由A存放键值:RETINITIAL:MOV YEARH,#20 ;初始化控制变量MOV YEARL,#13MOV MONTH,#09MOV DAY,#20MOV HOUR,#10MOV MIN,#30MOV SEC,#46MOV MSEC,#00MOV SECM,#00MOV DEDA,#00MOV AHOUR,#10MOV AMIN,#31;对涉及到的中断,进行设置SETB EA ;开总中断SETB ES ;使能串口中断SETB ET0 ;使能定时器0中断SETB TR0 ;启动定时0CLR ET1 ;关定时器1中断CLR EX0 ;关外部中断0CLR EX1 ;关外部中断1MOV SCON,#50H ;SM0/SM1=0/1,设置成串口1方式,10位通用异步接发, ;8位数据,可变波特率,接收允许MOV TMOD,#21H ;T1: M1/M0=1/0 波特率发生器T1工作在模式2,8位自动重装初值定时计数;T0: M1/M0=0/1 工作在模式1,作16位定时器MOV PCON,#80H ;SMOD置1,使得波特率翻倍为2400x2=4800BPSMOV TH1,#0F3H ;预置初值(按照波特率2400BPS预置初值)MOV TL1,#0F3H ;预置初值(按照波特率2400BPS预置初值)SETB TR1 ;启动定时器T1SETB BEEP ;关闭蜂鸣器MOV TH0,#0ECHMOV TL0,#78HMOV P0,#00HRETDELAY: ;延迟子程序,延时10msMOV 05H,#100DE0: MOV 06H,#100DE1: DJNZ 06H,DE1DJNZ 05H,DE0RETLDELAY: ;延迟子程序,延时500ms MOV 07H,#50LDE0: MOV 05H,#100LDE1: MOV 06H,#100LDE2: DJNZ 06H,LDE2DJNZ 05H,LDE1LDE3: DJNZ 07H,LDE0RET;在数码管上显示数字SHOW: ;数码管显示函数MOV R6,AMOV R7,#01HS1:ANL A,R7 ;取出A的一位JNZ S3S2:CLR PSEVENAJMP S4S3:SETB PSEVENS4:SETB PFOUR ;将数据寄存器PSEVEN值移进移位寄存器NOPCLR PFOURNOPMOV A,R7RL AMOV R7,AMOV A,R6CJNE R7,#01H,S1 ;判断A的8位是否全部取出CLR PFIVENOPSETB PFIVERETTINTO: ;定时器0计时中断程序每隔5ms中断一次INC DEDAMOV 55H,DEDA ;运动秒针,低位MSEC每10ms计数ANL 55H,#01HMOV R6,55HCJNE R6,#0,POPACMOV R6,MSECCJNE R6,#99,INCMMOV MSEC,#00MOV R6,SECMCJNE R6,#59,INCSMOV SECM,#00AJMP POPACINCM:INC MSECAJMP POPACINCS:INC SECMPOPAC:MOV A,DEDACJNE A,#200,AGAIN ;判断是否1S到了MOV DEDA,#0SECOND:INC SECMOV A,SECCJNE A,#60,AGAIN ;判断是否1min到了MINUTE:MOV SEC,#0INC MINMOV A,MINCJNE A,#60,AGAIN ;判断是否1h到了HOURS:MOV MIN,#0MOV A,HOURCJNE A,#24,AGAINMOV A,MONTH ;辨别大月和小月CJNE A,#1,MONTH2AJMP THIRTY_ONE_DAYSMONTH2:CJNE A,#2,MONTH3AJMP FEBRUARYMONTH3:CJNE A,#3,MONTH4AJMP THIRTY_ONE_DAYSMONTH4:CJNE A,#4,MONTH5AJMP THIRTY_DAYSMONTH5:AJMP THIRTY_ONE_DAYSMONTH6:CJNE A,#6,MONTH7AJMP THIRTY_DAYSMONTH7:CJNE A,#7,MONTH8AJMP THIRTY_ONE_DAYSMONTH8:CJNE A,#8,MONTH9AJMP THIRTY_ONE_DAYSMONTH9:CJNE A,#9,MONTH10MONTH10:CJNE A,#10,MONTH11AJMP THIRTY_ONE_DAYSMONTH11:CJNE A,#11,MONTH12AJMP THIRTY_DAYSMONTH12:AJMP THIRTY_ONE_DAYSAGAIN:MOV TL0,#078HSETB TR0 ;启动定时器RETITHIRTY_ONE_DAYS: ;大月31天MOV HOUR,#0 ;时归0MOV A,DAYCJNE A,#31,INCDAY ;未够31天AJMP MONTHSAJMP AGAINTHIRTY_DAYS: ;小月30天MOV HOUR,#0 ;时归0MOV A,DAYCJNE A,#30,INCDAY2 ;未够30天AJMP MONTHSAJMP AGAINFEBRUARY: ;特殊的2月MOV B,#4MOV A,YEARLCJNE A,#0,NORMALAJMP CENTURYNORMAL:DIV ABCJNE A,#0,COMMONBISSEXTILE: ;闰年MOV HOUR,#0 ;时归0MOV A,DAYCJNE A,#29,INCDAY ;未够29天AJMP MONTHSCOMMON: ;平年MOV HOUR,#0 ;时归0CJNE A,#28,INCDAY ;未够28天AJMP MONTHSCENTURY: ;世纪年MOV A,YEARHMOV A,BCJNE A,#0,COMMONAJMP BISSEXTILEMONTHS:MOV DAY,#01CJNE A,#12,INCMONTHAJMP INCYEARINCMONTH:INC MONTHAJMP AGAININCYEAR: ;判断数字是否超出显示管显示范围MOV MONTH,#01MOV A,YEARLCJNE A,#99,INCYLAJMP GO_ONINCYL:INC YEARLGO_ON:MOV YEARL,#0MOV A,YEARHCJNE A,#99,INCYHAJMP ZEROINCYH:INC YEARHLJMP AGAINZERO:MOV YEARH,#0LJMP AGAINTABLE:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H ;0 1 2 34 5 6 7 8 9 ,不带小数点TABLE2:DB 0FDH,61H,0DBH,0F3H,67H,0B7H,0BFH,0E1H,0FFH,0F7H ;带小数点END五、系统的使用和操作说明按下开关,如下图所示显示初始设定的时间10:30分。

汇编课设电子时钟

汇编课设电子时钟
SETT DB 40,?
S_H DB 0,0 ; Hour 小时
DB ':'
S_M DB 0,0 ; minutes 分钟
DB ':'
S_S DB 0,0 ; second 秒
display8 db '|-----------------------------------------------------|','$'
yy dw ?
str1 db 5 dup(0)
str2 db '-','-',' ',':',':'
DATAS ENDS
DB ':'
S DB '00' ; second 秒
DB '$'
COUNT1 DW 0 ;计数器
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BUF0 DB '! This is StopWatch ! ',13,10,'$'
BUF1 DB ' press <b> = back to menu . ',13,10,'$'
BUF2 DB ' press <s> = start.',13,10,'$'
ABUF2 DB 'press <b> = back.',13,10,'$'
ABUF3 DB ' $'

汇编语言实现电子闹钟思路详解

汇编语言实现电子闹钟思路详解

汇编语⾔实现电⼦闹钟思路详解2.1 设计思路⾸先使⽤8255、8254、8259 三个芯⽚实现电⼦时钟的功能,让闹钟可以正常⾛时;其次,在时钟的基础上添加闹铃功能、整点报时功能、设置当前时间功能;完成设计。

2.2 设计⽅案1. 电⼦时钟部分:此次设计是通过对计数器8254设定计数值对脉冲进⾏计数,在程序⾥,8254⼯作于计数器0,⽅式3。

接⼊的CLK为1MHz,设计数初值为10000,每100次中断计数⼀次,产⽣的记数时间正好是时钟每秒⾛过的时间。

通过对中断控制器8259设置初始化命令字初值来控制中断。

程序中通过移位指令来实现时、秒、分的个位和⼗位的独⾃存储,将分、秒的个位⼗位分别存⼊指定的寄存器中。

⽐较转移指令来完成秒和分的累加。

七段数码管由8255并⾏接⼝的A⼝进⾏位的选择,通过B⼝输出要显⽰的段码。

这样就在6个七段数码管上分别显⽰时、分和秒。

当1S时间到时,修改当前数码管数值,10秒时将秒的低位清零,⾼位加1,分和时亦是如此;到达60秒时,将秒清零,分加1,到达60分时,将分清零,⼩时加1,到达24⼩时则全部清零。

2. 闹钟响铃部分:对于闹钟部分,我们⾸先要完成数码管显⽰单元按键的连接和设计,让16个按键分别为0-F;再利⽤实验平台的单次脉冲输⼊KK1产⽣⼀次中断,这样就可以设置时间了。

将设置好的时间储存起来,时刻与当前的时间进⾏⽐较,当时间⼀样时,计数器1⼯作,蜂鸣器蜂鸣,播放⾳乐,这就完成了闹钟响铃功能。

3. 整点报时部分:整点报时,就是在整时的时候响⼀次铃,当时钟整点时,⽆论是⼏点,时钟的分和秒部分都为零,所以,只要让时钟的分和秒部分与零进⾏⽐较,当他们都相等时,就代表到达整点了,可以响铃了。

整点报时就完成了,本闹钟设置的整点报时时长为5秒。

4. 设置当前时间:本部分也⽤到了数码管显⽰单元的按键部分,只要利⽤之前的设计就好了,这次使⽤单次脉冲输⼊的KK2产⽣中断设置时间,再将设置的时间存储在时间变量中,时间就设置好了。

电子钟的程序(汇编)

电子钟的程序(汇编)

一下程序是利用C51单片机实现电子钟的实用汇编程序:ORG 0000HBEGIN: LJMP INITORG 0003H ;INT0RETIORG 000BH ;T0 INTT0: LJMP T0INTSRRETIORG 0013H ;1NT1RETIORG 001BH ;T1 INTRETIORG 0023H ;S PORT INTRETIORG 002BH ;T2 INTRETIORG 0100H;=====================================================;8032 RAM 00H--FFH CLEAR 0INIT: MOV B,#0FFHMOV R0,#00HMOV A, #00HCLE0FFH:INC R0MOV @R0,ADJNZ B,CLE0FFH;SET STACK AREA 70H--7FHMOV SP,#70H;TIMER INITMOV TMOD,#01HMOV TL0,#0B0H ;2 E+16 = 65536 = 15536 + 50000(0.05S)MOV TH0,#03CH ;3CB0H=15536;RAM INTIMOV 2FH,#3FH ;2FH IS FLASH TAGMOV 2EH,#00H ;2EH IS T0 INTERRUPT COUNTERMOV 2DH,#00H ;2DH IS THE SECOND COUNTERCLR P1.0CLR P1.1;ENABLE INTERRUPTSETB EASETB ET0;START UP T0SETB TR0;SYSTEM NORMAL ,IDENTIFIER "0.0"MOV PSW,#00H;==================================================================== ENTRK1: LCALL KEYSCAN;KEY SACN SUBRUTINLCALL TICHANG;DISPLAY CHARACTER CHANGELCALL DIFLASH;DISPLAY FLASHINGLCALL DISPLAY;DISPLAY SUBRUTINLCALL TIMECAL;TIME CALCULATESJMP ENTRK1;==================================================================== ; 1. KEYSCAN......KEY SCAN SUBRUTIN; 2. TICHANG......TIME DATA CHARACTER CHANGE; 3. DIFLASH......DISPLAY FLASHING; 4. DISPLAY......DISPLAY SUBRUTIN; 5. TIMECAL......TIME CALCULATE; 6. DELAY60......DELAY 60mS; 7. DCCHANG......DISPLAY CHARACTER CHANGE;--------------------------------------------------------------------;1. -----------------------------------------------------------------;KEYSCAN:; KEY SCAN SUBRUTIN;; 1. 8032 P1 PORT PIN DEFINITION;; P3.2== +1 KEY BIT; P3.3==TIMESET KEY;; 2. RAM BIT 00H --PRESS TIMESET KEY FLAG 1=PRESSED, 0=NOT; 02H --PRESS ADD 1 KEY PIN PONG FLAG; 03H --PRESS TIMESET KEY PIN PONG FLAG;;--------------------------------------------------------------------KEYSCAN:NOPPUSH PSWMOV PSW,#08HJB P3.2,KEYTIM0LCALL DELAY60 ;DELAY 60mSJB P3.2,KEYTIM0SETB 03HLJMP KEYSOUTKEYTIM0:JNB 03H,KEYJMP0JB P3.2,TIMSET0LCALL DELAY60 ;DELAY 60mSJB P3.2,TIMSET0LJMP KEYSOUTKEYJMP0:LJMP KEYSCA0TIMSET0:NOPCLR 03HJB 00H,TIMESOKSETB 00H ;TIMESET KEY IS PRESSEDCLR ET0MOV 2DH,#00MOV R0,#67HMOV R1,#6FHLJMP KEYSOUTTIMESOK:NOPDEC R0 ;TIMESET KEY IS PRESSEDDEC R1CJNE R0,#63H,TTTTT ;KEYSOUTCLR 00HSETB ET0TTTTT: LJMP KEYSOUTKEYSCA0:NOPJB P3.5,KEYP6HLCALL DELAY60 ;DELAY 60mSJB P3.5,KEYP6HSETB 02HLJMP KEYSOUTKEYP6H: JNB 02H,KEYJMPJB P3.5,ADD1PRSLCALL DELAY60 ;DELAY 60mSJB P3.5,ADD1PRSKEYJMP: LJMP KEYSOUTADD1PRS:CLR 02HJB 00H,ADD1INJNB 01H,EQ67H1ADD1IN: MOV A,@R0 ;+1 KEY IS PRESSED INC AMOV @R0,ACJNE R0,#67H,LESS67HCJNE A,#03H,EQ67H0EQ67H0: JC EQ67H1MOV @R0,#0EQ67H1: LJMP KEYSOUTLESS67H:CJNE R0,#66H,LESS66HCJNE A,#0AH,EQ66H0EQ66H0: JC EQ66H1MOV @R0,#0EQ66H1: LJMP KEYSOUTLESS66H:CJNE R0,#65H,LESS65HCJNE A,#06H,EQ65H0EQ65H0: JC EQ65H1MOV @R0,#0EQ65H1: LJMP KEYSOUTLESS65H:CJNE R0,#64H,KEYSOUTCJNE A,#0AH,EQ64H0EQ64H0: JC KEYSOUTMOV @R0,#0KEYSOUT:NOPPOP PSWRET;--------------------------------------------------------------------;2.------------------------------------------------------------------;TICHANG; TIME DATA CHARACTER CHANGE; 2. RAM BIT 00H --PRESS TIMESET KEY FLAG 1=PRESSED, 0=NOT ;;--------------------------------------------------------------------TICHANG:NOPMOV R7,#4MOV R0,#6FHMOV R1,#67HTCHANG0:MOV A,@R1LCALL DCCHANG ;DISPLAY CHARACTER CHANGECPL AMOV @R0,ADEC R0DEC R1DJNZ R7,TCHANG0TICHOUT:NOPRET;--------------------------------------------------------------------;3.------------------------------------------------------------------;DIFLASH; DISPLAY FLASHING CHANGE; 1. RAM BIT 00H --PRESS TIMESET KEY FLAG 1=PRESSED, 0=NOT ;; 2. RAM 2FH IS FLASH TAG;;;--------------------------------------------------------------------DIFLASH:NOPJB 00H,FLASHINAJMP FLASOUTFLASHIN:MOV A,2FHRL AMOV 2FH,AANL A,#03HCJNE A,#03H,FLASOUTPUSH PSWMOV PSW,#08HMOV @R1,#0FFHPOP PSWFLASOUT:RETNOP;--------------------------------------------------------------------;4.------------------------------------------------------------------;DISPLAY:; DISPLAY SUBRUTIN;; RAM:6FH CLOCK HORE 10 BIT; 6EH CLOCK HORE 1 BIT; 6DH CLOCK MIN 10 BIT; 6CH CLOCK MIN 1 BIT;;--------------------------------------------------------------------DISPLAY:NOPSETB P1.3MOV P0,6FHCLR P1.0LCALL DELAY60 ;DELAY 60MSLCALL DELAY60 ;DELAY 60MSSETB P1.0MOV P0,6EHCLR P1.1LCALL DELAY60 ;DELAY 60MSLCALL DELAY60 ;DELAY 60mSSETB P1.1MOV P0,6DHCLR P1.2LCALL DELAY60 ;DELAY 60MSLCALL DELAY60 ;DELAY 60MSSETB P1.2MOV P0,6CHCLR P1.3LCALL DELAY60 ;DELAY 60MSLCALL DELAY60 ;DELAY 60MSSETB P1.4SETB P1.7SETB P1.6SETB P1.5RET;--------------------------------------------------------------------;5.------------------------------------------------------------------; TIMECAL:; TIME CALCULATE;; 1. RAM BIT 00H --PRESS TIMESET KEY FLAG 1=PRESSED, 0=NOT ; 2. RAM 2EH T0 INTERRUPT COUNTER; 3. RAM 2DH IS THE SECOND COUNTER; 4. RAM:6FH CLOCK HORE 10 BIT; 6EH CLOCK HORE 1 BIT; 6DH CLOCK MIN 10 BIT; 6CH CLOCK MIN 1 BIT;--------------------------------------------------------------------TIMECAL:NOPJB 00H,TIMEOU1MOV A,2EH ;HOUR DISPLAY FLASHCJNE A,#10,TIMECA1 ;TIMECA1:JNC TIMECA2 ;MOV A,66H ;CJNE A,#18H,TIMECA5 ;TIMECA5:JNC TIMEOU1 ;ADD A,#18H ;CLR P1.0MOV 66H,A ;mov a,65hadd a,#18hmov 65h,aTIMEOU1:LJMP TIMEOUT ; TIMECA2:CJNE A,#20,TIMECA3 ;TIMECA3:JNC TIMECAJ ;MOV A,66H ;CJNE A,#18H,TIMECA6 ;TIMECA6:JC TIMEOU2 ;SUBB A,#18H ;SETB P1.0MOV 66H,A ;mov a,65hsubb a,#18hmov 65h,aTIMEOU2:LJMP TIMEOUT ;HOUR DISPLAY FLASHTIMECAJ:MOV 2EH,#00H ;SECONDE ADD 1MOV A,2DH ;CJNE A,#59,TIMECAF ;TIMECAF:JNC TIMECAG ;INC A ;MOV 2DH,A ;LJMP TIMEOUT ;SECONDE ADD 1TIMECAG:MOV 2DH,#00 ;MINIUT 0X ADD 1MOV A,64H ;INC A;JNB 06H,TIMEFASDEC ACLR 06HTIMEFAS:CJNE A,#10,TIMECA7 ;TIMECA7:JNC TIMECA8 ;MOV 64H,A ;LJMP TIMEOUT ;MINIUTE 0X ADD 1TIMECA8:MOV 64H,#0 ;MINIUTE XO ADD 1MOV A,65H ;INC A ;CJNE A,#6,TIMECA9 ;TIMECA9:JNC TIMECAA ;M OV 65H,A ;LJMP TIMEOUT ;MINIUTE X0 ADD 1TIMECAA:MOV 65H,#0 ;HOUR 0X ADD 1MOV A,66H ;INC A ;CJNE A,#10,TIMECAB ;TIMECAB:JC TIMECAH ;LJMP TIMECAC ;TIMECAH:MOV 66H,A ;HOUR 0X ADD 1MOV A,67H ;IF HOUR IS 24CJNE A,#2,TIMEN24 ;MOV A,66H ;CJNE A,#4,TIMECAI ;TIMECAI:JNC TIME24H ;IF HOUR IS 24TIMEN24:LJMP TIMEOUTTIME24H:MOV 64H,#00 ;MIN 0XMOV 65H,#00 ;MIN X0MOV 66H,#00 ;HOUR 0XMOV 67H,#00 ;HOUR X0MOV 44H,#04 ;FIRST PROGRAM 1997-11-17LJMP TIMEOUT ;NEW ONE DAYTIMECAC:MOV 66H,#0 ;HOUR X0 ADD 1MOV A,67H ;INC A ;CJNE A,#3,TIMECAD ;TIMECAD:JNC TIMECAE ;MOV 67H,A ;LJMP TIMEOUT ;HOUR X0 ADD 1TIMECAE:MOV 67H,#0TIMEOUT:NOPRET;--------------------------------------------------------------------;6.------------------------------------------------------------------;DELAY60:; DELAY 100mS FOR NEXT RANGING;--------------------------------------------------------------------DELAY60:PUSH PSWMOV PSW,#00HMOV R3,#6 ;#10 0.5ms * 10 = 5ms 1997-9-3 W60MS: MOV R4,#0FAH ;0FAH =250W500US1:DJNZ R4,W500US1 ;TIME = 2US 2 US * 250 = 0.5 MS DJNZ R3,W60MSPOP PSWRET;-------------------------------------------------------------------;7.------------------------------------------------------------------;DCCHANG:; DISPLAY CHARACTERS CHANGE ROUTINE; NOTE:; 1. ENTRY A-----LOAD SETOFF; 2. RET A-------DISPLAY CHARACTER;--------------------------------------------------------------------DCCHANG:MOV DPTR,#CHARALMOVC A,@A+DPTRRET;CHARACTERS LISTCHARAL: DB 3FH,06H,5BH,4FH,66H,6DH;SETOFF : 00H,01H,02H,03H,04H,05H,;CHARACTERS: 0, 1, 2, 3, 4 , 5DB 7DH,07H,7FH,6FH,77H,7CH; 06H,07H,08H,09H,0AH,0BH,; 6, 7, 8, 9, A, B,DB 39H,5EH,79H,71H,73H,3EH; 0CH,0DH,0EH,0FH,10H,11H,; C, D, E, F, P, U,DB 76H,38H,40H,6EH,0FFH,00H; 12H,13H,14H,15H,16H, 17H; H, L, -, Y, 8., " "DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH; 18H,19H, 1AH, 1BH, 1CH, 1DH,; 0., 1., 2., 3., 4., 5.,DB 0FDH,87H,0FFH,0EFH,0F7H,0FCH; 1EH, 1FH,20H, 21H, 22H, 23H,; 6., 7., 8., 9., A., B.,DB 0B9H,0CEH,0F9H,0F1H,0F3H,0BEH; 24H, 25H, 26H, 27H, 28H, 29H,; C., D., E., F., P., U.,DB 0F6H,0B8H,0C0H,0DEH,0FFH,80H; 2AH, 2BH, 2CH, 2DH, 2EH, 2FH; H., L., -., Y., 8., " .";--------------------------------------------------------------------;--------------------------------------------------------------------; T0,T1 INTERRUPT SUBROUTINE; 1. T0INTSR.......T0 INTERRUPT SERVE ROUTINE;--------------------------------------------------------------------;--------------------------------------------------------------------;1.T0INTSR:; T0 INTERRUPT SERVE ROUTINE;; 1. T0 IS SETED AS 0.05S TIMER(MODE 1); 2. T0 IS SET AS:; TL0=B0H; TH0=3CH 3CB0H = 15536 = 65536(2 E+16) - 50000; AFTER 50000 uS ,INTRUPT IS HAPPEN; IN THIS STATES, T0 TIME IS 50 MS;--------------------------------------------------------------------T0INTSR:CLR ET0CLR TR0INC 2EHMOV TL0,#0B0HMOV TH0,#03CHSETB TR0SETB ET0RETI;==================================================================== END。

电子钟汇编程序

电子钟汇编程序

电子钟汇编程序HOUR EQU 30H ;小时计数单元MIN EQU 31H ;分钟计数单元SEC EQU 32H ;秒计数单元COUNT EQU 33H ;50ms计数单元BUF EQU 38H ;显示缓冲区首地址,共3字节ORG 0LJMP STARTORG 03HLJMP TR ;外部INTO中断ORG 0BHLJMP TS ;50ms中断服务程序ORG 30HSTART: MOV SP,#60H ;设置堆栈MOV DPTR,#0FF20HMOV A,#03HMOVX @DPTR,A ;8155初始化MOV TMOD,#01H ;设T0为方式1MOV TH0,#9EHMOV TL0,#58H ;50ms定时初值SETB PT0 ;设T0为高级中断CLR PX0 ;INT0为低级中断SETB IT0 ;设外部中断0为边沿中断SETB ET0 ;允许T0中断MOV COUNT,#20 ; 50ms计数单元赋初值MOV HOUR,#0 ; 小时计数单元清零MOV MIN,#0 ;分钟计数单元清零MOV SEC,#0 ;秒计数单元清零SETB TR0 ;启动计数LOOP: JB P1.0,LM ;若K1=1则转移到LM SETB EX0 ;开INT0中断LJMP OUTLM: CLR EX0 ;关INT0中断OUT: CLR EA ;关中断,避免读数时显示跳动MOV BUF,HOUR ;存小时到显示缓冲区MOV BUF+1,MIN ; 存分钟到显示缓冲区MOV BUF+2,SEC ; 存秒到显示缓冲区SETB EA ;开中断LCALL DISP ;调显示子程序SJMP LOOP;显示程序;将BUF单元的3字节BCD码送数码管显示DISP: MOV R0,#BUF ;送显示缓冲区首址MOV R6,#3 ;共显示3个字节的BCD码MOV R7,#1 ;位码初值DISP1:MOV A,@R0 ;取要显示的压缩BCD码ANL A,#0FH ;屏蔽高4位MOV DPTR,#DISP_TAB ;MOVC A,@A+DPTR ;查表得段码ANL A,#7FH ;点亮末尾小数点MOV DPTR,#0FF22H ;指向8155B口MOVX @DPTR,A ;字形码送B口MOV A,R7MOV DPTR,#0FF21H ;指向A口MOVX @DPTR,ARL A ;位码A左移一位MOV R7,A ;存位码LCALL DELAY ;延时2msMOV A,#00HMOVX @DPTR,A ;消隐MOV A,@R0SWAP A ;高低四位交换ANL A,#0FHMOV DPTR,#DISP_TABMOVC A,@A+DPTRMOV DPTR,#0FF22HMOVX @DPTR,AMOV A,R7MOV DPTR,#0FF21HMOVX @DPTR,ARL AMOV R7,ALCALL DELAYMOV A,#00H ;消隐MOVX @DPTR,AINC R0 ;指向下一个待显示数据DJNZ R6,DISP1 ;没显示完循环RETDISP_TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0BFH,07FH,0FFH ;50ms 定时中断服务程序TS: PUSH PSW ;保护现场PUSH ACCPUSH DPHPUSH DPLCLR T R0 ;停止T0计数MOV TH0,#9EH ;50ms定时初值MOV TL0,#58HSETB TR0 ;启动T0计数DJNZ COUNT,EXIT ;中断不够20次返回MOV COUNT,#20 ;送20次中断计数初值MOV A,SEC ;取秒计数ADD A,#1 ;秒加1DA A ;调整为BCD码MOV SEC,A ;存秒CJNE A,#60H,EXIT ;不到60秒则退出MOV SEC,#0 ;秒单元清零MOV A,MIN ;取分计数ADD A,#1 ;分加1DA A ;调整为BCD码MOV MIN,A ;存分CJNE A,#60H,EXIT ;不到60分则退出MOV MIN,#0 ;分清零MOV A,HOUR ;取小时ADD A,#1 ;小时加1DA A ;调整为BCD码MOV HOUR,A ;存小时CJNE A,#24H,EXIT ;不到24小时则退出MOV HOUR,#0 ;小时清零EXIT:POP DPL ;恢复现场POP DPHPOP ACCPOP PSWRETI;INT0中断服务程序TR: PUSH PSW ;保护现场PUSH ACCPUSH DPHPUSH DPLJB P1.1, LM1 ;若K2=1则转到LM1 MOV A, MIN ;取分计数ADD A, #1 ;分钟加1DA A ;调整为BCD码MOV MIN,A ;存分CJNE A,#60H,NEXT ;不到60分转NEXT MOV MIN,#0 ;分清零LJMP NEXTLM1: MOV A,HOUR ;取小时计数ADD A,#1DA AMOV HOUR,ACJNE A,#24H,NEXT ;不到24小时则转MOV HOUR,#0NEXT: POP DPL ;恢复现场POP DPHPOP ACCPOP PSWRETI ;中断返回DELAY: MOV R3,#250 ;2ms延时L1: NOPNOPDJNZ R3,L1RETEND。

电子时钟汇编程序

电子时钟汇编程序

基于AT89C51的电子时钟设计用单片机和38译码器设计的电子时钟程序如下:; 定义管脚S_SET BIT P1.0 ;数字钟秒控制位M_SET BIT P1.1 ;分钟控制位H_SET BIT P1.2 ;小时控制位SECOND EQU 30HMINUTE EQU 31HHOUR EQU 32HORG 00HSJMP MAINORG 0BHLJMP INT_T0MAIN: MOV DPTR,#TABLEMOV HOUR,#0 ;初始化MOV MINUTE,#0MOV SECOND,#0MOV R0,#0MOV TMOD,#01HMOV TH0,#3CH ; 设置初值(定时50毫秒)MOV TL0,#0B0HSETB TR0 ;启动定时SETB ET0SETB EA;****************************************************************************** *;判断是否有控制键按下A1: LCALL DISPLAYJNB S_SET,S1JNB M_SET,S2JNB H_SET,S3LJMP A1S1: LCALL DELAY ;去抖动JB S_SET,A1INC SECOND ;秒值加1MOV A,SECONDCJNE A,#60,J0 ;判断是否加到60秒MOV SECOND,#0LJMP K1S2: LCALL DELAYJB M_SET,A1K1: INC MINUTE ;分钟值加1MOV A,MINUTECJNE A,#60,J1 ;判断是否加到60分MOV MINUTE,#0LJMP K2S3: LCALL DELAYJB H_SET,A1K2: INC HOUR ;小时值加1MOV A,HOURCJNE A,#24,J2 ;判断是否加到24小时MOV HOUR,#0MOV MINUTE,#0MOV SECOND,#0LJMP A1;**************************************************** ;等待按键抬起J0: JB S_SET,A1LCALL DISPLAYSJMP J0J1: JB M_SET,A1LCALL DISPLAYSJMP J1J2: JB H_SET,A1LCALL DISPLAYSJMP J2;***********************************************;定时器中断服务程序,对秒,分钟和小时的计数INT_T0: MOV TH0,#3CHMOV TL0,#0B0HINC R0MOV A,TCNTCJNE A,#20,RETUNE ;计时1秒INC SECONDMOV R0,#0MOV A,SECONDCJNE A,#60,RETUNEINC MINUTEMOV SECOND,#0MOV A,MINUTECJNE A,#60,RETUNEINC HOURMOV MINUTE,#0MOV A,HOURCJNE A,#24,RETUNEMOV HOUR,#0MOV MINUTE,#0MOV SECOND,#0MOV R0,#0RETUNE: RETI;****************************************** ;显示控制子程序DISPLAY: MOV A,SECOND ;显示秒MOV B,#10DIV ABCLR P3.6MOVC A,@A+DPTRMOV P0,ALCALL DELAYSETB P3.6MOV A,BCLR P3.7MOVC A,@A+DPTRMOV P0,ALCALL DELAYSETB P3.7CLR P3.5MOV P0,#40H ;显示分隔符LCALL DELAYSETB P3.5MOV A,MINUTE ;显示分钟MOV B,#10DIV ABCLR P3.3MOVC A,@A+DPTRMOV P0,ALCALL DELAYSETB P3.3MOV A,BCLR P3.4MOVC A,@A+DPTRMOV P0,ALCALL DELAYSETB P3.4CLR P3.2MOV P0,#40H ;显示分隔符LCALL DELAYSETB P3.2MOV A,HOUR ;显示小时MOV B,#10DIV ABCLR P3.0MOVC A,@A+DPTRMOV P0,ALCALL DELAYSETB P3.0MOV A,BCLR P3.1MOVC A,@A+DPTRMOV P0,ALCALL DELAYSETB P3.1RETTABLE: DB 3FH,06H,5BH,4FH,66HDB 6DH,7DH,07H,7FH,6FHDELAY: MOV R6,#5D1: MOV R7,#250DJNZ R7,$DJNZ R6,D1RETEND这里的程序没用38译码器,若要用则显示子程序要改如要显示秒,程序如下DISPLAY: MOV A,SECOND ;显示秒MOV B,#10DIV ABMOV R7,#60HORG A,R7MOV P0,ALCALL DELAYMOV A,BMOV R7,#70HORL A,R7MOV P0,ALCALL DELAY其他的一样这样改就行了【2009.6】。

数字钟流程图(汇编语言)

数字钟流程图(汇编语言)
Mov hour_h,#0
Mov hour,#0
Mov min,#0
Mov sec,#0
Mov xsstate,#0
Clr addflag
Clr decflag
Mov seccs,#0
Mov tmod,#01h
Mov th0,#03ch
Mov tl0,#0b0h
Setb tr0
Clr sectime
秒表流程图及相应的程序
(汇编语言版)
定义(资源分配):
显示的数据:
秒的高位、秒的低位、毫秒的高位、毫秒的低位。秒数据、毫秒数据定义。
数码管的段输入、位控制定义。
按键的定义、显示状态定义。
时间状态定义:
hour_h data 30h
hour_l data 31h
min_h data 32h
min_l data 33h
key1bit p3.2
key2 bit p3.3
key3 bit p3.4
addflag bit 20h
decfalg bit 21h
xsstate data 39h
secflagdata 3ah;定义50ms的次数
sectime bit 22h;定义1s到
主程
Org 0000h
Ajmp main
Cjnz a,60,shujuchuliend
Mov sec,#0
Inc min
Jnb decflag,anjianchuliend
Dec min
Clr decflag
Mov a,min
Cjnz a,255,anjianchuliend
Mov min,#59
Acall anjianchuliend

汇编语言电子钟程序

汇编语言电子钟程序

汇编电子钟:ORG 0000H ;程序开始地址LJMP MAIN ;跳到MAINORG 000BH ;T0中断程序入口LJMP INTT0 ;跳到T0开始执行程序ORG 0100HMAIN:MOV @R0,#70H ;准备70H-79H 10个字节空间MOV R7,#09HCLRDISP:MOV @R0,#00H ;将70H-79H初始化为00HINC R0DJNZ R7,CLRDISPMOV TMOD,#01H ;设T0为16位定时器MOV TL0,#0B0H ;赋初始值MOV TH0,#3CHSETB EA ;CPU开中断SETB ET0 ;允许T0中断SETB TR0 ;启动T0MOV R4,#14H ;1S设定初始值LOOP:LCALL DISP ;调用显示程序JB P1.0,LOOP1 ;判断P1.0有无按下LCALL HOUR_SET ;调用小时设定程序AJMP LOOPLOOP1:JB P1.1,LOOP2 ;判断P1.1有无按下LCALL MIN_SET ;调用分设定程序AJMP LOOPLOOP2:JB P1.2,LOOP3 ;判断P1.2有无按下LCALL CLR0 ;调用清零程序,这里只清零秒AJMP LOOPLOOP3:AJMP LOOPHOUR_SET:CALL DISP ;调用显示程序JNB P1.0,HOUR_SET ;P1.0按下跳到调小时程序INC 78H ;小时的个位加1MOV R6,78HCJNE R6,#10,HOUR1 ;个位不为10跳到HOUR1MOV 78H,#0 ;个位清零INC 79H ;十位加1JMP HOUR2 ;跳到HOUR2HOUR1:MOV R6,78HCJNE R6,#4,HOUR2 ;个位不为4跳到HOUR2MOV R6,79HCJNE R6,#2,HOUR2 ;十位不为2跳到HOUR2MOV 78H,#0 ;小时清零MOV 79H,#0HOUR2:RET ;调时返回MIN_SET:CALL DISP ;调用显示程序JNB P1.1,MIN_SET ;P1.1按下跳到调分程序INC 76H ;分的个位加1MOV R5,76HCJNE R5,#10,MIS1 ;个位不为10跳到MIS1MOV 76H,#0 ;个位清零INC 77H ;十位加1MOV R5,77HCJNE R5,#6,MIS1 ;十位不为6跳到MIS1MOV 77H,#0 ;分清零MOV 76H,#0RETMIS1:RET ;调分返回INTT0:PUSH ACC ;入栈,保护现场PUSH PSWCLR ET0 ;关闭中观允许CLR TR0 ;关闭中断MOV A,#0B7H ;中断响应时间同步修正ADD A,TL0 ;低8位初值修正MOV TL0,AMOV A,#3CH ;高8位初值修正ADDC A,TH0MOV TH0,ASETB TR0 ;开启定时器T0DJNZ R4,OUT ;20次中断未到中断退出ADDS:MOV R4,#14H ;20次中断到重赋初值MOV R0,#71H ;指向秒计时单元ACALL ADD1 ;调用ADD1MOV A,R3 ;秒数据放入ACLR C ;清零进位标志CJNE A,#60H,ADDMM ;秒是否到了60,是则跳转ADDMM:JC OUT ;小雨60秒中断退出ACALL CLR0 ;等于60秒调用CLR0清零秒MOV R0,#77H ;指向分计时单元ACALL ADD1 ;调用ADD1MOV A,R3 ;分数据放入ACLR C ;清零进位标志CJNE A,#60H,ADDH ;分是否到了60,是则跳转ADDH:JC OUT ;小于60分时中断退出ACALL CLR0 ;等于60分调用CLR0清零秒MOV R0,#79H ;指向时计时单元ACALL ADD1 ;调用ADD1MOV A,R3 ;时数据放入ACLR C ;清零进位标志CJNE A,#24H,HOUR ;时是否到了24,是则跳转HOUR:JC OUT ;小于24时时中断退出ACALL CLR0 ;调用CLR0OUT:MOV 72H,76H ;将分的存储地址转移MOV 73H,77HMOV 74H,78H ;将时的存储地址转移MOV 75H,79HPOP PSW ;恢复现场POP ACCSETB ET0RETICLR0:CLR A ;清零AMOV @R0,A ;清零R0存放地址中的数据DEC R0 ;R0地址减1MOV @R0,ARETADD1:MOV A,@R0 ;取当前计时单元数据到ADEC R0 ;指向前一地址SWAP A ;A中数据高四位与低四位交换ORL A,@R0 ;前一地址中数据放入A中低四位ADD A,#01H ;A加1操作DA A ;十进制调整MOV R3,A ;移入R3寄存器ANL A,#0FH ;高四位变0MOV @R0,A ;放回前一地址单元MOV A,R3 ;取回R3中暂存数据INC R0 ;指向当前地址单元SWAP A ;A中数据高四位与低四位交换ANL A,#0FH ;高四位变0MOV @R0,A ;数据放入当削地址单元中RET ;子程序返回DISP:MOV R1,#70H ;指向显示数据首址MOV R5,#01H ;扫描控制字初值PLAY:MOV A,R5 ;扫描字放入AMOV P2,A ;从P2口输出MOV A,@R1 ;取显示数据到AMOV DPTR,#TABLE ;取段码表地址MOVC A,@A+DPTR ;查显示数据对应段码MOV P0,A ;段码放入P0口LCALL DL1MS ;显示1MSINC R1 ;指向下一地址MOV A,R5 ;扫描控制字放入AJB ACC.5,ENDOUT ;ACC.5=0时一次显示结束RL A ;A中数据循环左移MOV R5,A ;放回R5内AJMP PLAY ;跳回PLAY循环ENDOUT:CLR P2.5 ;一次显示结束,P2口复位RET ;子程序返回TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90HDL1MS: ;1毫秒延时程序MOV R6,#14HDL1:MOV R7,#19HDL2:DJNZ R7,DL2DJNZ R6,DL1RETEND。

汇编语言实现的电子时钟的设计

汇编语言实现的电子时钟的设计

目录第1章、概述1.1 设计目的 (1)设计要求 (1)第2章、系统总体方案设计2.1 设计方案 (2)2.2 硬件设计 (2)2.3 电子时钟程序流程图 (5)第3章、方案实施3.1 单片机简介 (6)3.2 动态LCD液晶显示器显示 (7)3.3 软件调试及调试方法 (8)第4章、总结 (10)附录、源代码及电路原理图 (14)第1章概述、设计目的1熟悉整个项目的流程即单片机系统设计过程2 学会使用各种仿真软件3熟练的使用汇编语言编写小的应用程序4 掌握系统的调试与安装5提高学生的自学能力和动手能力、设计要求1、主电路系统由秒信号发生器、“时、分、秒”计数器、显示器、校时电路组成。

2、秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,一般用石英晶体振荡器加分频器来实现。

将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。

“分计数器”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。

“时计数器”采用24进制计时器,可实现对一天24小时的累计3、软件程序通过单片机将“时”、“分”、“秒”计数器的输出状态通过液晶显示器显示出来。

4、整点报时电路时根据计时系统的输出状态产生一脉冲信号,然后去触发一音频发生器实现报时5、校时电路时用来对“时”、“分”、“秒”显示数字进行校对调整的。

第2章、系统总体方案设计2.1设计方案1)方案讨论和设计:倒计时数字秒表的设计主要考虑以下几个问题:一,LCD液晶显示器如何显示数字0—9;二,如何用单片机来控制LCD的显示;三,单片机最小模式下的设计。

处理好这些问题此设计才能完整,为此必须先了解LCD的显示原理和接线方法,再了解单片机的组成原理和控制方法。

硬件电路的绘制和软件程序的编写是此次设计的关键和基础,只有硬件电路的设计是正确的、合理的,软件设计才可以根据硬件电路编程,以下的设计才能够进行。

单片机汇编程序51电子时钟.doc

单片机汇编程序51电子时钟.doc

单片机汇编程序 51电子时钟电子钟设计实验报告一)实验目的:1、进一步掌握定时器的使用和编程方法。

2、进一步掌握中断处理程序的编程方法。

3、进一步掌握数码显示电路的驱动方法。

4、进一步掌握键盘电路的驱动方法。

5、进一步掌握软件数据处理的方法。

二)内容要求:1、利用CPU的定时器和数码显示电路,设计一个电子时钟。

格式如下:XX XX XX 由左向右分别为:时、分、秒。

2、电子时钟有秒表功能。

3、并能用键盘调整时钟时间。

4、电子时钟能整点报时、整点对时功能。

5、能设定电子时钟的闹铃。

三)主要元件:电阻4.7K 10个 2K 1个四位共阳数码管1个二位共阳数码管1个按钮开关4个万用板(中板)1个 9012PNP 7个排线排阵若干电线一捆蜂鸣器1个最小系统一个四)系统说明:按P1.0键,如果按下的时间小于1秒进入省电模式(数码管不显示,开T0计时器),如果按下的时间大于1秒则进入时间调整.。

在时间调整状态:再按P1.0,如果按下时间大于0.5秒转调小时状态,按下时间小于0.5秒加1分钟操作。

在小时调整状态再按P1.0键,如果按下时间大于0.5秒退出时间调整,如果按下时间小于0.5秒加1小时操作。

按P1.1键,进入闹铃调分状态,按P1.2分加1,按P1.0分减1。

若再按P1.3,则进入调整状态,按P1.2时加1,按P1.0分时。

按P1.1键,闹铃有效,显示式样变为00:00:—0;再按P1.1键,闹铃无效,显示式样变为00:00:—。

按P1.3键,调整闹钟时间结束。

按P1.2键,进入秒表计时功能,按P1.2键暂停或清零,按P1.1键退出秒表回到时钟状态。

而且本系统还有整点报时功能,以及按键伴有声音提示。

五)程序流程图:开始 TO中断初始化保护现场进入功能调用显示定时初值校正程序子程序N Y键按下, 1S到,Y N加1S处理整点到NY恢复现场,中断返回按时间鸣叫次数主程序流程图 T0中断计时程序流程图T1中断保护现场T1中断服务程序流程图秒表/闪烁,时钟调时闪烁加10MS处理闪烁处理恢复现场,中断返回六)电路图七)程序清单:中断入口程序 ;; DISPFIRST EQU 30H BELL EQU P1.4CONBS EQU 2FHOUTPX EQU P2 ;P2位选OUTPY EQU P0 ;P0段选INP0 BIT P1.0INP1 BIT P1.1INP2 BIT P1.2ORG 0000H ;程序执行开始地址LJMP START ;跳到标号START执行ORG 0003H ;外中断0中断程序入口RETI ;外中断0中断返回ORG 000BH ;定时器T0中断程序入口LJMP INTT0 ;跳至INTTO执行ORG 0013H ;外中断1中断程序入口RETI ;外中断1中断返回ORG 001BH ;定时器T1中断程序入口LJMP INTT1 ;跳至INTT1执行ORG 0023H ;串行中断程序入口地址RETI ;串行中断程序返回;QQQQ:MOV A,#10HMOV B,79HMUL ABADD A,78HMOV CONBS,ABSLOOP:LCALL DS20MSLCALL DL1SLCALL DL1SLCALL DL1SDJNZ CONBS,BSLOOPCLR 08HAJMP START;; 主程序 ;;START:MOV R0,#00H ;清70H-7AH共11个内存单元MOV R7,#80H ;CLEARDISP: MOV @R0,#00H ;INC R0 ;DJNZ R7,CLEARDISP ;MOV 20H,#00H ;清20H(标志用)MOV 7AH,#0AH ;放入"熄灭符"数据MOV TMOD,#11H ;设T0、T1为16位定时器MOV TL0,#0B0H ;50MS定时初值(T0计时用) MOV TH0,#3CH ;50MS定时初值MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用) MOV TH1,#3CH ;50MS定时初值SETB EA ;总中断开放SETB ET0 ;允许T0中断SETB TR0 ;开启T0定时器MOV R4,#14H ;1秒定时用初值(50MS×20)MOV DISPFIRST ,#70HSTART1: LCALL DISPLAY ;调用显示子程序JNB INP0,SETMM1 ;P1.0口为0时转时间调整程序JNB INP1,FUNSS ; 秒表功能,P1.1按键调时时作减1加能JNB INP2,FUNPT ;STOP,PUSE,CLRJNB P1.3,TSFUNSJMP START1 ;P1.0口为1时跳回START1SETMM1: LJMP SETMM ;转到时间调整程序SETMM FUNSS: LCALL DS20MSJB INP1,START1WAIT11: JNB INP1,WAIT11CPL 03HMOV DISPFIRST,#00H :显示秒表数据单元MOV 70H,#00HMOV 71H,#00HMOV 76H,#00HMOV 77H,#00HMOV 78H,#00HMOV 79H,#00HAJMP START1FUNPT: LCALL DS20MSJB INP2,START1WAIT22: JNB INP2,WAIT21CLR ET0CLR TR0WAIT33: JB INP2,WAIT31 LCALL DS20MSJB INP2,WAIT33WAIT66: JNB INP2,WAIT61 MOV R0,#70H ;清70H-79H共10 个内存单元MOV R7,#0AH ;CLEARP: MOV @R0,#00H ;INC R0 ;DJNZ R7,CLEARP ;WAIT44: JB INP2,WAIT41 LCALL DS20MSJB INP2,WAIT44WAIT55: JNB INP2,WAIT51 SETB ET0SETB TR0AJMP START1WAIT21: LCALL DISPLAY AJMP WAIT22WAIT31: LCALL DISPLAY AJMP WAIT33WAIT41: LCALL DISPLAYAJMP WAIT44WAIT51: LCALL DISPLAYAJMP WAIT55WAIT61: LCALL DISPLAYAJMP WAIT66 TSFUN:LCALL DS20MSWAIT113:JNB P1.3,WAIT113JB 05H,CLOSESPMOV DISPFIRST,#50HMOV 50H,#0CHMOV 51H,#0AHDSWAIT:SETB EALCALL DISPLAYJNB P1.2,DSFINCJNB P1.0,DSDECJNB P1.3,DSSFU AJMP DSWAITCLOSESP:CLR 05HCLR BELLAJMP START1 DSSFU:LCALL DS20MS JB P1.3,DSWAIT LJMP DSSFUNN DSFINC:LCALL DS20MS JB P1.2,DSWAIT DSWAIT12:LCALL DISPLAY JNB P1.2,DSWAIT12 CLR EAMOV R0,#53H LCALL ADD1MOV A,R3CLR CCJNE A,#60H,ADDHH22ADDHH22:JC DSWAITACALL CLR0AJMP DSWAITDSDEC:LCALL DS20MSLCALL DISPLAYDSWAITEE:LCALL DISPLAYJNB P1.0,DSWAITEECLR EAMOV R0,#53HLCALL SUB1LJMP DSWAIT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 1秒计时程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;T0中断服务程序INTT0: PUSH ACC ;累加器入栈保护PUSH PSW ;状态字入栈保护CLR ET0 ;关T0中断允许CLR TR0 ;关闭定时器T0JB 03H,FSSMOV A,#0B7H ;中断响应时间同步修正ADD A,TL0 ;低8位初值修正MOV TL0,A ;重装初值(低8位修正值)MOV A,#3CH ;高8位初值修正ADDC A,TH0 ;MOV TH0,A ;重装初值(高8位修正值)SETB TR0 ;开启定时器T0DJNZ R4, OUTT0 ;20次中断未到中断退出ADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值MOV R0,#71H ;指向秒计时单元(71H-72H)ACALL ADD1 ;调用加1程序(加1秒操作)MOV A,R3 ;秒数据放入A(R3为2位十进制数组合)CLR C ;清进位标志CJNE A,#60H,ADDMM ;ADDMM: JC OUTT0 ;小于60秒时中断退出ACALL CLR0 ;大于或等于60秒时对秒计时单元清0 MOV R0,#77H ;指向分计时单元(76H-77H)ACALL ADD1 ;分计时单元加1分钟MOV A,R3 ;分数据放入ACLR C ;清进位标志CJNE A,#60H,ADDHH ;ADDHH: JC OUTT0 ;小于60分时中断退出ACALL CLR0 ;大于或等于60分时分计时单元清0MOV R0,#79H ;指向小时计时单元(78H-79H)ACALL ADD1 ;小时计时单元加1小时MOV A,R3 ;时数据放入ACLR C ;清进位标志JB 03H,OUTT0 ;秒表时最大数为99CJNE A,#24H,HOUR ;HOUR: JC OUTT0 ;小于24小时中断退出ACALL CLR0 ;大于或等于24小时小时计时单元清0OUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移MOV 73H,77H ;入对应显示单元MOV 74H,78H ;MOV 75H,79H ;LCALL BAOJPOP PSW ;恢复状态字(出栈)POP ACC ;恢复累加器SETB ET0 ;开放T0中断RETI ;中断返回 ;秒表计时程序(10MS加1),低2位为0.1、0.01秒,中间2位为秒,最高位为分。

基于8051的电子时钟汇编程序

基于8051的电子时钟汇编程序
CJNE A,#60H,KEYB_END ;判断"分"高位是否为6
ANL MINUTE,#0FH ;是,则"分"高位清0
LJMP KEYB_END
KC: CJNE A,#04,KEYB_END ;修改"分"低位
MOV A,MINUTE
ANL A,#0FH ;取"分"低位
ADD A,#01H ;"分"低位加1
ANL MINUTE,#0F0H ;取"分"高位
ORL MINUTE,A ;"分"高低位合并
CJNE A,#0AH,KEYB_END ;判断"分"低位是否为10
DISPDEAL: JB MODE,REA ;系统模式是否为1,是则跳转
JNB FLAG,RE_END ;不是,则判断"秒"显示的标志位是否为0
MOV DSBUF1,#0AAH ;将显示缓冲区高字节熄灭
MOV DSBUF2,SECOND ;将"秒"单元数据送至显示缓冲区低字节
;*****************************************************************
ITP0: PUSH PSW ;保护现场
PUSH ACC
CLR TR0 ;T0停止记数
MOV HOUR,#00 ;计满24小时,"时"单元清0
RETURN: LCALL DISPDEAL
POP ACC ;恢复现场
POP PSW
RETI
;************************显示处理子程序***********************************

电子时钟汇编程序(3)

电子时钟汇编程序(3)
SETB TR1 ;重启动定时器
SETB EA ;重开中断
……
;本次设计的软件误差补偿
CLR ET0 ;关T0中断允许
CLR TR0 ;关闭定时器T0
MOV A,#0B7H ;中断响应时间同步修正
LCALL DISPLAY ;有键按下,调显示子程序延时消抖
JB P3.7,CLOSE ;是干扰返回CLOSE等待
3、驱动电路的设计
9012三极管为NPN型小功率管,可作共阳数码管的驱动,也可用9013PNP型驱动共阴数码管
的时钟误差测得值为3-5s。
补偿方法:
1)、精确定时计数时可采用12MHz的晶振。
2)、用软件补偿,通用方法如下:
MCS-51单片机的中断响应延迟时间,取决于其它中断服务程序是否在进行,或取决于正在执行的是什么样的指令。单中断系统中的中断响应时间为3~8个机器周期。无论是哪一种原因引起的误差,在精确定时的应用场合,必须考虑它们的影响,以确保精确的定时控制。根据定时中断的不同应用情况,应选择不同的精确定时编程方法。以定时器T1工作在定时方式1为例,晶振频率为12MHz 。在定时器溢出中断得到响应时,停止定时器计数,读出计数值(反映了中断响应的延迟时间),根据此计数值算出到下一次中断时,需多长时间,由此来重装载和启动定时器。例如定时周期为1ms,则通常定时器重装载值为-1000(0FC18H)。下面的程序在计算每个定时周期的精确重装载值时,考虑了由停止计数(CLR TR1)到重新启动计数(SETB TR1)之间的7个机器周期时间。程序中#LOW(-1000+7)和#HIGH(-1000+7)是汇编符号,分别表示-1000+7=0FC1FH这个立即数的低位字节(1FH)和高位字节(0FCH)。

单片机电子钟汇编程序

单片机电子钟汇编程序

单片机电子钟汇编程序及程序解读 学号:1106012040:王林宋ORG 0000HUMP START ORG 0003H RETIORG OOOBH UMP INTTOORG 0013H RETIORG 001BH UMP INTT1 ORG 0023HRETI主程序START: MOVR0,#70H;淸70H-7AH 共11个存单元 MOVR7z #0BH ■/ CLEARDISP: MOVRO,#OOH • /INC R0 ■ /DJNZ R7,CLEARDISP■ / MOV 20H,#00H 20H (标志用)MOV 7AH, #0AH ;放入嗨灭符”数据MOV TMOD^llH;设TO 、T1为16位泄时器MOV TLO,#OBOH ;50MS 定时初值(T0计时用) MOV TH0,#3CH ;50MS 定时初值MOV TL1,#OBOH ;50MS 时初值(T1闪烁泄时用) MOVTHb#3CH;50MS 定时初值SETB EA ;总中断开放 SETB ETO ;允许T0中断 SETB TRO;开启T0定时器MOV R4,#14H汉秒怎时用初值(50MSX20) START1: LCALL DISPLAY;调用显示子程序JNB P3・7,SETMM1 ;P3.7 口为0时转时间调整程序SJMP START1;P3.7 口为 1 时跳回 START1SETMM1:LJMPSETMM;转到时间调整程序SETMM1秒计时程序TO 中断服务程序INTTO: PUSH ACC;累加器入栈保护 PUSH PSW;状态字入栈保护 CLRETO;关T0中断允许CLR TRO;关闭定时器T0MOV A,#0B7H;中断响应时间同步修正班级:12机制(2)班 ;程序执行开始地址 ;跳到标号START 执行 ;外中断0中断程序入口 ;外中断0中断返回 ;泄时器TO 中断程序入口 ;跳至INTTO 执行 ;外中断1中断程序入口 ;外中断1中断返回 ;泄时器T1中断程序入口 ;跳至INTT1执行 ;串行中断程序入口地址;串行中断程序返回ADD A Z TLO ;低8位初值修正MOV TLO,A ;重装初值(低8位修正值)MOV A,#3CH ;髙8位初值修正ADDC A,TH0 •/MOV THO Z A ;重装初值(高8位修正值)SETB TRO ;开启定时器TODJNZ R4, OUTTO ;20次中断未到中断退岀ADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值MOV R0,#71H ;指向秒计时单元(72H-72H)ACALL ADD1 ;调用加1程序(加1秒操作)MOV A,R3 ;秒数据放入A (R3为2位十进制数组合)CLR C ;淸进位标志CJNE A,#60H,ADDMM •/ADDMM: JC OUTTO ;小于60秒时中断退出ACALLCLRO ;大于或等于60秒时对秒讣时单元淸0MOV R0,#77H ;指向分计时单元(76H-77H)ACALL ADD1 ;分计时单元加1分钟MOV A,R3 ;分数据放入ACLR C ;淸进位标志CJNE A,#60H,ADDHH ■/ADDHH:JC OUTTO ;小于60分时中断退出ACALLCLRO ;大于或等于60分时分计时单元淸0MOV R0,#79H ;指向小时计时单元(78H-79H)ACALL ADD1 ;小时计时单元加1小时MOV A,R3 ;时数据放入ACLR C ;涓进位标志CJNE A Z#24H,HOUR •/HOUR: JC OUTTO ;小于24小时中断退岀ACALLCLRO ;大于或等于24小时小时计时单元淸0 OUTTO: MOV 72HJ6H ;中断退出时将分、时汁时单元数据移MOV 73H/77H ;入对应显示单元MOV 74H,78H •/MOV 75HJ9H ■/POP PSW ;恢复状态字(岀栈)POP ACC ;恢复累加器SETB ETO ;开放T0中断RETI ;中断返回闪动调时程序T1中断服务程序,用作时间调整时调整单元闪烁指示INTT1: PUSH ACC ;中断现场保护PUSH PSW ■/MOV TL1, #OBOH ;装左时器T1立时初值MOV TH1, #3CH •9DJNZ R2JNTT10UT ;0・3秒未到退出中断(50MS中断6次)MOV R2/#06H ;重装0.3秒定时用初值CPL 02H ;0.3秒定时到对闪烁标志取反JB 02HJLASH1 ;02H位为1时显示单元"熄火"MOV 72H,76H ;02H位为0时正常显示MOV 73H/77H •9MOV 74H,78H ■/MOV 75H,79H ■ /INTT1OUT: POP PSW ;恢复现场POP ACC •/RETI ;中断退出FLASH1: JB31H/FLASH2 ;01H位为1时,转小时熄火控制MOV 72H,7AH ;02H位为0时,"熄火符"数据放入分MOV 73HJAH ;显示单元(72H-73H),将不显示分数据MOV 74HJ8H •/MOV 75HJ9H • /AJMP INTT1OUT ;转中断退出FLASH2: MOV 72H,76H ;01H位为1时,"熄火符"数拯放入小时MOV 73H/77H ;显示单元(74H-75H),小时数据将不显示MOV 74H,7AH •/MOV 75H,7AH ■/AJMP INTT1OUT ;转中断退岀加1子程序ADD1: MOV A, RO ;取当前计时单元数据到ADEC RO ;指向前一地址SWAP A ;A中数据髙四位与低四位交换ORL A, RO ;前一地址中数据放入A中低四位ADD A z#01H ;A加1操作DA A ;十进制调整MOV R3,A ;移入R3寄存器ANL A,#OFH ;髙四位变0MOV R0,A ;放回前一地址单元MOV A,R3 ;取回R3中暂存数据INC RO ;指向当前地址单元SWAP A ;A中数据高四位与低四位交换ANL A,#OFH ;髙四位变0MOV RO,A ;数据放入当削地址单元中RET ;子程序返回清零程序;对计时单元复零用CLRO: CLR A ;淸累加器MOV RO,A ;淸当前地址单元DEC RO ;指向前一地址MOV RO,A ;前一地址单元淸0RET ;子程序返回时钟调整程序当调时按键按下时进入此程序SETMM: cLR ETO ;关泄时器TO中断CLR TRO ;关闭泄时器TOLCALL DL1S ;调用1秒延时程序JB P3.7,CLOSEDIS ;键按下时间小于1秒,关闭显示(省电)MOV R 乙#O6H ;进入调时状态,赋闪烁泄时初值SETB ET1 ;允许T1中断SETB TR1 ;开启立时器T1SET2: JNB P3.7,SET1 ;P3.7 口为0 (键未释放),等待SETB OOH ;键释放,分调整闪烁标志置1 SET4: JB P3.7,SET3 ;等待键按下LCALL DL05S ;有键按下,延时0.5秒JNB P3・7,SETHH ;按下时间大于0.5秒转调小时状态MOV RO,#77H ;按下时间小于0.5秒加1分钟操作LCALL ADD1 ;调用加2子程序MOV A,R3 ;取调整单元数据CLR C ;淸进位标志CJNE A,# 60H z HHH ;调整单元数据与60比较HHH:JC SET4 ;调整单元数据小于60转SET4循环LCALL CLRO ;调整单元数据大于或等于60时淸0CLR C ;淸进位标志AJMP SET4 ;跳转到SET4循环CLOSEDIS: SETBETO 省电(LED不显示)状态。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LOOP2: LCALL DISP ;
MOV A,P3
CPL A
ANL A,#3CH
JNZ LOOP2 ;等待键释放
MOV A,R6
RETX: RET
NOP
NOP
;按键处理子程序
ANKEY: CLR EA ;关中断
LX: MOV A,R6
JB ACC.2,L1 ;是功能键转L1
MOV 21H,#00H ;一分钟时间到
MOV A,22H
ADD A,#01H
DA A
MOV 22H,A
CJNE A,#60H,RETI1
MOV 22H,#00H ;一小时时间到
MOV A,23H
ADD A,#01H
DA A
MOV 23H,A
CJNE A,#24H,RETI1
LCALL KEY ;判断有无键按下。
JZ L12
LJMP LX
L2: MOV 25H,#00H ;确认键处理程序
CLR 2BH.4
CLR 2DH.4
CLR 2FH.4
SETB EA
RET
L3: JB 2BH.4,L61 ;增一键处理程序
JB 2DH.4,L81
JB 2FH.4,L91
MAIN:
mov 20h,#00h
MOV 21H,#00H
MOV 22H,#00H
MOV 23H,#00H
MOV IP,#02H ;IP,IE初始化
MOV IE,#82H
MOV TMOD,#01H ;设定定时器工作方式?
MOV TL0,#0B0H
MOV TH0,#3CH
SETB TR0 ;启动定时?
MOV SP,#40H ;重设堆栈指针
NEXT: LCALL DISP ;调用显示子程序?
LCALL KEY ;调用按键检测子程序
JZ NEXT ;
LCALL ANKEY ;调用按键处理子程序
SJMP NEXT ;重新循环
NOP
NOP
NOP
;定时中断处理程序:
TIME: PUSH ACC ;保护现场
JB ACC.3,L2 ;是确认键转L2
JB ACC.4,L3 ;是减1键转L3
JNB ACC.5,L12 ;不是增1键,转L12
JB 2BH.4,L6 ;判断使哪一位(时、分、秒)的值加1
JB 2DH.4,L8
JB 2FH.4,L9
L12: LCALL DISP
LCALL DISP
MOV 21H,#59H
AJMP L12
NOP
NOP
END
AJMP L12
L1: MOV A,25H ;功能键处理程序
JZ LB1
JB ACC.0,LB2
JB ACC.1,LB3
JNB ACC.2,L12
LB1: MOV 25H,#01H ;25H单元是标志位,(25H)=01H调节时单元的值
SETB 2BH.4
CLR 2DH.4
CLR 2FH.4
L811: MOV A,22H ;分减一
ADD A,#99H
DA A
MOV 22H,A
CJNE A,#99H,L112
MOV 22H,#59H
AJMP L12
L911: MOV A,21H ;秒减一
ADD A,#99H
DA A
MOV 21H,A
CJNE A,#99H,L112
MOV 23H,#00H
L112: AJMP L12
L8: MOV A,22H ;分加一
ADD A,#01H
DA A
MOV 22H,A
CJNE A,#60H,L16
L16: JC L112
MOV 22H,#00H
AJMP L12
L9: MOV A,21H ;秒加一
ADD A,#01H
DA A
MOV 21H,A
CJNE A,#60H,L17
L17: JC L112
MOV 21H,#00H
AJMP L12
L611: MOV A,23H ;时减一
ADD A,#99H
DA A
MOV 23H,A
CJNE A,#99H,L112
MOV 23H,#23H
AJMP L12
MOV 2CH,A
ANL 2BH,#10H
MOV A,23H ;处理小时23H-->2AH,2BH
ANL A,#0FH
ORL A,2BH
MOV 2BH,A
MOV A,23H
ANL A,#0F0H
SWAP A
MOV 2AH,A
MOV R0,#2FH ;显示偏移量
MOV R3,#06H
MOV 2FH,A
MOV A,21H
ANL A,#0F0H
SWAP A
MOV 2EH,A
ANL 2DH,#10H
MOV A,22H ;处理分钟22H-->2CH,2DH
ANL A,#0FH
ORL A,2DH
MOV 2DH,A
MOV A,22H
ANL A,#0F0H
SWAP A
MOV 23H,#00H ;到时间达到24小时,清零.
RETI1: POP PSW ;恢复现场
POP ACC
RETI ;中断返回?
NOP
NOP
;显示子程序
DISP: ANL 2FH,#10H ;处理小数点
MOV A,21H ;处理秒21H-->2DH,2EH
ANL A,#0FH
ORL A,2FH
//电子时钟汇编程序
//为 六位数码管时钟程序,单片机可用AT89S51,p3.2,p3.3,p3.4,p3.5 四键控制!实测24小时误差5秒。感兴//趣的可参照试做
//主程序(MAIN),如下:
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP TIME
ORG 0300H
NOP
NOP
;按键判断程序
KEY: MOV P3,#0FFH ;
MOV A,P3
CPL A
ANL A,#3CH
JZ RETX ;无键按下则返回
LCALL DISP ;
LCALL DISP
MOV A,P3
CPL A
ANL A,#3CH
JZ RETX ;键盘去抖动。
MOV R6,A ;将键值存入R6。
MOV DPTR,#TABLE
MOV A,#0BFH
LOOP1: MOV B,A ;
MOV P2,a
MOV A,@R0
MOVC A,@A+DPTR
MOV P0,a ;送显示
MOV R2,#80H ;延时
DJNZ R2,$
DEC R0
MOV A,B
RR A
DJNZ R3,LOOP1 ;循环显示
PUSH PSW
MOV TL0,#0B4H ;赋定时初值
MOV TH0,#3CH
INC 20H ;
MOV A,20H
CJNE A,#20,RETI1
MOV 20H,#00H ;一秒钟时间到
MOV A,21H
ADD A,#01H
DA A
MOV 21H,A
CJNE A,#60H,RETI1
RET
TABLE: db 28h,7eh,0a2h,62h,74h,61h,21h ;不带小数点
DB 7ah,20h,60h,00,00,00,00,00,00
DB 8H,5eH,82H,42H,54H,41H,1H,5aH ;带小数点
DB 00H,40H,00,00,00,00,00,00
CLR 2BH.4
CLR 2FH.411 ;
L81: AJMP L811 ;
L91: AJMP L911
L6: MOV A,23H ;时加一
ADD A,#01H
DA A
MOV 23H,A
CJNE A,#24H,L15
L15: JC L112
AJMP L12
LB3: MOV 25H,#04H ;25H单元是标志位,(25H)=01H调节秒单元的值
SETB 2FH.4
CLR 2DH.4
CLR 2BH.4
AJMP L12
LB2: MOV 25H,#02H ;25H单元是标志位,(25H)=01H调节分单元的值
SETB 2DH.4
相关文档
最新文档