汇编语言编写一个简单的电子秒表

作者&投稿:温朗 (若有异议请与网页底部的电邮联系)
用汇编语言编写一个51单片机程序,实现电子秒表功能~

;================================================================
;功能:本程序实现P0口的对数码管动态显示秒表的分、秒、1/100秒;
; 计时程序由中断服务程序实现,采用定时计数器T0工作方式1;
; P2口实现对数码管的片选功能
;================================================================
;==========================初始化================================
SHUCHU EQU P2 ;定义P0口为输出口
PIANXUAN EQU P1 ;定义P2口为片选口
MIAO EQU 30H
FEN EQU 31H
MIAO0 EQU 32H
SHUZI EQU 33H
C_0 BIT 20H.0
;======================系统程序开始==============================
ORG 00H
LJMP START
ORG 03H
LJMP ON_OFF
ORG 0BH
LJMP T0_1
ORG 13H
LJMP RESET
ORG 30H
START:
CALL INIT
SETB C_0
MOV MIAO,#00
MOV MIAO0,#00
MOV FEN,#00
MOV DPTR,#TAB
MOV R2,#5
MAIN:
JNB C_0,$
CLR C_0
LL: CALL DISPLAY
CALL SHIJIAN
JMP MAIN
;========================时间子程序=============================
;输入:"30H、31H、32H"
;输出:无
;实现的功能:分、秒、百分之秒的计算。
;===============================================================
SHIJIAN:
DJNZ R2,TIAOCHU
MOV R2,#5
INC MIAO0
MOV R3,MIAO0
CJNE R3,#100,TIAOCHU
MOV MIAO0,#00
INC MIAO
MOV R3,MIAO
CJNE R3,#60,TIAOCHU
MOV MIAO,#00
INC FEN
MOV R3,FEN
CJNE R3,#60,TIAOCHU
MOV FEN,#00
TIAOCHU:RET
;========================显示子程序=============================
;输入:"A"
;输出:"P2口"
;实现的功能:显示秒、分、百分之妙
;===============================================================
DISPLAY:MOV SHUZI,MIAO0
CALL JISUAN
MOVC A,@A+DPTR
MOV SHUCHU,A ;显示十位
MOV PIANXUAN,#10H ;片选
CALL DELAY
MOV PIANXUAN,#00H

MOV A,B
MOVC A,@A+DPTR
MOV SHUCHU,A ;显示个位
MOV PIANXUAN,#20H ;片选
CALL DELAY ;延时
MOV PIANXUAN,#00H

MOV SHUZI,MIAO
CALL JISUAN
MOVC A,@A+DPTR
MOV SHUCHU,A ;显示十位
MOV PIANXUAN,#04H ;片选
CALL DELAY
MOV PIANXUAN,#00H

MOV A,B
MOVC A,@A+DPTR
MOV SHUCHU,A ;显示个位
MOV PIANXUAN,#08H ;片选
CALL DELAY ;延时
MOV PIANXUAN,#00H

MOV SHUZI,FEN
CALL JISUAN
MOVC A,@A+DPTR
MOV SHUCHU,A ;显示十位
MOV PIANXUAN,#01H ;片选
CALL DELAY
MOV PIANXUAN,#00H

MOV A,B
MOVC A,@A+DPTR
MOV SHUCHU,A ;显示个位
MOV PIANXUAN,#02H ;片选
CALL DELAY ;延时
MOV PIANXUAN,#00H
RET
;========================计算子程序=============================
;输入:30H
;输出:"A和B"
;实现的功能:把33H中的数据十位和个位分离出来
;===============================================================
JISUAN:MOV A,SHUZI ;数据放在A中
MOV B,#10 ;除数放在B中
DIV AB ;商放在A中,余数放在B中
RET
;====================复位中断服务程序============================
;输入;无
;输出: 无
;实现的功能:把30H、31H、32H中的数据清零。
;================================================================
RESET:PUSH ACC
MOV 30H,#00H
MOV 3H,#00H
MOV 32H,#00H
CALL DELAY
POP ACC
RETI
;====================启停中断服务程序============================
;输入;无
;输出: 无
;实现的功能:关闭定时器
;================================================================
ON_OFF:CPL TR0
CALL DELAY
RETI
;====================定时中断0服务子程序========================
;输入:无
;输出:无
;实现的功能:实现定时20MS,影响标中断志位C_0
;===============================================================
T0_1:MOV TL0,50H ;设置定时初值
MOV TH0,51H
SETB C_0 ;定时标志位清0
RETI
;========================中断设置子程序=========================
;输入:无
;输出:无
;实现的功能:初始化设置定时器,设置初值,开中断0、中断1,定时器0.
;===============================================================
INIT:MOV TMOD,#01H ;定时器0工作方式1
MOV DPTR,#65536-20000
MOV 50H,DPL
MOV 51H,DPH
MOV TL0,50H ;设置定时初值
MOV TH0,51H
MOV IE,#87H ;开定时器中断0
MOV TCON,#15H
RET
;======================延时程序==================================
;输入;无
;输出: 无
;实现的功能:延时一段时间
;================================================================
DELAY:MOV R6,#80
L7:MOV R5,#60
L8:DJNZ R5,$
DJNZ R6,L7
RET
;======================共阳查表数据==============================
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
;===========================结束=================================
END

