| 网站首页 | 技术文章 | 专业论文 | PLC可编程 | 单片机 | 变频器 | 传感器 | 嵌入式系统 | 电源技术 | 运动与伺服 | 
 | 校园招聘 | 留言板 | 
您现在的位置: 自动化学习网 >> 技术文章 >> 单片机 >> 文章正文 用户登录 新用户注册
智能定时的4位电子钟(带定时控制)         ★★★ 【字体:
智能定时的4位电子钟(带定时控制)
作者:佚名    文章来源:本站原创    点击数:    更新时间:2007-3-23    

12.1 电子钟

程序及操作指南:程序写入上电后,将在四个数码管 上显示0000,然后每隔一分钟,数码管将从低位跳变,该

程序模拟的就是时钟。用按键数显键可将时间调至正确时 间。按按键数键一下,数码管将在低位闪烁,然后依次按

一下,数码管的闪烁位置就向前移一个数码管,按到第 下时,退出。将对应的数码管按闪烁以后,长按按键数显

键,数码管将会显示从1至9,显示到所需时间,松开按键 数显键,数码管显示对应所设时间,程序也会记下这个值。

例设置成2334, 即晚上11点34分。设置步骤如下:按键一下长按至 数码管分低显示到4时松开按键一下长按至

数码管分高位显示到3时松开按键一下长按 至数码管时低位显示到3时松开按键一下长 按至数码管时高位显示到2时松开。

注意:如果小时设置超过23,数码管将显示ERR(错 误),再按一下键恢恢复。

程序实例(clock.asm):

ORG 0000H

AJMP MAIN

ORG 0003H

AJMP INT ;外中断0入口

ORG 000BH

AJMP DIN0 ;定时器0入口

MAIN:

92

DISML EQU 30H

DISMH EQU 31H

DISHL EQU 32H

DISHH EQU 33H ;显示分,时的个时位

TFLAG EQU 34H ;时间秒标志,判是否到50

0.2秒,即50*0.2=1秒

SETFLAG EQU 35H ;设置标志,依次从个位到

十位到百位到千位

ADDFLAG EQU 36H

MFLAG EQU 37H ;时间分标志,判是否到60

个一秒,即一分

MOV DISML,#00H

MOV DISMH,#00H

MOV DISHL,#00H

MOV DISHH,#00H ;显示分,时的个时位初值

MOV TFLAG,#00H ;时间秒标志初值

MOV SETFLAG,#00H ;设置标志初值

MOV ADDFLAG,#00H ;设数加标志

MOV MFLAG,#00H ;时间分标志

MOV SCON,#00H ;串行口工作于方式0(同

步移位)

MOV TMOD,#00000001B;定时器0工作于方式1

MOV TL0,#0EEH

MOV TH0,#31H ;设定时时间为0.05秒,定

20次则一秒

SETB EA ;开总中断

SETB ET0 ;开定时器0中断允许

SETB EX0 ;开外中断0允许

93

SETB TR0 ;开定时0运行

SETB IT0 ;外中断0下降沿触发

DIS:

ACALL DISPLAY ;调用显示时钟程序

AJMP CRITERION ;调判断程序,按键是否按

了。

; ACALL DELAY

; AJMP DIS

DIN0:

PUSH ACC

;设置时是否出错,比如小时设到超过了23//////////

MOV A,DISHH

CJNE A,#02H,INCC

MOV A,DISHL

CLR C

SUBB A,#04H

JC INCC

MOV SETFLAG,#06H

AJMP RE

;/////////////////////////////////////////////

;是否到一秒///////////////////////////////////

INCC: INC TFLAG

MOV A,TFLAG

CJNE A,#19,RE

MOV TFLAG,#00H

;/////////////////////////////////////////////

;是否到一分///////////////////////////////////

INC MFLAG

94

MOV A,MFLAG

CJNE A,#60,RE

MOV MFLAG,#00H

;/////////////////////////////////////////////

;计分/////////////////////////////////////////

INC DISML

MOV A,DISML

CJNE A,#0AH,RE

MOV DISML,#00H

INC DISMH

MOV A,DISMH

CJNE A,#06H,RE

MOV DISMH,#00H

;/////////////////////////////////////////////

;计时/////////////////////////////////////////

;计时分两种情况,分为小时的高位到2和没到2,没到2时时

低位是逢10进位,到2后,时低位到4则全归0

MOV A,DISHH

CJNE A,#02H,HJ

;/////////////////////////////////////////////

;第一种情况///////////////////////////////////

INC DISHL

MOV A,DISHL

CJNE A,#04H,RE

MOV DISHL,#00H

MOV DISHH,#00H

AJMP RE

;/////////////////////////////////////////////

95

;第二种情况///////////////////////////////////

