EDA365电子工程师网
标题:
求助单片机在外部中断单方向进行串口传输
[打印本页]
作者:
weign
时间:
2009-6-2 22:03
标题:
求助单片机在外部中断单方向进行串口传输
小弟是做FPGA/CPLD和一些简单硬件设计的,这两天逼于要写一个单片机程序(没办法,谁知道公司人少!)...可是,委实不会啊!!折腾了半天,参考了不少书籍,好不容易码出了一段~但是调试它愣是没反应!!时间又紧,小弟实在是没办法,只好上论坛来求救~~还望大侠们指点迷津~
0 f2 w& `+ T5 ~8 ?4 k
/ C$ f0 q& u! l: `' H# p+ ?; u
要到达的功能: 80C2051单片机的中断源外接两个按键——当按下键1时把11AA通过串口发送到另一个单片机上;当按下键2时把1199通过串口发送到另一个单片机上...无按键时候等待操作!!
! \) j1 ~$ Y, j; Q) M
程序见下:
7 Y$ @! i- w2 C" o0 s1 c/ B7 k
nei_in EQU P
# Z6 T' Y, x/ }
wai_in EQU P
/ c$ v1 s# Y( e
nei_show EQU P1.3
# g3 K" U7 G' [; G& G' g# a
wai_show EQU P1.4
) m. }4 W% X+ z. W" F
send EQU P1.2
7 ~# w0 W$ v8 g) n
;-----------------------------------------------------------------------------------------------
% L7 \% N" b& i% ~
ORG 0000H
2 Z& E# f3 `/ E: g; X0 t
AJMP main ;跳转至主程序
- j3 A! C8 s2 X" E) i
ORG 0003H
. ^- m- u* v9 r8 i/ M& s: r; A
LJMP f_0 ;转到外部中断0
+ d7 K1 p1 T, D
ORG 0013H
- S# d8 `) f, y* ~6 F) K
LJMP f_1 ;转到外部中断1
' x T# y0 h2 T u) C
ORG 0023H
0 i, L; \) K0 [5 t
LJMP serv ;串口中断
% Z- D" E* P" b% F" V, y
;-----------------------------------------------------------------------------------------------
: E* G# V8 ]- w. V# B! j; x
;主程序
. W; F0 Y) `, _* |
;-----------------------------------------------------------------------------------------------
3 U9 r+ |. c) c- r% K1 `0 @
ORG 0030H ;主程序开始地址
/ I) A Z8 S, y7 Q
main: LCALL initRS232 ;串口初始化
) ]( E* k! n- o2 P/ w
LCALL init ;中断初始化
2 n+ c! j- ~- m2 L
CLR send
0 Q5 X! ~9 ~& F! A) Q1 \
SJMP $ ;等待操作
! {5 s! A7 Y1 h( Z, p; i
;-----------------------------------------------------------------------------------------------
3 M1 L* a) Y: R) w, n6 _
;外部中断0操作
8 h! \9 B; x& h8 ?
;-----------------------------------------------------------------------------------------------
3 q; t$ H- K+ ]* L8 Y; l$ ` g' n
f_0: PUSH PSW ;保护现场
# z7 p7 x7 [/ i& e* {
PUSH ACC
7 N; ~& o& U5 E* A7 j2 ^, P# x. V
NOP ;延时等待响应
a1 F+ d: L9 c3 q$ o- V e
NOP
: N% O2 a6 g! W3 k( Z6 I9 d
SETB wai_show ;关闭中断1操作指示灯
; \6 e4 {& ]7 s, ?7 X3 V. `. i
NOP
* m; N: |, b/ n9 j a/ y; O
MOV A,#11H ;把55H送到累加器
0 d' }6 a' f8 L$ [
MOV SBUF,A ;送到缓冲区
5 l0 d' A8 B8 \* b( p+ B9 M
JNB TI,$ ;等待发送完成
- _# f! h( w- x( A: v, r1 G
CLR TI ;允许再发送
F! g$ y0 w1 ~8 l6 I+ q9 q
MOV A,#0AAH ;把AAH送到累加器
- N3 J( Q$ N" x q% ~& x$ F! q
MOV SBUF,A ;送到缓冲区
% C3 ?9 s: H- D1 Z* z( F k
JNB TI,$ ;等待发送完成
: R9 }" o3 _* H; h, L
CLR TI ;允许再发送
; O" ]* Y/ t% W' Z
NOP
# I* d! c& U D% v; Q7 ~
NOP
# `! Z) Y- |2 o% w! b& L! x
CLR nei_show ;点亮中断0操作指示灯
) P5 U' K* d j; z4 K: G
SETB send ;发送操作已完成标示
" V7 G- [/ }! h$ [, s4 k9 O$ z
POP ACC
' j6 a/ y5 T2 u; q* X
POP PSW
+ g$ E" m7 R& [
RETI
& {/ r O! D) Z- K
;-----------------------------------------------------------------------------------------------
2 @6 s7 b3 M+ e, M* h Z8 l
;外部中断1操作
1 d- i% }; g$ W$ R+ h) t2 M+ {
;-----------------------------------------------------------------------------------------------
# e6 I" ^4 y, x$ d/ z' ^
f_1: PUSH PSW ;保护现场
+ t# k# |# k) G3 N, B; ]/ C
PUSH ACC
% ]$ L( E$ F. I6 g" O, q. r
NOP ;延时等待响应
/ ?$ q2 Z j& L
NOP
, E" F) v, k9 ^
SETB nei_show ;关闭中断0操作指示灯
9 `5 N8 o4 l u
NOP
7 b2 N" Q* ~8 c* e# g7 n/ x, p. T
MOV A,#11H ;把55H送到累加器
( t. p3 b9 x& h4 v3 d4 u* F% o
MOV SBUF,A ;送到缓冲区
; e+ u% J- p3 V) u
JNB TI,$ ;等待发送完成
) C) {/ N+ a5 ?( V
CLR TI ;允许再发送
8 h8 L9 h7 |6 G7 m! A
MOV A,#99H ;把99H送到累加器
% v1 \# Y% n: V$ G' Y5 V0 _, f8 Q
MOV SBUF,A ;送到缓冲区
4 `9 ^3 d2 e" z" c) T' ]
JNB TI,$ ;等待发送完成
* y; B4 o0 h2 h0 r8 j
CLR TI ;允许再发送
8 ]4 v, I8 w8 z/ P
NOP
; q, @7 Q/ q3 A) e4 o+ J+ g( n/ P
NOP
* v3 C% ^0 @7 V# Q
CLR wai_show ;点亮中断1操作指示灯
- c* P: M, v x8 K
SETB send ;发送操作已完成标示
* C; \4 ]1 _6 _4 Z7 ]
POP ACC
- E9 G# B2 M' B% f& K& e
POP PSW
0 ]5 v4 E* P( `% |7 I+ G Q
RETI
, T: ? T4 w- a0 ^2 h1 L
;-----------------------------------------------------------------------------------------------
+ p% S! E1 M9 T1 c
;串口中断子程序
7 E; D& Q4 I9 g2 u c7 ^
;-----------------------------------------------------------------------------------------------
4 g7 F0 q, j( R
serv: PUSH PSW
4 I- q' ~ n, `. j+ |- y
PUSH ACC
! x: m, _7 g% p' \/ E D- L5 D
NOP
$ |) s2 G( r6 n5 U6 y/ q& F: y
CLR RI
h: C4 d: z- o: j9 o9 N
MOV A,SBUF
- q+ x+ J5 A5 d: i& e- Q: \
MOV R0,A
; w! o* ~6 |* F
CJNE A,#11H,NEXT1
0 d$ I. Q: }) O+ m6 K
MOV A,R0
/ V) X, L7 o) {+ S; Z) k2 b0 J
NEXT1: CJNE A,#0AAH,NEXT2
" l# [/ \9 }& T* u
CLR nei_show
% K6 ?, I9 I4 w. R
NEXT2: CJNE A,#99H,NEXT3
, Z. c0 P3 F, `
CLR wai_show
6 {9 q/ O. T5 W8 z0 [ z
NEXT3: POP ACC
) _( a, R" z# `3 {% O* I
POP PSW
' b# [5 X& A" F+ S' y/ e; r
RETI
1 C+ g! v7 c m1 \
;-----------------------------------------------------------------------------------------------
5 x! u5 F5 z7 E m
;延时10ms子程序
7 H( a9 j) \: Y& x6 U+ G) P) M
;-----------------------------------------------------------------------------------------------
1 P# ?2 @- ^& e& W# C
del10: MOV R7,#40
6 J! }' c- p3 L; n& c6 P
del1: MOV R6,#123
8 j' j' p5 x+ s5 F9 Y5 W
NOP
6 j- @( G2 P. w
del2: DJNZ R6,del2
+ }. T5 o3 h7 u
DJNZ R7,del1
0 r' p# A7 \/ T8 j* R
RET
! M3 t b" d4 c
;-----------------------------------------------------------------------------------------------
+ P A% C' J7 _2 ]' P) i7 s
;中断初始化子程序
* \7 g( ?/ S3 Z
;-----------------------------------------------------------------------------------------------
" o$ [9 }* t6 o' N1 v p0 |" O
init: SETB EA ;MCU开放中断
' ^$ e) c9 V- g, M7 D4 k
SETB EX0 ;允许INT0中断
' a6 S/ n2 G2 `# z
SETB IT0 ;设置INT0为边缘触发形式
/ p' ]5 V- [; [: N
SETB EX1 ;允许INT1中断
+ X0 T3 r8 f+ S
SETB IT1 ;设置INT1为边缘触发形式
5 z) m- p2 a; J) t
SETB ES ;允许串口中断
9 D) a {; C$ X
RET
5 A) r. @# W2 {3 q* O
;-----------------------------------------------------------------------------------------------
2 V3 f0 {; w) p& z
;串口初始化子程序
* u' |1 F, M. a
;-----------------------------------------------------------------------------------------------
0 `& w# q9 H2 A
initRS232:MOV TMOD,#20H ;定时器工作在方式2
$ q! h3 n+ Y* [4 z, _) B
MOV TH1,#0D0H ;设置波特率0E8H-2400,0D0H-1200
7 G" G! H7 B3 J3 N' H3 j
MOV TL1,#0D0H
, m5 T& q& c1 {# z, O. N4 D
MOV PCON,#80H
CON-电源控制
( x9 A6 J2 {* `
SETB TR1 ;启动定时器1
& K( L) \" q' C- I
MOV SCON,#0D0H ;SCON-串行口控制 MODE3 启动串行口接收数据
6 g$ @2 {5 H+ L
RET ;返回
! S1 c8 Q4 Q4 u, ^8 f0 M
+ d. L: g# _6 n) A9 @- w% `% B
END
. _' ]4 q( ~) X* b' s1 W* ~
/ F2 i# F* E- Z3 M
现在调试中,灯也不亮(电路中,发光二极管正极接5V电,负极通过上拉电阻接单片机),串口传输也不成功....
& a: o6 i6 n1 X' O
另外,小弟个人还怀疑按键的解法有问题。电路中采取独立式键盘一段直接接到中断源上,一端接地。并没有采用电源+上来电阻的形式。我查了下书籍,有的说到,单片机里面有上拉电阻可以这样子接法,但小弟还是怀疑~~
欢迎光临 EDA365电子工程师网 (http://bbs.elecnest.cn/)
Powered by Discuz! X3.2