eda秒表程序

eda秒表程序,第1张

1.

“分分:秒秒”计数器设计

我们要实现“分分:秒秒”显示的电子秒表,需要设计计数频率为1Hz

计数器。因为“分分:秒秒”的结构对应有4个十进制数字(个位的秒,十位的

秒,个位的分,十位的分),如果采用统一计数再分别求出“分分:秒秒”

对应

的4个十进制数字进行译码显示,则求解对应的4个十进制数字的过程难于用硬

件实现。在此,我们将每个显示的值分别进行计数,即分别针对个位的秒、十位

的秒、个位的分、十位的分设计对应的计数器,其中个位的秒计数频率为1Hz,

其从0到9计数,当从9回到0时,向前进一位,使得十位的秒进行计数加1。

35

十位的秒从0到5计数,当从5回到0时,向前进一位,使得个位的分进行计数

加1。个位的分从0到9计数,当从9回到0

时,向前进一位,使得十位的分进

行计数加1。十位的分则从0

到5计数,计数到5时,又回到0。

2.

扫描显示技术

因为4位数码管的段控制输入是复用的,要分别显示不同的计数数值,需要

使用动态扫描显示技术,其电路结构如图61

所示。首先,以扫描显示的频率进

行2比特宽的模4计数,然后由其值从4个数码管的待显示值输入中选择对应的

一个经译码后连接到公共的段控制输入端,同时将计数值经2到4译码后输出到

对应数码管位的公共端,点亮对应的数码管。虽然各数码管位是轮流显示,每个

数码管位上的数字是断续的显示,只要扫描的频率够快,由于人眼的视觉残余效

应,就可以看到各数码管位上稳定的数字显示值。这和我们使用的电视、显示器

的显示原理是一样的。参考液晶显示器的刷新频率,经验证,在每秒钟扫描60

帧的时候,各数码管位上即能得到稳定的数字显示,此时,对应计数时钟的等效

频率为240Hz。我们可以参考实验四的图47,再做一个等效分频计数器,通过

产生的后级时钟使能信号将20MHz的时钟等效分频到240Hz。

61

扫描显示电路结构

3.

冒号点的处理

数码管中间的时间分隔冒号点(对应为左边第2个数码管位的DP点)每秒

钟闪烁一次,其频率为1Hz,只需要输出1Hz,占空比为50%的周期信号即可。

其他数码管位的点号不需要显示,对应的DP

点输出低电平无效信号即可。这4

个信号

所示的显示切换计数值进行4

选1

选择后接到数码管上公共的

DP控制端。

在实验四中,我们为了得到1Hz的主功能计数频率,前面利用precnt

进行了等效分频计数,其一个完整的计数周期即为1s,对应产生的使能信号en

频率即为1Hz,但我们在此不能直接使用en

的信号,因为其占空比只有

1/20000000,肉眼无法看到其闪烁的效果。为得到占空比为50%的1Hz信号,我

们可以通过对precnt

的计数值进行比较得出,只需要在precnt

计数周期内一半的

时间输出1,一半的时间输出0

即可,例如,当precnt>25'd9999999

时输出0,

否则输出1,此时即可得到占空比为50%的1Hz信号。

4.

总体设计

总体设计只需要将时钟电路、复位电路、按键电路、数码管电路等组合起来,

综合使用时钟使能的同步设计技术、按键处理技术、扫描显示技术、“分分:秒

秒”计数器设计技术及冒号点的处理技术即可。

**** IC=AT89S52 F=12MHz T=1uS *****************************************

**** WRITER:COCO.LI*************

定时器T0、T1溢出周期为50MS(10MS),T0为秒计数用,T1为调整时闪烁用,

**** P1.0、P1.1、P1.2为调整按钮,P0口为字符输出口,采用共阳显示管。

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

ORG 0000H 程序执行开始地址

LJMPSTART 跳到标号START执行

ORG 0003H 外中断0中断程序入口

RETI外中断0中断返回

ORG 000BH 定时器T0中断程序入口

LJMPINTT0 跳到标号INTT0执行

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

RETI外中断1中断返回

ORG 001BH 定时器T1中断程序入口

