基于89S52单片机的电子时钟的软件设计

[复制链接]
查看11 | 回复1 | 2009-12-8 09:51:33 | 显示全部楼层 |阅读模式
LED BIT P1.0DIS_CLK BIT P3.1DIS_DAT BIT P3.0DIS_EABIT P1.2INT_0 BIT P3.2KEY_ADD BIT P3.4KEY_CLR BIT P3.5;------------------------------DIS_DATA1 DATA 30HDIS_DATA2 DATA 31HDIS_DATA3 DATA 32HKEY2_DELAY1 DATA 33HKEY2_DELAY2 DATA 34HKEY2_DELAY3 DATA 35H;***********************************************************************************************ORG 0000HSJMP STARTORG 0003HLCALL INT0_INTRETIORG 0013HLCALL INT1_INTRETI;-----------------------------------------------START:MOV SP,#50HLCALL INITIAL ; 初始化;;MOV DIS_DATA1,#0;MOV DIS_DATA2,#0;MOV DIS_DATA3,#0LCALL DISPLAY;**************************************************ORG 0050HMAIN:;----------JB KEY_CLR,NO_KEY_CLRMOV KEY2_DELAY1,#100KEY_CLR_CHECK:LCALL DELAY_10MSJB KEY_CLR,NO_KEY_CLRDJNZ KEY2_DELAY1,KEY_CLR_CHECK;LCALL CLEAR_DATA ;;;clr-------------------------------;WATE_KEY_END2:LCALL WARCH_DOG;喂看门狗JNB KEY_CLR,WATE_KEY_END2;NO_KEY_CLR:;--------------LCALL ADD_ONE_BIT;加1-----------------------LCALL DISPLAYLCALL DELAYLCALL DELAYCPL LEDLCALL WARCH_DOG;喂看门狗SJMP MAIN;****************************************************WARCH_DOG:;MOV WDT_CONTR,#00110100B ;喂狗682msMOV WDT_CONTR,#00110101B ;喂狗 1.365s;MOV WDT_CONTR,#00110110B ;喂狗 2.6sRET;-------------;-------------DELAY:;高精度延时0.5s(无中断)DEY1 DATA 1FHDEY2 DATA 1EHDEY3 DATA 1DHMOV DEY1,#16 ;0.05S;167DL1:MOV DEY2,#20 ;3mSDL2:MOV DEY3,#184 ;150uS 6M(5T)DJNZ DEY3,$DJNZ DEY2,DL2DJNZ DEY1,DL1RET;-------------;-------------;*********************************************************ORG 0100H #include"初始化.asm"LJMP START;ORG 0200H#include"中断.ASM"LJMP START;ORG 0300H#include"显示.asm"LJMP START;ORG 0600H#include"加减计数.asm"LJMP STARTINITIAL: ; 初始化CLR TICLR RI;SETB ES;SETB TR1;SETB TR0;SETB ET0SETB IT0SETB EX0SETB IT1SETB EX1SETB EA;;------------------------------RETINT0_INT:LCALL SAVE_DATARET;************************************************INT1_INT:;LCALL SAVE_DATA;RETDISPLAY:MOV DPTR,#LEDTABMOV A,DIS_DATA1MOVC A,@A+DPTR;MOV SBUF,ALCALL DIS_SEND;JNB TI,$;CLR TI;MOV A,DIS_DATA2MOVC A,@A+DPTR;CPL A;MOV SBUF,ALCALL DIS_SEND;JNB TI,$;CLR TI;MOV A,DIS_DATA3MOVC A,@A+DPTR;MOV SBUF,ALCALL DIS_SEND;JNB TI,$;CLR TI;SETB DIS_EAMOV R4,#255DJNZ R4,$CLR DIS_EARETDIS_SEND:MOV R3,#8DIS_RR:CLR DIS_CLKMOV R4,#255DJNZ R4,$RRC AMOV DIS_DAT,CMOV R4,#255DJNZ R4,$SETB DIS_CLKMOV R4,#255DJNZ R4,$DJNZ R3,DIS_RRRET;低位先发送时:LEDTAB: ;共阳(标准)DB 03H,9FH,25H,0DH,99H,49H,41H,1FH,01H,09H,11H,0C1H,63H,85H,61H,71H; 0 1 2 3 4 5 6 7 8 9 A B C
D
E FDB 02H,9EH,24H,0CH,98H,48H,40H,1EH,00H,08H,10H,0C0H,62H,84H,60H,70H;0.1. 2.3.4.5.6.7.8.9.A.B. C.D.E.F. retADD_ONE_BIT:;-----------INC DIS_DATA1MOV A,DIS_DATA1CJNE A,#10,DATA_ADD_ENDMOV DIS_DATA1,#0;INC DIS_DATA2MOV A,DIS_DATA2CJNE A,#10,DATA_ADD_ENDMOV DIS_DATA2,#0;INC DIS_DATA3MOV A,DIS_DATA3CJNE A,#10,DATA_ADD_ENDMOV DIS_DATA3,#0LCALL SAVE_DATA;DATA_ADD_END:;LCALL SAVE_DATALCALL DISPLAY;RET;************************************************CLEAR_DATA:;-----------MOV DIS_DATA1,#0MOV DIS_DATA2,#0MOV DIS_DATA3,#0LCALL DISPLAY;RETEND
回复