秒表可以用定时器来实现,举例如下:

KEYVALEQU 30H
DATEQU 33H
SCANLEDEQU 39H
CLKEQU 77H
SECEQU 78H
SEC1EQU 79H
SEC2EQU 7AH
DOTBIT 00H
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP EXTINT0
ORG 000BH
LJMP T0ISR;50ms定时
ORG 001BH
LJMP T1ISR;扫描显示
ORG 0030H
MAIN:
MOV SP,#5FH
MOV TMOD,#11H
MOV TH0,#03CH
MOV TL0,#0B0H
MOV TH1,#0ECH
MOV TL1,#078H
MOV KEYVAL,#2
MOV 33H,#10H
MOV 34H,#10H
MOV 35H,#10H
MOV 36H,#10H
MOV CLK,#0
SETB IT0
SETB EX0
CLR TR0
CLR ET0
MOV R2,#0
SETB TR1
SETB ET1
SETB EA
LOOP:
MOV A,KEYVAL
LOOP1:
JNZ LOOP2;启动
SETB TR0
SETB ET0
SJMP LOOP
LOOP2:
DEC A
JNZ LOOP3;暂停
CLR TR0
CLR ET0
SJMP LOOP
LOOP3:
DEC A
JNZ LOOP;清零
MOV 36H,#0
MOV 35H,#0
MOV 34H,#0
MOV 33H,#0
SJMP LOOP
EXTINT0:
PUSH ACC
INC KEYVAL
MOV A,KEYVAL
CJNE A,#3,EXT00
EXT00:
JC EXT01
MOV KEYVAL,#0
EXT01:
POP ACC
RETI
T0ISR:
PUSH ACC
CLR TR0
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
INC CLK
MOV A,CLK
CJNE A,#2,T0ISRE
MOV CLK,#0
INC 36H
MOV A,36H
CJNE A,#10,T0ISRE
MOV 36H,#0
INC 35H
MOV A,35H
CJNE A,#10,T0ISRE
MOV 35H,#0
INC 34H
MOV A,34H
CJNE A,#6,T0ISRE
MOV 34H,#0
INC 33H
MOV A,33H
CJNE A,#10,T0ISRE
MOV 33H,#0
T0ISRE:
POP ACC
RETI
T1ISR:
PUSH ACC
CLR TR1
MOV TH1,#0ECH
MOV TL1,#78H
SETB TR1
MOV DPTR,#LEDTAB
T100:
MOV R0,#DAT
MOV A,SCANLED
ADD A,R0
MOV R0,A
MOV A,SCANLED
JNZ T101
MOV P2,#01H
SETB DOT
SJMP T1DIS
T101:
DEC A
JNZ T102
MOV P2,#02H
CLR DOT
SJMP T1DIS
T102:
DEC A
JNZ T103
MOV P2,#04H
SETB DOT
SJMP T1DIS
T103:
MOV P2,#08H
CLR DOT
T1DIS:
MOV A,@R0
MOVC A,@A+DPTR
JNB DOT,T1DIS1
ORL A,#01H
T1DIS1:
CPL A
MOV P0,A
INC SCANLED
MOV A,SCANLED
CJNE A,#4,T1END
MOV SCANLED,#0
T1END:
POP ACC
RETI
LEDTAB:DB 0FCH;"0"00H
DB 60H;"1"01H
DB 0DAH;"2"02H
DB 0F2H;"3"03H
DB 66H;"4"04H
DB 0B6H;"5"05H
DB 0BEH;"6"06H
DB 0E0H;"7"07H
DB 0FEH;"8"08H
DB 0F6H;"9"09H
DB 0EEH;"A"0AH
DB 3EH;"B"0BH
DB 9CH;"C"0CH
DB 7AH;"D"0DH
DB 9EH;"E"0EH
DB 8EH;"F"0FH
DB 00H;" "10H
END

