这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 8051 请教8051的串行中断

共2条 1/1 1 跳转至

8051 请教8051的串行中断

院士
2006-09-17 18:14:16     打赏
8051 请教8051的串行中断



关键词: 请教     串行     中断    

院士
2006-12-22 22:43:00     打赏
2楼
问    用8051与计算机串行通信,向中断引脚发一中断信号,用示波器已经看出了该信号,不过,8051就是不产生中断,请教各位,这是怎么回事? 1: 不明白这样才能做到“向中断引脚发一中断信号”?我只知道如果有通讯信号,而且串口中断使能有效的话,自然可以进入中断服务程序,我的信息接收和发送功能就一直设计在串口中断服务程序中的,一切正常啊。 2: 他的意思是有中断申请,没有中断响应楼主,你的初始化没有初始化好啊 3: 多谢了  多谢了
  这是我编的程序,请各位帮忙指点一下
        ORG 00H
        SJMP MAIN
        ORG 0003H
        JMP SVR1    ;INT0,P3.2按键响应
        ORG 000BH
        JMP TIMER0  ;T0,按键后延时一小时

        ORG 0023H
        JMP SVR3    ;串行口中断

        F1 BIT 20H.0 ;p3.2每按键一下,f1取反,证明有变化
        F2 BIT 20H.1 ;定时中断跟随
        F3 BIT 20H.2
        F4 BIT 20H.3 ;pc机作用标志,作用后置1
        ORG 0060H

MAIN:   
        MOV P1, #00H         ;初始状态,灯是亮的
        MOV P1, #0FFH
        MOV SP, #40H         ;堆栈
        MOV 54H, #00H        
        CLR F0              ; 按键标志清零
        CLR F4              ;pc机标志清零

;这就是串行口的初始化
       
        MOV TMOD, #20H      ;定时器t1初始化
        MOV TH1, #0F3H      ;方式2
        MOV TL1, #0F3H      ;拨特率2400   
        SETB TR1            ;
        MOV SCON, #50H      ;
        MOV IP,#01H         ;设串行口优先级最高,向下依次是int0,t0,t1
        SETB ES     ;开各个中断
        SETB EA



LOOP:  MOV C, F4
        JC LOOP
        MOV R0,#3      ;闪亮三下
        CLR C    ;
  LOOP1:MOV P3.5, C    ;
        CALL DELAY1    ;
        CPL C          ;
        DJNZ R0,LOOP1  ;
        JNB P2.7, LOOP ; 白天p2.7为低电压,黑天为高
        LJMP SVR2

  ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ;主程序到此
  ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SVR1:   PUSH ACC               ;p3.2脚按键处理
        PUSH PSW               ;
        CLR C
        MOV P3.5, C
        MOV A,54H              ;判断灯此时状态
        CJNE A,#00H,SECOND
   ON : MOV C, F4
        JNC  NEXT1
        JMP RETURN1
NEXT1: CALL DELAY2
        JNB P3.2, $
        MOV 54H, #01H
        MOV P1, #01010101B     ;变为(54h)==#01h,第二状态

        MOV R5, #1H           ;
    A4: MOV R7, #1H          ;判断是否连续按键
    A2: MOV R6, #1H          ;
    A1: JNB P3.2, SECOND       ;若又按,则跳至SECOND
        MOV C, F4
        JNC NEXT2
        JMP RETURN1
NEXT2: DJNZ R6, A1            ;
        DJNZ R7, A2            ;一小段延时
        DJNZ R5, A4            ;
        MOV 54H, #01H          ;没有按,存储该状态,即(54h)=#01h
        CPL F1                 ;完成一次按键,取反f1,做标志
        CALL DELAY3            ;延时一小时
        JMP RETURN1            ;中断返回
SECOND:MOV C, F4
        JNC  NEXT3
        JMP RETURN1
NEXT3: MOV A, 54H        
        CJNE A, #01H, OFF;是第二状态
        CALL DELAY2
        JNB P3.2 , $
        MOV 54H, #0FFH
        MOV P1, #0FFH     ;变第三状态,即(54h)=#02h

        MOV R5, #1H
    B4: MOV R7, #1H
    B2: MOV R6, #1H
    B1: JNB P3.2, OFF       ;规定时间内,又按了一下
        MOV C, F4
        JC  RETURN1
        DJNZ R6, B1
        DJNZ R7, B2
        DJNZ R5, B4
        MOV 54H, #0FFH          ;没有按,存储该状态
        CPL F1                 ;完成一次按键,取反f1,做标志
        CALL DELAY3
        JMP RETURN1