LJMPINTT1 跳到标号INTT1执行

ORG 0023H 串行口中断程序入口

RETI串行口中断程序返回

主程序

ORG 0030H

START:LCALL ST 上电显示年月日及班级学号

MOV R0,#70H 清70H~7AH共11个内存单元

MOV R7,#0BH

CLEARDISP:

MOV @R0,#00H

INC R0

DJNZR7,CLEARDISP

MOV 20H,#00H清20H , 标志用

MOV 7AH,#0AH放入“熄灭符”数据

MOV TMOD,#11H 设T0、T1为16位定时器

MOV TL0,#0B0H 50MS定时初值,T0计时用

MOV TH0,#3CH50MS定时初值

MOV TL1,#0B0H 50MS定时初值,T1闪烁定时用

MOV TH1,#3CH50MS定时初值

SETBEA 总中断开放

SETBET0 允许T0中断

SETBTR0 开启T0定时器

MOV R4,#14H 1 S定时用初值50MS*20

START1:

LCALL DISPLAY 调用显示子程序

JNB P3.3,SETMM1 P3.3口为0时,转时间调整程序

JNB P3.4,FUNSS 秒表功能,P3.4按键调时时作减1 *** 作

JNB P3.5,FUNPT STOP,PUSE,CLR

SJMPSTART1 P3.3口为1时跳回START1

SETMM1:

LJMPSETMM 转到时间调整程序SETMM

FUNSS:

LCALL DS20MS

JB P3.4,START1

WAIT11:

JNB P3.4,WAIT11

CPL 03H

MOV 70H,#00H

MOV 70H,#00H

MOV 70H,#00H

MOV 70H,#00H

MOV 70H,#00H

MOV 70H,#00H

AJMPSTART1

FUNPT:

LCALL DS20MS

JB P3.5,START1

WAIT22:

JNB P3.5,WAIT21

CLR ET0

CLR TR0

WAIT33:

JB P3.5,WAIT31

LCALL DS20MS

JB P3.5,WAIT33

WAIT66:

JNBP3.5,WAIT61

MOVR0,#70H 清70H~79H共10个内存单元

MOVR7,#0AH

CLEARP:

MOV@R0,#00H

INCR0

DJNZ R7,CLEARP

WAIT44:

JB P3.5,WAIT41

LCALL DS20MS

JB P3.5,WAIT44

WAIT55:

JNBP3.5,WAIT51

SETB ET0

SETB TR0

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

1 s计时程式

T0中断服务程序

INTT0:

PUSHACC 累加器入栈保护

PUSHPSW 状态字入栈保护

CLR ET0 关T0中断允许

CLR TR0 关定时器T0

JB 03H,FSS 标志为1转秒表处理程序,,10MS定时

MOV A,#0B7H 中断响应时间同步修正

ADD A,TL0 低8位初值修正

MOV TL0,A 重装初值,,低8位修正值

MOV A,#3CH 高8位初值修正

ADDCA,TH0

MOV TH0,A 重装初值,, 高8位修正值

SETBTR0 开启定时器T0

DJNZR4,OUTT020次中断未到中断退出

ADDSS:

MOV R4,#14H 20次中断到,重赋初值,,1S

MOV R0,#71H 指向秒计时单元..71H~72H

ACALL ADD1调用加1程序,,加1S *** 作.

MOV A,R3秒数据放入A,,R3为2位十进制数组合

CLR C 清进位标志

CJNEA,#60H,ADDMM

ADDMM:

JC OUTT0 短于60S时中断退出

ACALL CLR0长于或者等于60S时对秒计数单元清0

MOV R0,#77H 指向分计时单元,,76H~77H

ACALL ADD1分计时单元加1

MOV A,R3分数据放入A

CLR C 清进位标志

CJNEA,#60H,ADDHH 秒表时最大为99

ADDHH:

JC OUTT0 短于60min时中断退出

ACALL CLR0长于或者等于60min时对分计数单元清0

MOV R0,#79H 指向分计时单元,,78H~79H

ACALL ADD1小时计时单元加1h

MOV A,R3时数据放入A

CLR C 清进位标志

JB 03H,OUTT0 秒表时最大为99

