共2条
1/1 1 跳转至页
问
用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没设置
这是我编的程序,请各位帮忙指点一下
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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |