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

作者&投稿:那科 (若有异议请与网页底部的电邮联系)
用汇编语言编写一个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


如何用C语言编写一个简单的程序!
1、鼠标左键双击c语言软件,打开,打开后界面如图,点击关闭即可 2、点击上方程序窗口左上角的文件,选择新建 3、在打开的窗口中选择文件,下边一般是第四个 c++Source file,输入文件名(hellw.c),一定要以“.c”为后缀结尾 4、进入编辑页面在,页面编辑源代码就可以 includestdio.h void main()...

如何用C语言编写一个简单的计算器?
1、首先在打开的C语言软件窗口中,在Main函数的上方,写上阶乘函数的框架,如下图所示。2、然后定义一个变量【result】,如下图所示。3、然后输入if判断语句,就可以写下程序的关键语句,如下图所示。4、接下来就可以调用输出,如下图所示。5、最后点击运行,如下图所示,就可以运行测试。

怎样用C语言编写一个简单的程序?
int main(){ int a[7]; \/\/ 建立一个 7 元素的数组 int i;int sum = 0;int max = a[0];int min = a[0];\/\/ 手动输入 7 个元素 for (i = 0; i < 7; i++){ printf("请输入第 %d 个元素的值: ", i+1);scanf("%d", &a[i]);} \/\/ 求这 7 个元素的和 for (i...

如何用C语言编写一个简单的计算器?
{ scanf("%d",&m);if ( m != 0 || m!= 1) continue;else{ array[i] = m;i++;} } C语言是一门面向过程的计算机编程语言,与C++、Java等面向对象编程语言有所不同。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运...

写一个简单的程序需要经历哪些步骤?
编写和调试程序的步骤,简而言之,包括:需求分析、设计算法、编写代码、编译运行、测试调试以及维护更新。首先,需求分析是编写程序的第一步,它要求我们明确程序需要完成什么功能,解决什么问题。例如,如果我们要编写一个计算器程序,那么需求分析阶段就需要确定计算器能进行哪些运算,如加减乘除等。其次,...

求以下c语言编程:一个简单的学生成绩管理系统。其中每个学生信息包括学 ...
一个简单的学生成绩管理系统。其中每个学生信息包括学号、姓名、数学成绩、英语成绩、计算机成绩。编写一个菜单程序分别完成以下功能:每个学生的信息使用结构体变量存储。编写函数f... 一个简单的学生成绩管理系统。其中每个学生信息包括学号、姓名、数学成绩、英语成绩、计算机成绩。编写一个菜单程序分别完成以下功能:每个...

简单的C语言编写,求
#include <stdio.h>int main(void){ int m, s = 0; printf("输入里程数:"); scanf("%d", &m); if(m<=0) s=0; else if(m<=3) s=6; else s=6+(m-3)*1; printf("车费:%d\\n", s);...

如何用c语言编写一个程序?
include<stdio.h> int main(){ int i,m=0;for(i=2;i<=100;i+=2) m=m+i;printf("%d\\n",m);return 0;} 或 include int main(){ int i,sum=0;for(i=1;i<=50;i++){ sum=sum+2*i;} printf("2+4+6+…+98+100=%d\\n",sum);return 0;} ...

用C语言编写一个小作品,不用很复杂,但必须是原创,考试作业,谢谢_百度...
用C语言编写一个小作品,不用很复杂,但必须是原创,考试作业,谢谢 20  我来答 3个回答 #热议# 电视剧《王牌部队》有哪些槽点?usstmswg2 2011-06-21 知道答主 回答量:8 采纳率:0% 帮助的人:0 我也去答题访问个人页 关注 展开全部 我这有个教务系统的,你试试#include#include<stdio.h>...

求简单C语言程序代码!
scanf("%d,%d",&m,&n);include<stdio.h> main()int a,b,t=0;scanf("%d %d",&a,&b);if (a

矿区18434695876: 如何用汇编语言编一个8051单片机的电子秒表
冯堵阿奇: AT89S51秒表计C程序( 已测试OK) [日期:2009-01-29] 来源:东哥电子技术网 www.51picavr.com 作者:admin [字体:大 中 小] ;**** ;*标题: 东哥单片机学习网 DG300A 51/AVR开发板演示程序--秒表计C程序 ;*文件: DG002.asm ;*版...

矿区18434695876: 单片机 用汇编编写一个电子秒表 利用STC89C51单片机的T0、T1的定时计数器,来完成对电子秒表设计 -
冯堵阿奇: 按你的要求写了一个,电路图在我的百度空间: http://hi.baidu.com/47okey/blog/item/180367355f735da6d1a2d328.html ;12M晶振 2010 12 21 调试完成 STRT EQU P3.0 STP EQU P3.1 CLRR EQU P3.2 ORG 00H SJMP MAIN ORG 0BH AJMP T0...

矿区18434695876: 用汇编怎么编lcd做一个秒表?
冯堵阿奇: ORG 00H START:ANL p2,#00H ;将数码管显示00 JB P3.2, $ CALL DELAY1 ;跳转消抖程序 JNB P3.5, $ MOV R0, #00 L1: MOV A,R0 ;显示程序 MOV P2, A MOV R5, #10 A1: MOV R6, #200 CALL DELAY ;定时一秒 DJNZ R5, A1 MOV A, ...

矿区18434695876: 汇编程序:电子日历时钟系统程序设计 -
冯堵阿奇: STACK SEGMENT STACK DW 200 DUP (?)STACK ENDSDATA SEGMENT WHOUR DB 0 ;秒表的时、分、秒、毫秒 WMIN DB 0 WSEC DB 0 WMSEC...

矿区18434695876: 求一个程序,微机原理,8086汇编语言,实现一个简单实用功能,如时钟显示 -
冯堵阿奇: ;求一个程序,微机原理,8086汇编语言,实现一个简单实用功能,如时钟显示 ;;在右上角显示时钟,按任一键结束;用MASM5.0编译通过.data segment HH DB 0,0,':' MM DB 0,0,':' SS1 DB 0,0 data ends code segment main proc far ...

矿区18434695876: 汇编语言电子时钟的课程设计 -
冯堵阿奇: ;name: ELECTRONIC CLOCK data segment mess1 db ' ****************ASM ASSIGNMENT**************** ',0ah,0dh db ' ',0ah,0dh db ' ***************ELECTRONIC CLOCK*************** ',0ah,0dh db ' ',0ah,0dh db ' ',0ah,0dh db ' *******Press C or c to ...

矿区18434695876: 单片19秒倒数计时器,汇编语言,程序要简单点的,谢谢了 -
冯堵阿奇: ORG 00HSTART: MOV R0,#20MOV R1,#19 LP0: MOV TMOD,#01H ;定时器方式0MOV TH0,#3CHMOV TL0,#0B0HMOV DPTR,#TABLESETB TR0LP1: JBC TF0,LP2 ;查询方式ACALL DISPAJMP LP1LP2: DJNZ R0,LP0CLR TR...

矿区18434695876: 求52单片机汇编程序,简单的电子钟实现59到0循环显示,倒计时秒表 -
冯堵阿奇: 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 3FH,06H,5BH,...

矿区18434695876: 用单片机80c51或80c52汇编语言设计时间计时器的硬件及相关软件 -
冯堵阿奇: ;实用单片机电子钟的制作;主程序(MAIN),如下:ORG 0000H AJMP MAIN ORG 000BH AJMP TIME ORG 0300H MAIN: mov 20h,#00h MOV 21H,#00H MOV 22H,#00H MOV 23H,#00H MOV IP,#02H ;IP,IE初始化 MOV IE,#82H MOV TMOD,...

矿区18434695876: 求助一个89c51单片机的基础时钟程序,用汇编语言实现. -
冯堵阿奇: 只写中间,开头结尾你懂的MAIN:MOV SP #30H SETB 00# MOV OUT5S,#00H MOV SDATE ,#00H MOV MDATE ,#00H MOV HDATE,#00H MOV TMOD,#21H MOV THO,#3CH MOV TL1,#OFDH MOV TH1,#OFDH MOV SCON,#OCOH MOV PCON ,#00H SETB TR1

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网