CJNEA,#24H,HOUR

HOUR:

JC OUTT0 短于24h时中断退出

ACALL CLR0长于或者等于24h时对计时单元清0

OUTT0:

MOV 72H,76H 中断退出时将分\时计时单元数据移

MOV 73H,77H 入对应显示单元

MOV 74H,78H

MOV 75H,79H

POP PSW 恢复状态字出栈

POP ACC 恢复累加器

SETBET0 开放T0中断

RETI

秒表计时程序(10min加1),低2位为0.1、0.01秒,中间2位为秒,最高2位为分.

最大计数值为99分59.99秒

FSS:MOV A,#0F7H

ADD A,TL0

MOV TL0,A

MOV A,#0D8H

ADDCA,TH0

MOV TH0,A

SETBTR0

MOV R0,#71H

ACALL ADD1

CLR C

MOV A,R3

JZ FSS1

SETBC

FSS1: AJMPADDMM

闪动调时程式

T1中断服务程序,用作时间调整单元闪烁指示

INTT1: PUSHACC

PUSHPSW

MOV TL1,#0B0H

MOV TH1,#3CH

DJNZR2,INTT1OUT

MOV R2,#06H

CPL 02H

JB 02H,FLASH1

MOV 72H,76H

MOV 73H,77H

MOV 74H,78H

MOV 75H,79H

INTT1OUT:

POP PSW

POP ACC

RETI

FLASH1: JB 01H,FLASH2

MOV 72H,76H

MOV 73H,77H

MOV 74H,78H

MOV 75H,79H

AJMPINTT1OUT

FLASH2: MOV 72H,76H

MOV 73H,77H

MOV 74H,78H

MOV 75H,79H

AJMPINTT1OUT

加1子程序

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

DEC R0 指向前一地址

SWAPA 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 返回

INC R0

SWAPA

ANL A,#0FH

MOV @R0,A

RET

分减1子程序

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

DEC R0 指向前一地址

SWAPA A中数据高四位与低四位交换

ORL A,@R0 前一地址中数据放入A中低四位

JZ SUB11

DEC A A减1 *** 作

SUB111: MOV R3,A 移入R3中暂存数据

ANL A,#0FH 高四位变0

CLR C 清进位标志

SUBBA,#0AH

SUB1111:

JC SUB1110

MOV @R0,#09H 大于等于0AH,为9

SUB110:

MOV A,R3 取回R3中暂存数据

INC R0 指向当前地址单元

SWAPA A中数据高四位与低四位交换

ANL A,#0FH 高四位变0

MOV @R0,A 数据放入当前地址单元中

RET返回

SUB11: MOV A,#59H

AJMPSUB111

SUB1110:

MOV A,R3 移入R3寄存器

ANL A,#0FH

MOV @R0,A

AJMPSUB110

时减1子程序

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

DEC R0指向前一地址

SWAPA A中数据高四位与低四位交换

ORL A,@R0 前一地址中数据放入A中低四位

JZ SUBB1100减1为23H

DEC A A减1 *** 作

SUBB111:MOV R3,A 移入R3中暂存数据

ANL A,#0FH高四位变0

CLR C 清进位标志

SUBBA,#0AH时个位大于9为9

SUBB1111:

JC SUBB1110

MOV @R0,#09H 大于等于0AH,为9

SUBB110:

MOV A,R3 取回R3中暂存数据

INC R0指向当前地址单元

SWAPA A中数据高四位与低四位交换

ANL A,#0FH高四位变0

MOV @R0,A 数据放入当前地址单元中

RET 返回

SUBB11:

MOV A,#23H

AJMPSUBB111

SUBB1110:

MOV A,R3 时个位小于0A不处理

ANL A,#0FH高四位变0

MOV @R0,A 个位移入

AJMPSUBB110

清0程序

对计时单元复0用

CLR0: CLR A 清累加器

MOV @R0,A 清当前地址单元

DEC R0 指向前一地址

MOV @R0,A 前一地址单元清0

RET子程序返回

时钟调整程序

当调时按键按下时进入此程序

SETMM: CLR ET0关定时器T0中断

CLR TR0关闭定时器T0

