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.27 ~# w0 W$ v8 g) n
;-----------------------------------------------------------------------------------------------
% L7 \% N" b& i% ~          ORG       0000H2 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       send0 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      ACC7 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,NEXT10 d$ I. Q: }) O+ m6 K
          MOV       A,R0
/ V) X, L7 o) {+ S; Z) k2 b0 JNEXT1:    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_show6 {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# Cdel10:    MOV       R7,#40
6 J! }' c- p3 L; n& c6 Pdel1:     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,del10 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 AinitRS232: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