系部动态

电子钟仿真电路

作者:机电系学院新闻来源:机电信息工程系点击数:17807更新时间:2018-12-03

;广西经济职业学院机电工程系

;使用硬件:AT89S51DS1302

;   4位动态数码管显示

;读取DS1302“时”“分”

;通过7SEG四位数码管显示

;有按键,调整时数值闪动

;P3.2进入调整模式,再按一次退出

;P3.1切换调整项目

;P3.0调整数值加1,长按连加1

;P3.0键也是时间和温度的切换开关

 图片12.png

 

;下程序原代码

 

RST BIT P2.2 ;定义引脚

SCLK BIT P2.0 ;方便使用

IO BIT P2.1 ;

HOUR EQU 078H    ;小时缓冲

MIN EQU 077H        ;分缓冲

SEC EQU 076H        ;秒缓冲

FLASH BIT 2EH ;闪动控制位

DS01 BIT 2DH ;地址、数据选择位

TEMP0 EQU 075H ;调整时调整项标志缓冲寄存器

 

ORG 000H

AJMP MAIN   ;转主程序

ORG 03H

LJMP BUTT   ;按键中断子程序入口

 

  

MAIN: ;主程序

CLR FLASH   ;清闪动控制标志位

MOV SP,#38H   ;堆栈指针

MOV R7,#0   ;以下几行为准备工作

MOV R3,#0   ;

CLR RST   ;使DS1302复位,关闭数据交换

CLR SCLK   ;DS1302串行时钟

MOV DPTR,#TAB ;指针指向表首

MOV IE,#81H   ;打开外中断0

MOV SP,#30H   ;重新定义堆栈指针

 

MOV A,#81H   ;读秒

LCALL R_1302   ;读使能

RLC A   ;提取时钟运行停止位(即判断是否为初次上电)

JNB P3.1,INTI0;如果按下P3.1后,上电运行,将强行初始化,显示00.00

JNC L   ;如果为0跳过初始化,如果为1则为初次上电,往下执行

 

INTI0: MOV A,#80H   ;写秒,DS1302初次上电必须写秒,否则时钟不运行

MOV B,#00H   ;秒初值

  LCALL W_1302   ;写使能

MOV A,#82H   ;写分

MOV B,#00H   ;分初值

  LCALL W_1302   ;写使能

MOV A,#84H   ;写分

MOV B,#00H   ;小时初值

  LCALL W_1302   ;写使能

 

MOV A,#8EH   ;写保护寄存器

MOV B,#00H   ;不保护

  LCALL W_1302   ;写使能

 

MOV A,#90H   ;写涓流充电设置

MOV B,#0A1H   ;涓流充电允许,不过二极管,2K电阻

  LCALL W_1302   ;写使能

 

L:

MAIN1:  CLR TR0   ;执行电子钟时,关闭定时器

SETB EA   ;打开中断

ACALL RTIME   ;读时间值到缓冲

LCALL   DISP   ;显示时间值

AJMP L

 

RTIME: ;读时间值到缓冲子程序

MOV A,#85H   ;读小时

LCALL R_1302   ;读使能

MOV HOUR,A    ;读取值送小时缓冲

MOV A,#83H   ;读分

LCALL R_1302   ;读使能

MOV MIN,A     ;读取值送分缓冲

RET

 

DISP: ;显示子程序

MOV A,MIN     ;分值送A,为提取分个位做准备

ANL A,#0FH     ;提取分个位(屏蔽高四位)

MOVC A,@A+DPTR   ;提取与A值对应的字模

MOV p0,A     ;字模送数据口

CJNE R3,#1,S18   ;R31时,个位闪动(在调整状态下)

JB FLASH,S19   ;闪动时频率与小数点同步

S18: CLR p2.6     ;显示个位

S19: LCALL D3MS     ;延时约3毫秒

SETB P2.6     ;关闭个位

 

MOV A,MIN     ;分值送A,为提取分十位做准备

SWAP A     ;高低四位交换,方便提取十位

ANL A,#0FH     ;提取十位(此时十位值已经在低四位)

MOVC A,@A+DPTR   ;提取与A值对应的字模

MOV p0,A     ;字模送数据口

CJNE R3,#1,S20   ;R31时,十位闪动

JB FLASH,S21   ;闪动时频率与小数点同步

S20: CLR P2.5     ;显示十位

S21: LCALL D3MS     ;延时约3毫秒

SETB P2.5     ;关闭十位

 

MOV A,HOUR     ;显示小时个位程序(与分个位类似)

ANL A,#0FH     ;

MOVC A,@A+DPTR   ;

MOV p0,A     ;

CJNE R3,#2,S22

JB FLASH,S23

S22: CLR P2.4     ;

S23: DJNZ R4,A1     ;\

MOV R4,#40     ;|

CPL FLASH     ; >5行让小数点闪动

A1: JB FLASH,A2    ;| 同时也做为调整时项目的闪动控制

CLR p0.7     ;/

A2: LCALL D3MS     ;

SETB P2.4

 