使用道具 举报

千问 | 2009-12-8 09:51:33 | 显示全部楼层
PORT
EQU 0CFA0HBUF
EQU 23H
;存放计数值SBF
EQU 22H
;存放秒值MBF
EQU 21H
;存放分值CSEG AT 0000H
LJMP STARTCSEG AT 401BH
LJMP CLOCKCSEG AT 4100HSTART:MOV
sp,#70H
MOV
R0,#40H;40H-45H是显示缓冲区,依次存放
MOV
A,#00H ;分高位、分低位,0A,0A负责“横线”
MOV
@R0,A
;以及秒高位、秒低位
INC
R0
MOV
@R0,A
INC
R0
MOV
A,#0AH
MOV
@R0,A
INC
R0
MOV
@R0,A
INC
R0
MOV
A,#00H
MOV
@R0,A
INC
R0
MOV
@R0,A
MOV
TMOD,#10H;定时器1初始化为方式1
MOV
TH1,#3CH ;置时间常数,延时0.1秒
MOV
TL1,#0AFH
MOV
BUF,#00H ;置0
MOV
SBF,#00H
MOV
MBF,#00H
SETB ET1 ;开定时器1中断
SETB EA ;开中断
SETB TR1 ;启动定时器1DS1:
MOV
R0,#40H
;置显示缓冲区首址
MOV
R2,#20H
;置扫描初值,点亮最左边的LED6DS2:
MOV
A,@R0
;取出第一个待显示数据 MOV
DPTR,#PTRN ;指向段数据表首地址 MOVC A,@A+DPTR;查表,得段数据 MOV
DPTR,#PORT
MOVX @DPTR,A ;输出段数据
MOV
A,R2
;向位数据口P1输出位显码
CPL
A ;取非
MOV
P1,A
MOV
R3,#0FFH ;延时DEL:
NOP
DJNZ R3,DEL
INC
R0
;显示缓冲字节加一 MOV
A,R2 ;读回扫描
CLR
C ;清进位标志
RRC
A
;显码右移一位
MOV
R2,A
JNZ
DS2
;最末一位是否显示完毕?如无则
;继续显示
MOV
R0,#45H ;45H秒低位
MOV
A,SBF
;把秒值分别放于44H,45H中
ACALLGET
DEC
R0
;跳过负责显示"-"的两个字节
DEC
R0
MOV
A,MBF
;把分值分别放入40H,41H中
ACALLGET
SJMP DS1
;转DS1从头显示起
GET:
MOV
R1,A
;把从分或秒字节中取来的值的高
ANL
A,#0FH
;位屏蔽掉,并送入缓冲区
MOV
@R0,A
DEC
R0
MOV
A,R1
;把从分或秒字节中取来的值的低
SWAP A
;位屏蔽掉,并送入缓冲区
ANL
A,#0FH
MOV
@R0,A
DEC
R0
;R0指针下移一位
RETCLOCK:MOV
TL1,#0AFH;置时间常数
MOV
TH1,#3CH
PUSH PSW ;程序状态字入栈 MOV
30H,A
PUSH 30H
INC
BUF
;计数加一
MOV
A,BUF
;计到10否?没有则转到QUIT退出中断
CJNE A,#0AH,QUIT ;因为定时0.1秒,所以10次中断才是1秒
MOV
BUF,#00H;置初值
MOV
A,SBF
INC
A
;秒值加一
DA
A
;经十进制调整后放入秒字节
MOV
SBF,A
CJNE A,#60H,QUIT ;计到60否?没有则转到QUIT退出中断
MOV
SBF,#00H
;是,秒字节清零
MOV
A,MBF
INC
A
;分值加一
DA
A
;经十进制调整后放入分字节
MOV
MBF,A
CJNE A,#60H,QUIT ;分值为60否?不是则退出中断
MOV
MBF,#00H
;是,清零QUIT: POP 30H
;弹栈
MOV A,30H
POP
PSW
RETI
;中断返回PTRN: DB
3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H ;段数据表 END
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行