S_SEG SEGMENT STACK
DB 256 DUP(?)
S_SEG ENDS
D_SEG SEGMENT
COUNT DB 0 ;计时单元,初值为0
TENM DB ‘ 0’ ;10分计时单元,初值为0
MINUTE DB ‘0:’ ;分计时单元,初值为0
TENS DB ‘0’ ;10秒计时单元,初值为0
SECOND DB ‘0.’ ;秒计时单元,初值为0
HAOM DB ‘0’ ;10毫秒计时单元,初值为0
HAO DB ’8’,’$’ ;毫秒计时单元,初值为8
D_SEG ENDS
C_SEG SEGMENT
ASSUME CS:C_SEG ,SS:S_SEG
START: MOV AX,D_SEG
MOV DS,AX
CLI ;先关中断,以获得INT1CH
MOV AX,351CH ;调用35H号系统功能
INT 21H ;返回ES:BX=中断向量(段:偏移)
PUSH BX ;栈中保存INT1CH原中断向量
PUSH ES
STI ;开中断,以使键盘工作
MOV AH,1 ;等待键按下
INT 16H
CLI ;关中断
MOV DX,SEG TIMER ;置新中断向量
MOV DS,DX
MOV DX,OFFSET TIMER ;DS:DX=新中断向量(段:偏移)
MOV AX,251CH
INT 21H
STI ;再开中断,以使键盘和INT1CH工作
CHECK: MOV AH ,1 ;检查有无键代码
INT 16H
JZ DISPLAY1 ;无码可读,就跳转显示(DISPLAY系统保留)]
MOV AH ,0 ;无码可读,就要读取它
INT 16H
CMP AL ,51H ;是’Q’吗
JE OVER ;是,返回DOS
DISPLAY1: MOV AX,D_SEG ;不是,就显示
MOV DS ,AX
ASSUME DS:D_SEG
LEA DX ,TENM ;DS:DX=显示字符串地址
MOV AH ,9 ;显示 mm :ss.msms
INT 21H
JMP CHECK ;返回CHECK,循环继续
OVER: CLI
POP DS ;由栈中取回INT1CH原向量
POP DX
MOV AX ,251CH ;设置INT1CH,恢复原向量
INT 21H
STI ;开中断
MOV AX ,4C00H ;返回DOS
INT 21H
;以下为使用INT 1CH的中断服务子程序
TIMER PROC FAR
PUSH AX
MOV AX , D_SEG
MOV DS , AX
ASSUME DS :D_SEG
INC COUNT ;计时单元增1
CMP COUNT , ‘2’ ;到110毫秒否
JL EXIT ;不到,则返回
MOV COUNT , ‘0’ ;到,则计时单元清0
INC HAOM ;10毫秒计时单元增1
CMP HAOM ,’9’ ;到1秒否
JLE EXIT ;不到,则返回
INC SECOND ;到,则秒计时单元增1
MOV HAOM , ‘0’ ;10毫秒计时单元清0
CMP SECOND ,‘9’ ;到10秒否
JLE EXIT ;不到,则返回
MOV SECOND ,‘0’ ;到,则秒计时单元清0
INC TENS ;10秒计时单元增1
CMP TENS ,‘6’ ;到60秒否
JL EXIT ;不到,则返回
MOV TENS ,‘0’ ;到 ,则10秒计时单元清0
INC MINUTE ;分计时单元清0
CMP MINUTE ,‘9’ ;到10分 否
JLE EXIT ;不到,则返回
MOV MINUTE ,‘0’ ;到,则分计时单元清0
INC TENM ;10分计时单元增1
CMP TENM ,‘6’ ;到60分否
JL EXIT ;不到,则返回
MOV TENM ,‘0’ ;到,则10分计时单元清0,重新开始计时
EXIT: POP AX
IRET
TIMER ENDP
C_SEG ENDS
END START

求一个用汇编语言编写时钟的程序,只要能在pc机上显示时分秒就行,时间紧...
答:in al,71h mov ah,al mov cl,4 shr ah,cl and al,00001111b add ah,30h add al,30h mov bx,0b800h mov es,bx mov byte ptr es:[0],ah mov byte ptr es:[1],01001111b mov byte ptr es:...