HJ: INC DISHL

MOV A,DISHL

CJNE A,#0AH,RE

MOV DISHL,#00H

INC DISHH

;/////////////////////////////////////////////

RE:

MOV TL0,#0EEH

MOV TH0,#31H ;设定时时间为0.02秒,定

50次则一秒

POP ACC

RETI ;退出中断

INT:

PUSH ACC

JB P3.2,EXIT

MOV R3,#0FFH

DJNZ R3,$

JB P3.2,EXIT ;判键抖

MOV A,SETFLAG

CJNE A,#00H,ADD2

AJMP SETKEY

ADD2: CJNE A,#06H,B0 ;是错误了吗,是的,去恢

MOV SETFLAG,#00H

AJMP SETKEY

B0: MOV R4,#15H

ADD1: JB P3.2,SETKEY

96

ACALL DELAY

DJNZ R4,ADD1

MOV ADDFLAG,#01H

AJMP EXIT

;状态增值/////////////////////////////////////

SETKEY: INC SETFLAG

MOV A,SETFLAG

CJNE A,#05H,EXIT

MOV SETFLAG,#00H

;/////////////////////////////////////////////

EXIT:

POP ACC

RETI

;显示时钟/////////////////////////////////////

DISPLAY:

MOV A,DISML

MOV DPTR,#SETTAB

MOVC A,@A+DPTR

MOV SBUF,A

D1: JNB TI,D1

CLR TI

MOV A,DISMH

MOV DPTR,#SETTAB

MOVC A,@A+DPTR

MOV SBUF,A

D2: JNB TI,D2

CLR TI

MOV A,DISHL

97

MOV DPTR,#SETTAB

MOVC A,@A+DPTR

MOV SBUF,A

D3: JNB TI,D3

CLR TI

MOV A,DISHH

MOV DPTR,#SETTAB

MOVC A,@A+DPTR

MOV SBUF,A

D4: JNB TI,D4

CLR TI

RET

;/////////////////////////////////////////////

;判按键标志///////////////////////////////////

CRITERION:

MOV A,SETFLAG

CJNE A,#00H,ERFLAG ;设置标志为0,即没

有按键,继续去显示

AJMP RET1

ERFLAG: CJNE A,#06H,SETML1 ;设置标志为6,即错

误了,去显示错误

AJMP ERR

SETML1: CJNE A,#01H,SETMH1

AJMP SETML ;设置标志为1,显示

设分低

SETMH1: CJNE A,#02H,SETHL1

AJMP SETMH ;设置标志为2,显示

设分高

98

SETHL1: CJNE A,#03H,SETHH1

AJMP SETHL ;设置标志为3,显示

设时低

SETHH1: CJNE A,#04H,RET1 ;设置标志为5,是退

出标志

AJMP SETHH ;设置标志为4,显示

设时高

RET1: SETB TR0

ACALL DELAY

AJMP DIS

;/////////////////////////////////////////////

;设分低(分低位闪烁)/////////////////////////

SETML:

CLR TR0

MOV A,ADDFLAG

CJNE A,#01H,SETML2 ;是否按下了2秒钟,

是就开始闪烁设置

JNB P3.2,ADD3

MOV ADDFLAG,#00H ;松开了,清闪标志

AJMP SETML2

ADD3: INC DISML

MOV A,DISML

CJNE A,#0AH,SETML2

MOV DISML,#00H

SETML2: ACALL DELAY2

ACALL DISPLAY

ACALL DELAY2

MOV SBUF,#00H

99

E1: JNB TI,E1

CLR TI

MOV A,DISMH

MOV DPTR,#SETTAB

MOVC A,@A+DPTR

MOV SBUF,A

E2: JNB TI,E2

CLR TI

MOV A,DISHL

MOV DPTR,#SETTAB

MOVC A,@A+DPTR

MOV SBUF,A

E3: JNB TI,E3

CLR TI

MOV A,DISHH

MOV DPTR,#SETTAB

MOVC A,@A+DPTR

MOV SBUF,A

E4: JNB TI,E4

CLR TI

AJMP CRITERION

;//////////////////////////////////////////////////

;设分高(分高位闪烁)////////////////////////////////

SETMH:

CLR TR0

MOV A,ADDFLAG

CJNE A,#01H,SETMH2 ;是否按下了2秒钟,

是就开始闪烁设置

100

JNB P3.2,ADD4

MOV ADDFLAG,#00H ;松开了,清闪标志

AJMP SETMH2

ADD4: INC DISMH

MOV A,DISMH

CJNE A,#0AH,SETMH2

MOV DISMH,#00H

SETMH2: ACALL DELAY2

ACALL DISPLAY

ACALL DELAY2

MOV A,DISML

