基于51单片机的时钟仿真及程序,实现校时功能
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机汇编语言源程序如下:
- ORG 0000H
- LJMP START
- ORG 000BH ;定时器/计数器T0中断程序入口
- LJMP INTT0
- ////////////////////////////////////////////////////////
- START: MOV R0,#70H
- MOV R7,#0CH
- INIT: MOV @R0,#00H
- INC R0
- DJNZ R7,INIT ;清空70H-7CH中的内容,用于存储时间的各位数
- MOV 72H,#10
- MOV 75H,#10 ;数码管显示中间的横杠,取TAB中的第11个代码
- MOV TMOD,#01H ;定时器方式
- MOV TL0,#0B0H ;初值设定
- MOV TH0,#03CH
- SETB EA ;开中断,启动
- SETB ET0
- SETB TR0
- START1: LCALL SCAN
- LCALL KEYSCAN
- SJMP START1
- DL1MS: MOV R6,#14H ;延时1MS子程序
- DL1: MOV R7,#19H
- DL2: DJNZ R7,DL2
- DJNZ R6,DL1
- RET
- DL20MS: MOV R1,#20
- DL3: LCALL DL1MS ;延时20MS子程序
- DL4: DJNZ R1,DL2
- RET
- //////////////////////////////////////////////////////
- ;数码管显示程序
- SCAN: MOV A,78H ;取秒的个位给70H,十位给71H
- MOV B,#0AH
- DIV AB
- MOV 71H,A
- MOV 70H,B
- MOV A,79H ;取分的个位给73H,十位给74H
- MOV B,#0AH
- DIV AB
- MOV 74H,A
- MOV 73H,B
- MOV A,7AH ;取时的个位给76H,十位给77H
- MOV B,#0AH
- DIV AB
- MOV 77H,A
- MOV 76H,B
- MOV R1,#70H ;从70H-77H循环扫描显示
- MOV R5,#80H
- MOV R3,#08H
- SCAN1: MOV A,R5
- MOV P2,A ;位码赋给P2
- MOV A,@R1 ;从70H储存的秒的个位开始扫描,通过查表将段码赋给P0
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- MOV P0,A
- MOV A,R5
- LCALL DL1MS
- INC R1
- MOV A,R5
- RR A ;位码右移一位
- MOV R5,A
- DJNZ R3,SCAN1 ;8次一个循环
- MOV P2,#00H
- MOV P0,#0FFH
- RET
- TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0BFH
- ;“0~9”,“-”的共阳极字段码
- INTT0: PUSH ACC ;定时器/计数器T0中断服务程序
- PUSH PSW
- CLR ET0
- CLR TR0
- MOV TL0,#0B0H ;重装初值
- MOV TH0,#03CH
- SETB TR0
- INC 7BH ;50ms缓冲单元
- MOV A,7BH
- CJNE A,#14H,OUTT0 ;计满20次50ms单元清零,秒单元加一
- MOV 7BH,#00
- INC 78H ;
- MOV A,78H ;78H存秒单元
- CJNE A,#3CH,OUTT0 ;秒计满60次,分单元加一,秒单元清零
- MOV 78H,#00
- INC 79H ;
- MOV A,79H ;79H存分单元
- CJNE A,#3CH,OUTT0 ;分计满60次,时单元加一,分单元清零
- MOV 79H,#00
- INC 7AH ;7AH存时单元
- MOV A,7AH
- CJNE A,#18H,OUTT0 ;时单元满24清零
- MOV 7AH,#00
- OUTT0:
- SETB ET0
- pop psw
- pop acc
- RETI
- //////////////////////////////////////////////////////////
- ;按键处理程序
- KEYSCAN:JNB P1.0,KEYSCAN0
- JNB P1.1,KEYSCAN1
- JNB P1.2,KEYSCAN2
- KEYOUT: RET
- KEYSCAN0: LCALL DL20MS ;防按键抖动程序
- JB P1.0,KEYOUT
- WAIT0: JNB P1.0,WAIT0 ;k1是高电平则顺序执行,每按一次循环一下7CH计数加一
- INC 7CH
- MOV A,7CH
- CLR TR0
- CLR ET0
- CJNE A,#03H,KEYOUT ;按三次则继续计时,按不到三次则跳转
- MOV 7CH,#00
- SETB TR0
- SETB ET0
- SJMP KEYOUT
- KEYSCAN1: LCALL DL20MS
- JB P1.1,KEYOUT
- WAIT1: JNB P1.1,WAIT1 ;按k2值加一
- MOV A,7CH
- CJNE A,#02H,KSCAN11 ;判断k1,按一次则跳转到时值调整,按两次则顺序执行分值调整
- INC 79H ;分值加一
- MOV A,79H
- CJNE A,#3CH,KEYOUT ;若分值到60,则清零
- MOV 79H,#00
- SJMP KEYOUT
- KSCAN11: INC 7AH ;小时加一
- MOV A,7AH
- CJNE A,#18H,KEYOUT ;若小时满24,则清零
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
时钟程序.zip
(50.17 KB, 下载次数: 41)
|