这是基于单片机的简易数字时钟,能显示秒、分、时。其中第一个按键按下后是时加一,第二个按键按下后是分加一,第三个按键是清零
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机汇编语言程序:
- ;====================================================================
- ; Main.asm file generated by New Project wizard
- ;
- ; Created: 周五 5月
- ; Processor: 80C51
- ; Compiler: ASEM-51 (Proteus)
- ;====================================================================
- $NOMOD51
- $INCLUDE (8051.MCU)
- ;====================================================================
- ; DEFINITIONS
- ;====================================================================
- ;====================================================================
- ; VARIABLES
- ;====================================================================
- ;====================================================================
- ; RESET and INTERRUPT VECTORS
- ;====================================================================
- ; Reset Vector
-
- ORG 0000H;程序开始地址
- LJMP MAIN;跳到MAIN
- ORG 000BH;TO 中断程序入口
- LJMP INTT0;跳到To开始执行程序
- ORG 0100H
- MAIN:
- MOV @R0,#70H;准备7OH-79H 10个字节空间
- MOV R7,#09H
- XIANSHICHUSHIHUA:
- MOV @R0,#00H;将70H-79H初始化为00H
- INC R0
- DJNZ R7,XIANSHICHUSHIHUA
- MOV TMOD,#01H;设To为16位定时器
- MOV TL0,#0B0H;赋初始值
- MOV TH0,#3CH
- SETB EA;CPU开中断
- SETB ET0;允许To中断
- SETB TR0;启动To
- MOV R4,#14H;1S设定初始值
- LOOP:
- LCALL XIANSHI;调用显示程序
- JB P1.0,LOOP1;判断P1.0有无按下
- LCALL HOUR_SET;调用小时设定程序
- AJMP LOOP
- LOOP1:
- JB P1.1,LOOP2;判断P1.1有无按下
- LCALL MIN_SET;调用分设定程序
- AJMP LOOP
- LOOP2:
- JB P1.2,LOOP3;判断P1.2有无按下
- LCALL CLR0;调用清零程序,这里只清零秒
- AJMP LOOP
- LOOP3:
- AJMP LOOP
- HOUR_SET:
- ACALL XIANSHI;调用显示程序
- JNB P1.0,HOUR_SET ;P1.0按下跳到调小时程序
- INC 78H;小时的个位加1
- MOV R6,78H
- CJNE R6,#10,HOUR1 ;个位不为10跳到HOUR1
- MOV 78H,#0;个位清零
- INC 79H;十位加1
- JMP EXIT;跳到EXIT
- HOUR1:
- MOV R6,78H
- CJNE R6,#4,EXIT;个位不为4跳到EXIT
- MOV R6,79H
- CJNE R6,#2,EXIT;十位不为2跳到EXIT
- MOV 78H,#0;小时清零
- MOV 79H,#0
- EXIT:
- RET;调时返回
- MIN_SET:
- CALL XIANSHI;调用显示程序
- JNB P1.1,MIN_SET;P1.1按下跳到调分程序
- INC 76H;分的个位加1
- MOV R5,76H
- CJNE R5,#10,EXIT ;个位不为10 跳到 MIS1
- MOV 76H,#0;个位清零
- INC 77H;十位加1
- MOV R5,77H
- CJNE R5,#6,EXIT;十位不为6跳到MIS1
- MOV 77H,#0;分清零
- MOV 76H,#0
- RET
- INTT0:
- PUSH ACC;入栈,保护现场
- PUSH PSw
- CLR ET0;关闭中观允许
- CLR TR0;关闭中断
- MOV A,#0B7H;中断响应时间同步修正
- ADD A,TL0;低8位初值修正
- MOV TL0 ,A
- MOV A,#3CH;高8位初值修正
- ADDC A,TH0
- MOV TH0,A
- SETB TR0;开启定时器TO
- DJNZ R4,OUT;20 次中断未到中断退出
- ADDS:
- MOV R4,#14H;20次中断到重赋初值
- MOV R0,#71H;指向秒计时单元
- ACALL ADD1;调用ADD1
- MOV A,R3;秒数据放入A
- CLR C;清零进位标志
- CJNE A,#60,ADDMM;秒是否到了60.是则跳转
- ADDMM:
- JC OUT;小雨60秒中断退出
- ACALL CLR0;等于60秒调用 CLRO清零秒
- MOV R0,#77H;指向分计时单元
- ACALL ADD1;调用 ADD1
- MOV A,R3;分数据放入A
- CLR C;清零进位标志
- CJNE A,#60,ADDH;分是否到了60,是则跳转
- ADDH:
- JC OUT;小于60分时中断退出
- ACALL CLR0;等于60分调用 CLRO清零秒
- MOV R0,#79H;指向时计时单元
- ACALL ADD1;调用ADD1
- MOV A,R3;时数据放入A
- CLR C;清零进位标志
- CJNE A,#24H,HOUR ;时是否到了24是则跳转
- HOUR:
- JC OUT;小于24时时中断退出
- ACALL CLR0;调用 CLRO
- OUT:
- MOV 72H,76H;将分的存储地址转移
- MOV 73H,77H
- MOV 74H,78H;将时的存储地址转移
- MOV 75H,79H
- POP PSW;恢复现场
- POP ACC
- SETB ET0
- RETI
- CLR0:
- CLR A;清零A
- MOV @R0,A;清零RO存放地址中的数据
- DEC R0;RO地址减1
- MOV @R0,A
- RET
- ADD1:
- MOV A,@R0;取当前计时单元数据到A
- DEC R0;指向前一地址
- SWAP A;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;取回R3中暂存数据
- INC R0;指向当前地址单元
- SWAP A;A中数据高四位与低四位交换
- ANL A,#0FH;高四位变0
- MOV @R0,A;数据放入当削地址单元中
- RET;子程序返回
- XIANSHI:
- MOV R1,#70H;指向显示数据首址
- MOV R5,#01H;扫描控制字初值
- PLAY:
- MOV A,R5;扫描字放入A
- MOV P2,A;从P2口输出
- MOV A,@R1;取显示数据到A
- MOV DPTR,#TAB;取段码表地址
- MOVC A,@A+DPTR;查显示数据对应段码
- MOV P0,A;段码放入PO口
- LCALL DL1MS;显示1MS
- INC R1;指向下一地址
- MOV A,R5;扫描控制字放入A
- JB ACC.5,ENDOUT ;ACC.5=0时一次显示结束
- RL A;A中数据循环左移
- MOV R5,A;放回R5内
- AJMP PLAY;跳回PLAY循环
- ENDOUT:
- CLR P2.5;一次显示结束,P2口复位
- RET;子程序返回
- TAB:
- DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
- DL1MS: ;1毫秒延时程序
- MOV R6,#14H
- DL1:
- MOV R7,#19H
- DL2:
- DJNZ R7,DL2
- DJNZ R6,DL1
- RET
- END
- ;====================================================================
- ; CODE SEGMENT
- ;====================================================================
- ;====================================================================
-
复制代码
Proteus8.8仿真文件下载:
时钟.zip
(22.74 KB, 下载次数: 39)
|