LCALL DL1S 调用1S延时程序

JB P3.3,CLOSEDIS 键按下时间短于1S,关闭显示,,省电

MOV R2,#06H进入调时状态,赋闪烁定时初值

SETBET1允许T1中断

SETBTR1开启T1定时器

SET2:

JNB P3.3,SET1 P3.3口为0时,等待,,键未释放

SETB00H键释放,分调整闪烁标志置1

SET4: 等待键按下

JB P3.3,SET3 等待键按下

LCALL DL05S 有键按下,延时0.5S

JNB P3.3,SETHH 按下时间长于0.5S,转调小时状态

MOV R0,#77H按下时间短于0.5S,加1min *** 作

LCALL ADD1 调用加1子程序

MOV A,R3 取调整单元数据

CLR C 消位标志

CJNEA,#60H,HHH 调整单元数据与60比较

HHH:JC SET4 调整单元数据小于60,转SET4循环

LCALL CLR0 调整单元数据大于或等于60时,清0

CLR C 清进位0

AJMPSET4 跳转到SET4循环

CLOSEDIS:

SETBET0省电状态,开T0中断,,LED灯不显示

SETBTR0开启T0中断

CLOSE:

JB P3.3,CLOSE 无键按下,等待

LCALL DISPLAY有键按下,调用显示子程序延时消抖

JB P3.3,CLOSE 是干扰,返回CLOSE等待

WAITH:

JNB P3.3,WAITH 等待键释放

LJMPSTART1 返回主程序,,LED数据显示亮

SETHH: CLR 00H分闪烁标志清除,,进入调小时状态

SETHH1: JNB P3.3,SET5 等待键释放

SETB01H小时调整标志置1

SET6: JB P3.3,SET7 等待键按下

LCALL DL05S 有键按下,延时0.5S

JNB P3.3,SETOUT按下时间长于0.5S,退出时间调整

MOV R0,#79H按下时间短于0.5S,加1h *** 作

LCALL ADD1 调用加1子程序

MOV A,R3

CLR C

CJNEA,#24H,HOUU计时单元数据与24比较

HOUU: JC SET6 小于24,转SET6循环

LCALL CLR0 大于或等于24时,清0 *** 作

AJMPSET6 跳到SET6处循环

SETOUT: JNB P3.3,SETOUT1 调时退出程序.等待键释放

LCALL DISPLAY延时消抖

JNB P3.3,SETOUT是抖动,返回SETOUT再等待

CLR 01H清调小时标志

CLR 00H清调分标志

CLR 02H清闪烁标志

CLR TR1关闭定时器T1

CLR ET1关定时器T1中断

SETBTR0开启定时器T0

SETBET0开启定时器T0中断,,计时开始

LJMPSTART1 跳回主程序

SET1: LCALL DISPLAY键释放等待调时用显示程序

AJMPSET2 防止键按下时无时钟显示

SET3: LCALL DISPLAY等待调分按键时时钟显示用

JNB P3.3,FUNSUB减1分 *** 作

AJMPSET4 调分等待

SET5: LCALL DISPLAY键释放等待调时用显示程序

AJMPSETHH1 防止键按下时无时钟显示

SET7: LCALL DISPLAY等待调小时按键时时钟显示用

JNB P3.3,FUNSUBB 小时减1 *** 作

AJMPSET6 调时等待

SETOUT1:LCALL DISPLAY退出时钟整时键释放等待

AJMPSETOUT 防止键按下时无时钟显示

FUNSUB,分减1程序?

FUNSUB: LCALL DISPLAY延时消抖

JB P3.3,SET41 干扰,返回调分等待

FUNSUB1:JNB P3.3,FUNSUB1 等待键放开

MOV R0,#77H

LCALL SUB1 分减1程序

LJMPSET4 返回调分等待

SET41: LJMPSET4

FUNSUB,时减1程序?

FUNSUBB:LCALL DISPLAY 消抖动

JB P3.4,SET61 干扰,返回调时等待

FUNSUBB1:JNBP3.4,FUNSUBB1

MOV R0,#79H

LCALL SUBB1

LJMPSET6

SET61: LJMPSET6

显示程序

