⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zhongduan.asm

📁 单片机试验:中断实验
💻 ASM
字号:
    ;通信0502  落红
    ;实验六 中断实验(在交通控制的基础上)(主程序和中断服务程序的延时程序独立)
    ;2007.08.12
       C_addr  equ  0000h
       C_1     equ  C_addr+0031h
       C_2     equ   C_addr+0032h
       C_3     equ   C_addr+0032h
          org   C_addr
          ajmp  main
	  org  C_addr+0003h      ;外部中断0入口地址
	  ljmp  inser
          org   C_addr+0060h
main:      mov sp,C_addr+0040h	 ;设置堆栈指针初始值
           setb  ea		;CPU开中断
           setb  ex0		;开外部中断0
	   setb  it0		;设置触发方式为边沿触发

	   mov  dptr,#1b03h    ;写控制字1000 0000B,方式0,输出
           mov  a,#80h
           movx  @dptr,a

  start: lcall red    ;初始状态1234红灯全亮,调用0.5秒延时子程序延时2秒
                mov r0,#4
      del_0:    lcall  delay
                djnz  r0,del_0

  light_13:              ;13路口通行
           mov  r0,#0
           acall  light
  light_24:                ;24路口通行
           inc r0
           acall  light
           ajmp   light_13   ; 上两种状态循环


  light:    ;红绿黄灯亮灭控制
      light_green:  lcall  output    ; 绿灯亮,调用0.5秒子程序,延时5S
                    mov  r1,#10
      del_green:    lcall  delay
                    djnz   r1,del_green

  light_yellow:   mov C_3,r0
                  mov  r1,#8      ; 黄灯闪烁8次,每次亮0.2s,灭0.2s
  yellow_again:   mov  r0,C_3		;暂存r0的值
                   inc  r0
                   lcall  output;黄灯亮
                   lcall  delay1		;两次调用0.1秒延时程序
                   inc r0
		   lcall  output		;黄灯灭
		   lcall  delay1
		   djnz   r1,yellow_again

   light_red:          ;1234红灯全亮,调用0.5秒延时子程序,延时0.5秒
               lcall  red
               lcall  delay
               ret               ;一次循环结束,

red:       mov  dptr,#1b01h         ;1234红灯全亮
	   mov  a,#90h
	   movx  @dptr,a
	   mov  dptr,#1b02h
	   mov  a,#24h
	   movx @dptr,a
           ret
output:   mov  a,r0			 ;输出函数子程序
          mov  dptr,#b_tab
          movc  a,@a+dptr
	  mov   C_1,a         ;保存B口输出变量
          mov  dptr,#1b01h  ;指向B口
          movx  @dptr,a
          mov   a,r0
          mov  dptr,#C_tab
          movc  a,@a+dptr
	  mov   C_2,a	;保存C口输出变量
          mov  dptr,#1b02h  ;指向C口
          movx  @dptr,a
          ret
 delay:  mov  r5,#5    ;0.5秒延时子程序
 d_00:   mov  r6,#200
 d_01:   mov  r7,#126
 d_02:   djnz r7,d_02
         djnz r6,d_01
	 djnz r5,d_00
         ret
 delay1:mov r5,#2	   ;0.2秒延时子程序
 d_10:  mov  r6,#200
 d_11:  mov  r7,#126
 d_12:  djnz  r7,d_12
        djnz  r6,d_11
        djnz  r5,d_10
        ret
inser:  push a           ;相关数据压栈
        push psw
	push  dph
	push  dpl

	lcall  red              ;1234红灯全亮
        mov  r4,#12
d_20:	lcall delay		;延时6秒
        djnz r4,d_20

	mov  a,C_1		 ;恢复原显示状态
	mov  dptr,#1b01h
	movx @dptr,a
	mov  a,C_2
	mov  dptr,#1b02h
	movx  @dptr,a

        pop  dpl
        pop  dph
	pop  psw
	pop  a
	setb  ex0	 ; 外部中断允标志位置位
	reti
   b_tab:  db  0c0h,0a0h,80h,90h,10h,10h,10h,90h
   c_tab:  db  30h,28h,20h,24h,86h,45h,04h,24h
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -