基于51单片机的毫秒定时器使用汇编语言与proteus仿真

   ORG 0000H
   AJMP START
   ORG 0013H
   AJMP INTERRUPT1    ;外部中断1中断服务跳转
   ORG 000BH
   AJMP TIME0INTER    ;定时器0中断服务跳转
   ORG 001BH
   AJMP TIME1INTER    ;定时器1中断服务跳转
   ORG 0100H
START: 
       STCP BIT P0.3  ;高电平将8位数据从移位寄存器发到存储寄存器
       SHCP BIT P0.4  ;高电平时移位寄存器里的数据整体后移,并将一位数据送入移位寄存器
       SER  BIT P0.5  ;串行数据输入
	   MOV R1,#00H    ;计数595的8位计数
	   MOV R2,#0      ;数码管的N位数循环
	   MOV R3,#00H    ;计数停止标志

	   CLR A
	   
	   MOV A,#0AH
	   MOV 48H,A      ;48位置存了9
	
	   MOV A,R1
	   MOV TMOD,#11H  ;设置T0的模式为方式1,16位定时器,仅由TRO触发
	   MOV TH0,#0FCH  ;初值装载
	   MOV TL0,#018H
	   MOV TH1,#0FCH  ;初值装载
	   MOV TL1,#018H
	   SETB IT1       ;设置外部中断1下降沿触发
	   SETB PX1       ;设置外部中断1为最高优先
	   SETB EX1       ;开外部中断1允许位
	   SETB ET0       ;时钟0溢出中断允许
	   SETB ET1       ;时钟1溢出中断允许
	   SETB EA        ;开总中断
	   SETB TR1       ;打开时钟1定时器

MAIN:

	   
	   SJMP MAIN
	   
TIME1INTER:                  ;每一毫秒进入一次完成数码管显示
       PUSH ACC              ;保护现场
	   PUSH PSW
       MOV TH0,#0FCH         ;初值装载
	   MOV TL0,#018H
	   ;两个循环输出秒和毫秒,在最下面有示例
	   MOV R1,#00H    ;计数595的8位计数
	   MOV R2,#0      ;TAB的N位数循环
;	   MOV P0,#07H
	   MOV A,#0
	   MOV R0,#40H;存储秒数地址
SEG3:  ;用于显示8位数码管
	  MOV A,@ R0
	  INC R0
	  MOV DPTR,#TAB
	  MOVC A,@ A+DPTR   ;获得TAB表数据	  
      CJNE R2,#3,LOOP   ;第四位加上小数点
	  ANL A,#7FH
LOOP:
SEG3_1:	                    ;SEG3_1
	  RLC A
	  MOV SER,C
	  SETB SHCP;存一位
	  NOP
	  NOP
	  CLR  SHCP
	  INC R1
	  CJNE R1,#08H,SEG3_1;八位存储的循环      ;SEG3_1
	  MOV R1,#00H
	  SETB STCP         ;存够8位输出
	  NOP
	  NOP
	  CLR  STCP
	  INC R2
	  MOV A,R2
	  CALL DELAY1MS
	  DEC P0
      CJNE A,#8,SEG3  	  ;SEG3	 
      MOV P0,#07H  
SEG5:                                        ;输出最后的关灯
      MOV A,@ R0    ;R0=48,A=10
	  INC R0

	  MOV DPTR,#TAB
	  MOVC A,@ A+DPTR   ;获得TAB表第九位数据,关灯
SEG5_1:	                                     ;LOOP1
                              
      RLC A
	  MOV SER,C
	  SETB SHCP;存一位
	  NOP
	  NOP
	  CLR  SHCP
	  INC R1
	  CJNE R1,#08H,SEG5_1;八位存储的循环      ;LOOP1
	  MOV R1,#00H
	  SETB STCP         ;存够8位输出
	  NOP
	  NOP
	  CLR  STCP
	  CALL DELAY1MS

	   POP PSW
	   POP ACC
	   RETI
	   
INTERRUPT1:               ;外部中断1服务函数
       PUSH ACC           ;保护现场
	   PUSH PSW
	   MOV A,R3           ;R3=0为开启定时器0
	   JNZ COUNTSTOP      ;A不为0跳转计数停止子程序(COUNTSTOP),说明上一次触发中断是启动定时器,
	   SETB TR0           ;打开时钟0定时器 
	   INC R3             ;R3为0则为未计时,将R3 INC为1,
	   POP PSW            ;现场恢复
	   POP ACC
       RETI 	   ;退出
	   
COUNTSTOP:
       DEC R3              ;计数停止位归零
       CLR TR0             ;关闭定时器	   
	   POP PSW
       POP ACC
       RETI 	  

TIME0INTER:                  ;每一毫秒进入一次,处理毫秒和秒
       PUSH ACC              ;保护现场
	   PUSH PSW
       MOV TH0,#0FCH         ;初值装载
	   MOV TL0,#018H
;	   MOV R0,40H
       MOV A,40H             ;毫秒1位
	   INC A
	   MOV 40H,A
	   CJNE A,#10,RETURN
       MOV 40H,#0
;	   INC R0
       MOV A,41H            ;毫秒2位
	   INC A                 ;加一
	   MOV 41H,A
	   CJNE A,#10,RETURN
       MOV 41H,#0 	   ;上一位清零
;	   INC R0
	   MOV A,42H             ;毫秒3位
	   INC A
	   MOV 42H,A
	   CJNE A,#10,RETURN
	   MOV 42H,#0
;	   INC R0
       MOV A,43H            ;秒1位
	   INC A
	   MOV 43H,A
	   CJNE A,#10,RETURN
	   MOV 43H,#0
;	   INC R0
       MOV A,44H              ;秒2位
	   INC A
	   MOV 44H,A
	   CJNE A,#10,RETURN
	   MOV 44H,#0
;	   INC R0
       MOV A,45H              ;秒3位
	   INC A
	   MOV 45H,A
	   CJNE A,#10,RETURN
	   MOV 45H,#0
       MOV A,46H              ;秒4位
	   INC A
	   MOV 46H,A
	   CJNE A,#10,RETURN
	   MOV 46H,#0
       MOV A,47H              ;秒5位
	   INC A
	   MOV 47H,A
	   CJNE A,#10,RETURN
	   MOV 47H,#0
RETURN:
	   POP PSW
	   POP ACC
	   RETI
	   

	
DELAY1MS:			;@12.000MHz
	NOP
	PUSH 30H
	PUSH 31H
	MOV 30H,#10
	MOV 31H,#81
NEXT1:
	DJNZ 31H,NEXT1
	DJNZ 30H,NEXT1
	POP 31H
	POP 30H
	RET
	
TAB:  DB  0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H,0FFH  ;段码表
	

	END
	
	
	

仿真如下:按下按键开始计时,再次按下停止计时,四个灯没用测试用的。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

满城烟雨DLRY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值