OFF  : MOV C, F4
        JC  RETURN1
        MOV A, 54H
        CJNE A, #0FFH, ON
        CALL DELAY2
        JNB P3.2 , $
        MOV 54H, #00H
        MOV A,#00H
        MOV P1, A

        MOV R5, #4FH
    C4: MOV R7, #0FFH
    C2: MOV R6, #0FFH
    C1: JNB P3.2, GONE
        JMP ON
  GONE: MOV C, F4
        JC  RETURN1
        DJNZ R6, C1
        DJNZ R7, C2
        DJNZ R5, C4
        MOV 54H, #00H   ;没有按,存储该状态
        CPL F1          ;完成一次按键,取反f1,做标志
        CALL DELAY3
       
RETURN1: POP PSW
          POP ACC
          RETI

    ;-------------------
    ;p3.2按键处理
    ;-------------------



;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;光敏输入处理
;;;;;;;;;;;;;;;;;;;;;;;;

SVR2:   CLR C
        MOV P1.5, C
        CALL DELAY4    ; 延时5秒
        JB P2.1, GOTO
        JMP LOOP
GOTO:  MOV A, 54H     ;判断此时灯的状态
        CJNE A, #0FFH, NEXT   ;若已亮,返回
        MOV P1,#00H    ;若已关,开灯!!
  NEXT: LJMP LOOP




;;;;;三个延时程序;;;;;

DELAY1 : MOV R3, #20  
     D1: MOV R4,#20
     D2: MOV R5,#248
         DJNZ R5, $
         DJNZ R4, D2
         DJNZ R3, D1
         RET

DELAY2:  MOV R6, #60    ;
     E2: MOV R7, #248   ;延时30毫秒
         DJNZ R7, $     ;
         DJNZ R6, E2
         RET


DELAY3:  MOV TMOD, #01H ;T0方式1
         MOV 55H, #0AH
         CLR A
         MOV 56H, A    ;“分”清零
         MOV 57H, A    ;“秒”清零
         SETB ET0
         SETB EA
         MOV TH0, #3CH
         MOV TL0, #0B0H
         SETB TR0
         RET


DELAY4 :  MOV R3, #248
     DD1: MOV R4, #248
     DD2: MOV R5, #248
          DJNZ R5, $
          DJNZ R4, DD2
          DJNZ R3, DD1
          RET


     ;-------------------
     ;TO 100ms 中断
     ;-------------------


TIMER0:  PUSH PSW
         PUSH ACC
         CLR C
         MOV P1.5, C
         MOV C, F2   ;
         ANL C, /F1  ;
         MOV F3, C   ;C=(/F1)F2 + F1(/F2)
         MOV C, F1   ;
         ANL C, /F2  ;
         ORL C, F3   ;
         JNC  GOT0 ;若c=1说明f1!=f2,即在按后一小时内又按了一下
         CALL DELAY3  ;则跳至DELAY3,重新开始记时!!!
GOT0:   MOV C, F1    ;
         MOV F2, C    ;使f1==f2,使中断与按键同步,以响应下次按键
         MOV TH0, #3CH  ;置初值
         MOV TL0, #0B0H ;
         DJNZ 55H, RETURN_0 ;不到10次,返回
         MOV 55H, #0AH    ;到10次,重置
         MOV A, #01H
         ADD A, 57H       ;秒加一
         DA A
         MOV 57H, A
         CJNE A, #60, RETURN_0 ;不到60 秒,返回
         MOV 57H, #00H       ;到60秒,(57h) 秒清零
         MOV A, #01H         ;分加一
         ADD A, 56H
         DA A
         MOV 56H, A
         CJNE A, #60, RETURN_0 ;不到60分,返回
         POP ACC             ;到60分,中断结束
         POP PSW
         RETI
RETURN_0: POP ACC          ;中断结束
         POP PSW
         RETI



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;8051接受程序;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;串行口的服务程序

SVR3:  CLR EA    ;关中断
       CLR RI    ;清除中断接收标志
       PUSH ACC
       PUSH PSW
       CLR C
       MOV P1.5, C
       MOV A, SBUF   ;接收pc机发过来的数据
       CJNE A, #3FH, N1  ;判断是否是"?"
       MOV A, 54H        ;是,则将此时灯的状态送至pc机
       MOV SBUF,A        ;发送
    N1:CJNE A, #30H, CASE1  
       MOV P1, #00H      ;是"1"
       SJMP N2
CASE1:CJNE A, #31H, CASE2
       MOV P1, #01010101B
       SJMP N2
CASE2:CJNE A, #32H, CASE3
       MOV P1, #01101101B
       SJMP N2
CASE3:MOV P1, #0FFH  
    N2:SETB F4               ;pc机完成一次控制,做一下标记
       MOV 54H, A            ;存储此时灯的状态
WAIT: JNB TI, WAIT          ;等待发送完毕
       CLR TI                ;软件清零
       POP PSW
       POP ACC
       SETB EA               ;再次开中断
       RETI

       END

 4: 串行口的初始化里面IE没设置

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]