显示数据在70H~75H单元内,用六位LED共阳数码管显示。

扫描控制,每个LED数码管亮1mS时间。

DISPLAY:

MOV R1,#70H 指向显示数据首址

MOV R5,#0DFH 扫描控制字初值

PLAY: MOV A,R5 扫描字放入A

MOV P2,A 从P2口输出

MOV A,@R1 取显示数据到A

MOV DPTR,#TAB 取段码表地址

MOVCA,@A+DPTR 查显示数据对应段码

MOV P0,A 段码放入P0口

MOV A,R5

JB ACC_1,LOOP5 小数点处理

CLR P0.7

LOOP5: JB ACC_3,LOOP6

CLR P0.7

LOOP6: LCALL DL1MS 显示1MS

INC R1指向下一地址

MOV A,R5 扫描控制字放入A

JNB ACC_0,ENDOUT ACC.0=0时,一次显示结束

RR A A中数据循环左移

MOV R5,A 放回R5内

MOV P0,#0FFH

AJMPPLAY 跳回: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

共阳段码表 1、 2、 3、 4、 5、 6、 7、 8、 9、不亮、A、—。

SDISPLAY,上电显示程序

不带小数点,有A、— 显示功能

SDISPLAY:

MOV R5,#0DFH 扫描控制字初值

SPLAY: MOV A,R5 扫描字放入A

MOV P2,A 从P2口输出

MOV A,@R1 取显示数据到A

MOV DPTR,#TABS取段码表地址

MOVCA,@A+DPTR 查显示数据对应段码

MOV P0,A 段码放入P0口

MOV A,R5

LCALL DL1MS 显示1MS

INC R1指向下一地址

MOV A,R5 扫描控制字放入A

JNB ACC_0,ENDOUTS ACC.0=0时,一次显示结束

RR A A中数据循环左移

MOV R5,A 放回R5内

AJMPSPLAY 跳回:PLAY循环.

ENDOUTS:MOV P2,#0FFH 一次显示结束,P2口复位

MOV P0,#0FFH P0口复位

RET 子程序返回

TABS: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH

STAB表,启动时显示2003-12-07、A01-2-28

STAB: DB 0AH,0AH,0AH,0AH,0AH,0AH,08H,02H,0CH,02H,0CH,01H,00H,0BH,0AH,0AH

DB 07H,00H,0CH

DB 07H,00H,0CH,02H,01H,0CH,03H,00H,00H,02H,0AH,0AH,0AH,0AH,0AH,0AH

注:0A不亮,0B显示“A”,0C显示“-”

ST子程序,上电时显示年月日用,采用移动显示

ST: MOV R0,#40H 将显示内容移入40H~50H单元

MOV R2,#20H

MOV R3,#00H

CLR A

MOV DPTR,#STAB

SLOOP:

MOVCA,@A+DPTR

MOV @R0,A

MOV A,R3

INC A

MOV R3,A

INC R0

DJNZR2,SLOOP 移入完毕

MOV R1,#5AH

MOV R3,#1BH 显示27个单元

SSLOOP:

MOV R2,#32H 控制移动速度

SSLOOP1:

LCALL SDISPLAY

DJNZR2,SSLOOP11

MOV A,R1

SUBBA,#07H 显示首址修正为低1个单元

MOV R1,A

DJNZR3,SSLOOP

RET

SSLOOP11:

MOV A,R1指针修正为原值

SUBB A,#06H

MOV R1,A

AJMP SSLOOP1

延时程序

1ms延时程序,LED显示程序用

DL1MS: MOV R6,#14H

DL1:MOV R7,#19H

DL2:DJNZ R7,DL2

DJNZ R6,DL1

RET20MS延时程序,采用调用显示子程序,以改善LED的显示闪烁现象

DS20MS: ACALLDISPLAY

ACALLDISPLAY

ACALLDISPLAY

RET延时程序,用作按键时间的长短判断

DL1S:

LCALLDL05S

LCALLDL05S

RET

DL05S:

MOV R3,#20H8ms*32=0.196s

DL05S1:

LCALLDISPLAY

DJNZ R3,DL05S1

RET

END 程序结束


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12034516.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存