...管动态显示的1-100秒的倒计时程序 最好是汇编语言
答:这是99秒倒计时汇编程序:ORG 0000H LJMP MAIN ORG 000BH LJMP T0ISR ORG 0030H MAIN:MOV TMOD,#01H MOV TH0,#HIGH(65536-10000)MOV TL0,#LOW(65536-10000)SETB ET0 SETB EA MOV R0,#9 MOV R1,#9 MOV R2,#0 MOV R3,#9 CLR 00H CLR 01H LOOP:JB P1.0,LP01 JNB P1.0,SET...

求一个汇编语言课程设计的MASM32时钟的程序
答:int digitsec(double); /*将double型的秒钟数转换成int型*/void digitclock(int,int,int ); /*在指定位置显示时钟或分钟或秒钟数*/void drawcursor(int); /*绘制一个光标*/void clearcursor(int);/*消除前一个光标*/void clockhandle(); /*时钟处理*/double h,m,s; /*全局变量:小时,分,秒*/...

急求:单片机程序:两位数码管记秒【加分】;用汇编语言编写
答:我前几天刚做一个,用的是51单片机,12MHZ的晶振,2个共阴的数码管,ORG 0030H MAIN:JB P3.7,LCALL DELAY JB P3.7,STA: MOV R1,#00 STA1:LCALL DELAY1S INC R1 MOV A,R1 MOV B,#10 DIV AB MOV DPTR,#TAB MOVC A,@A+DPTR MOV P1,A MOV A,B MOVC A,@A+DPTR MOV P2,A M...

利用8086汇编语言做一个电子时钟·可以修改日期和时间的·12H/24H能...
答:好像有点困难。

求大神帮忙说一下这个电子钟的程序详细说明解释(汇编语言的)
答:INCR1 ;转为秒内存地址(32H)INC@R1 ;秒计数内存加1CJNE@R1,#60,ExitInt1 ;不够60秒,退出MOV@R1,#0 ;够60秒,秒计数复位为0INCR1 ;转为分计数内存地址(33H)INC@R1 ;分计数

跪求用汇编语言编写的七段数码显示管60秒倒计时程序!!
答:ORG 0000H JMP BEGIN ORG 000BH LJMP T0INT ORG 001BH LJMP T1INT LEDD EQU 30H LEDC EQU 36H SECC EQU 37H TCNT EQU 3AH ORG 0030H ;--- TABLE: ; 共阴极数码管显示代码表 DB 0FCH ;"0" 00H DB 60H ;"1" 01H DB 0DAH ;"2" 02H DB 0F2H ;"3" 03H DB 66H...

单片机课设之数显电子钟(汇编语言)
答:SETB ET1 SETB TR1 LOOP:LCALL KEYSEL MOV A,KEYVAL CJNE A,#0FFH,LOOP1 SJMP LOOP LOOP1:CJNE A,#10,LOOP2;“ON”启动 SETB TR0 SETB ET0 SETB PAUSE SJMP LOOP LOOP2:CJNE A,#11,LOOP3;“=”清零 MOV SEC,#0 MOV MIN,#0 MOV HOUR,#0 LCALL DISCHG SJMP LOOP LOOP3:CJNE A,...

单片机。用汇编语言编程。 设计一软件延时1s的子程序。设晶振频率为12M...
答:LOOP: DJNZ R7,LOOP NOP DJNZ R6,LOOP NOP DJNZ R5,LOOP NOP RET 本回答由提问者推荐 举报| 答案纠错 | 评论(1) 4 0 藏在水中的人 采纳率:62% 来自:芝麻团 擅长: 工程技术科学 汇编语言 其他编程语言 嵌入式 其他回答 delay1000ms:(HT46R65的单片机)(注意不要开启计时中断允许位) mov a,...

用汇编语言设计89C51 1%100秒计时器设计
答:已经修改了,50us的定时,定时处理取反P1.0,得到100us的方波。ORG 0000H SJMP MAIN ORG 000BH ;定时器0中断入口 SJMP INT0_PRO MAIN:MOV TMOD,#01H ;以下5条是初始化定时器0,使得50us中断一次 MOV TH0,#0FFH MOV TL0,#0CEH MOV IE,#82H SETB TR0 SJMP $ ;在这里等待中断...