MOV DPTR,#SETTAB

MOVC A,@A+DPTR

MOV SBUF,A

F1: JNB TI,F1

CLR TI

MOV SBUF,#00H

F2: JNB TI,F2

CLR TI

MOV A,DISHL

MOV DPTR,#SETTAB

MOVC A,@A+DPTR

MOV SBUF,A

F3: JNB TI,F3

CLR TI

MOV A,DISHH

MOV DPTR,#SETTAB

MOVC A,@A+DPTR

101

MOV SBUF,A

F4: JNB TI,F4

CLR TI

AJMP CRITERION

;//////////////////////////////////////////////////

;设时低位(时低位闪烁)////////////////////////////

SETHL:

CLR TR0

MOV A,ADDFLAG

CJNE A,#01H,SETHL2 ;是否按下了2秒钟,

是就开始闪烁设置

JNB P3.2,ADD5

MOV ADDFLAG,#00H ;松开了,清闪标志

AJMP SETHL2

ADD5: INC DISHL

MOV A,DISHL

CJNE A,#0AH,SETHL2

MOV DISHL,#00H

SETHL2: ACALL DELAY2

ACALL DISPLAY

ACALL DELAY2

MOV A,DISML

MOV DPTR,#SETTAB

MOVC A,@A+DPTR

MOV SBUF,A

G1: JNB TI,G1

CLR TI

MOV A,DISMH

102

MOV DPTR,#SETTAB

MOVC A,@A+DPTR

MOV SBUF,A

G2: JNB TI,G2

CLR TI

MOV SBUF,#00H

G3: JNB TI,F3

CLR TI

MOV A,DISHH

MOV DPTR,#SETTAB

MOVC A,@A+DPTR

MOV SBUF,A

G4: JNB TI,G4

CLR TI

AJMP C RITERION

;//////////////////////////////////////////////////

;设时高位(时高位闪烁)////////////////////////////

SETHH:

CLR TR0

MOV A,ADDFLAG

CJNE A,#01H,SETHH2 ;是否按下了2秒钟,

是就开始闪烁设置

JNB P3.2,ADD6

MOV ADDFLAG,#00H ;松开了,清闪标志

AJMP SETHH2

ADD6: INC DISHH

MOV A,DISHH

CJNE A,#03H,SETHH2

103

MOV DISHH,#00H

SETHH2: ACALL DELAY2

ACALL DISPLAY

ACALL DELAY2

MOV A,DISML

MOV DPTR,#SETTAB

MOVC A,@A+DPTR

MOV SBUF,A

H1: JNB TI,H1

CLR TI

MOV A,DISMH

MOV DPTR,#SETTAB

MOVC A,@A+DPTR

MOV SBUF,A

H2: JNB TI,H2

CLR TI

MOV A,DISHL

MOV DPTR,#SETTAB

MOVC A,@A+DPTR

MOV SBUF,A

H3: JNB TI,H3

CLR TI

MOV SBUF,#00H

H4: JNB TI,H4

CLR TI

AJMP CRITERION

;//////////////////////////////////////////////////

;错误显示//////////////////////////////////////////

104

ERR: CLR TR0

ACALL DELAY2

MOV SBUF,#0EAH

I1: JNB TI,I1

CLR TI

MOV SBUF,#0EAH

I2: JNB TI,I2

CLR TI

MOV SBUF,#9EH

I3: JNB TI,I3

CLR TI

MOV SBUF,#00H

I4: JNB TI,I4

CLR TI

AJMP CRITERION

;延时/////////////////////////////////////////

DELAY:

MOV R1,#100

DE: MOV R2,#100

DJNZ R2,$

DJNZ R1,DE

RET

;//////////////////////////////////////////////////

DELAY1:

MOV R1,#0FFH

DE1: MOV R2,#0FFH

DJNZ R2,$

DJNZ R1,DE1

105

RET

DELAY2: MOV 38H,#02H

DE3: MOV R2,#0FFH

DE2: MOV R1,#0FFH

DJNZ R1,$

DJNZ R2,DE2

DJNZ 38H,DE3

RET

SETTAB:

DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,

0FEH,0F6H

DB 0EEH,3EH,9CH,7AH,9EH,8EH ;数显代码

END

文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      最新热点   最新推荐   相关文章
    基于普通单片机的LIN协议实现…
    提高单片机系统可靠性的设计…
    利用单芯片MCU提高照明系统能…
    基于MCU的风光互补独立电源系…
    单片机控制GSM手机的技术及应…
    用51内核网络单片机构成的远…
    在Bank Switch基础上 实现大…
    用单片机实现DSP在线调试的一…
    利用Flash实现单片机系统的在…
    基于AT89C52单片机的自动存取…
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)