MOV A,HOUR     ;显示小时十位程序(与分十位类似)

SWAP A     ;

ANL A,#0FH     ;

MOVC A,@A+DPTR   ;

MOV p0,A     ;

CJNE R3,#2,S24

JB FLASH,S25

S24: CLR P2.3     ;

S25: LCALL D3MS     ;

SETB P2.3     ;

RET

 

R_1302: ;DS1302子程序

SETB RST    ;打开1302

MOV R7,#0

   L0: RRC A    ;取出一位数据送到位累加器C

    MOV IO,C    ;将数据送到1302数据口IO

SETB SCLK    ;与下一行构成时钟脉冲

CLR SCLK    ;(1302用来接收数据)

INC R7    ;计数器加1计数

CJNE R7,#8,L0   ;判断是否送完8位数据

MOV R7,#0    ;数据送完计数器归0

   L1: MOV C,IO    ;1302将数据送出IO

RRC A    ;接收一位数据放入位累加器C

SETB SCLK    ;与下一行构成时钟脉冲

CLR SCLK    ;(1302用来送出数据)

INC R7    ;计数器加1计数

CJNE R7,#8,L1   ;判断是否送出8位数据

MOV R7,#0    ;1302送出8位数据后计数器归0

CLR RST    ;关闭1302

RET

 

W_1302: ;DS1302子程序

SETB RST    ;打开1302

MOV R7,#0

CLR DS01    ;

   L2: RRC A    ;取出一位数据送到位累加器C

MOV IO,C    ;将数据送到1302数据口IO

SETB SCLK    ;与下一行构成时钟脉冲

CLR SCLK    ;(1302用来接收数据)

INC R7    ;计数器加1计数

CJNE R7,#8,L2   ;判断是否送完8位数据

MOV A,B    ;将要写入1302的数据传给A

MOV R7,#0    ;指令(或数据)送完给1302后计数器归0

CPL DS01    ;标志位

JB DS01,L2   ;如果为1,返回L2,将写数据送给1302

CLR RST    ;关闭1302

RET

 

BUTT: ;按键中断子程序

CLR EA ;进入按键程序后关闭中断

MOV R3,#1

S1: JB p3.7,S16;4行消抖动

LCALL RTIME

LCALL DISP

JB p3.7,S1

S6: JB p3.7,S2 ;4行等待按键释放

LCALL RTIME

LCALL DISP ;等待期间,还得显示时间

SJMP S6

S16: AJMP S11     ;S1S7的跳板

 

S2: ;退出按键程序

JB p3.7,S3 ;4行消抖动

LCALL RTIME

LCALL DISP

JB P3.7,S2

S7: JB P3.7,S16;等待P3.7释放,退出

LCALL RTIME

LCALL DISP

AJMP S7

 

S3: ;调整切换

JB P3.6,S4 ;4行消抖动

LCALL RTIME

LCALL DISP

JB P3.6,S3

S12: JB P3.6,S13

LCALL DISP

AJMP S12

S13: INC R3    ;

CJNE R3,#3,S4   ;

MOV R3,#1    ;

 

S4: ;数值调整按键

JB P3.5,S8    ;4行消抖动

MOV R2,#20    ;自加1速度控制量

LCALL RTIME

LCALL DISP

JB P3.5,S4

S10: JB P3.5,S9

MOV TEMP0,R3

MOV R3,#0    ;长按连加时,数值不闪动

LCALL RTIME

LCALL DISP

MOV R3,TEMP0

DJNZ R2,S10     ;长按自加1

 

S9: ;调分加1

CJNE R3,#1,S14  ;如果R3不为1,继续查询

MOV A,MIN

ADD A,#1

DA A

CJNE A,#60H,S5

MOV A,#0

S5: MOV B,A

MOV A,#82H

LCALL W_1302

AJMP S2

 

S14: ;调小时加1

;CJNE R3,#2,S17  ;如果R3不为2,继续查询

MOV A,HOUR    ;

ADD A,#1    ;

DA A    ;

CJNE A,#24H,S15 ;

MOV A,#0    ;

S15: MOV B,A    ;

MOV A,#84H    ;

LCALL W_1302    ;

AJMP S2    ;

 

S8: ;按键扫描期间(没键按下),还得显示时间

LCALL RTIME

LCALL DISP

AJMP S2

S11: ;退出按键程序,退出前重新打开中断

MOV R3,#0   ;0是为,进入调整时,从分开始

SETB EA   ;退出中断程序前重新打开中断

RETI

 

D3MS: ;延时3毫秒子程序

MOV R5,#6

D1: DJNZ R6,$

DJNZ R5,D1

RET

 

 TAB:      ;以下为标准0-9字模表

DB  0C0H,0F9H,0A4H,0B0H,099H,092H

DB  082H,0F8H,080H,090H,0BFH,0FFH

END

经职院官方公众号

广西经济职业学院

办公室电话:0771-6301430

传真:0771-6301345

招生电话:0771-6306381 6306382(兼传真) 6306383