找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 1207|回复: 0
打印 上一主题 下一主题

求助单片机在外部中断单方向进行串口传输

[复制链接]

50

主题

340

帖子

3260

积分

五级会员(50)

Rank: 5

积分
3260
跳转到指定楼层
1#
发表于 2009-6-2 22:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您!

您需要 登录 才可以下载或查看,没有帐号?注册

x
小弟是做FPGA/CPLD和一些简单硬件设计的,这两天逼于要写一个单片机程序(没办法,谁知道公司人少!)...可是,委实不会啊!!折腾了半天,参考了不少书籍,好不容易码出了一段~但是调试它愣是没反应!!时间又紧,小弟实在是没办法,只好上论坛来求救~~还望大侠们指点迷津~9 J$ p+ h: S" C2 G3 l
6 t3 T3 z4 I3 D2 {- `, m
   要到达的功能:  80C2051单片机的中断源外接两个按键——当按下键1时把11AA通过串口发送到另一个单片机上;当按下键2时把1199通过串口发送到另一个单片机上...无按键时候等待操作!!
1 X& V4 {: y) |0 h   程序见下:
4 k# Q" i7 C3 v! Y, f          nei_in    EQU       P
3 Y( Q' r/ _* [9 @" @$ t  A+ V          wai_in    EQU       P5 K: T4 S) ^; {5 [) Y8 r. v
          nei_show  EQU       P1.3% q* M& [/ t* C
          wai_show  EQU       P1.40 O* U7 F; w+ b' D# U3 v# a: r
          send      EQU       P1.2
) s/ l7 ^1 {0 M9 m2 v! U; M;-----------------------------------------------------------------------------------------------
$ s/ u) r5 G% X, B          ORG       0000H, h  B( w% m7 d8 d$ s5 X9 P2 l9 v$ s
          AJMP      main                ;跳转至主程序
1 F7 ~, m/ Y4 z% L; t) }, C          ORG       0003H: |3 r  \# m7 H7 g! [( _  Z7 x
          LJMP      f_0                 ;转到外部中断0. v  N2 x7 u+ D
          ORG       0013H5 o2 j; }' `( W5 U
          LJMP      f_1                 ;转到外部中断1
6 u, i% f- ]8 H/ W; T( e+ i          ORG                    0023H
0 u9 }/ m! V0 p1 c, w! J          LJMP            serv                ;串口中断
# \) p; v' n( b;-----------------------------------------------------------------------------------------------4 b- W1 Q* ?" @& y
;主程序
9 J8 M1 c& ]4 E;-----------------------------------------------------------------------------------------------      
1 m- p$ y% T2 {7 g          ORG       0030H               ;主程序开始地址* B" s; ?( X. U
main:     LCALL     initRS232           ;串口初始化
9 Q% g, C; v' A# o          LCALL     init                ;中断初始化
3 J9 @( N( u# [. d$ E          CLR       send
0 J3 G: @; F5 Y, j0 [1 F2 Q          SJMP      $                   ;等待操作         
. a9 l; v* {4 ?- L# H/ m;-----------------------------------------------------------------------------------------------
& J( m6 T' x% U- i/ N& F;外部中断0操作
$ I1 R4 g% T0 U& ]$ s' C0 G! L;-----------------------------------------------------------------------------------------------            4 U2 y6 E" ]3 e% j' w6 P' {$ e
f_0:      PUSH      PSW                 ;保护现场# l& S  z' i  o
          PUSH      ACC" c; B0 p3 I' `% ^( `& k
          NOP                           ;延时等待响应
" |# q  G: e& r1 s          NOP            , v9 [! \6 r- S& t, ~
          SETB      wai_show            ;关闭中断1操作指示灯
' z/ g7 }, Z2 r) R( k6 F4 x& g          NOP
; m9 B. P8 Z' h1 A% ], B          MOV             A,#11H              ;把55H送到累加器
2 y" h* @& s1 J5 i          MOV              SBUF,A              ;送到缓冲区  v' U- T+ ^( D+ y/ p$ E1 S& E
          JNB       TI,$                ;等待发送完成
, u+ Q( _9 N4 M: z0 K6 @& E          CLR       TI                  ;允许再发送. B7 T* q2 \0 S" ~
          MOV              A,#0AAH             ;把AAH送到累加器9 p3 O- V2 O7 l( i  [& t  L" S
          MOV              SBUF,A              ;送到缓冲区+ }- J. h; P5 d0 s1 b* o1 v
          JNB       TI,$                ;等待发送完成
& M/ E; T' q9 O2 h7 F- b: n          CLR       TI                  ;允许再发送& w) e) Q0 y. V2 Y( t/ V* p: G0 }
          NOP              ' \" z% A$ n: ?/ P8 U/ p7 Z
          NOP   
. z7 _9 [8 j" G' U3 J  R+ Y5 _( i4 c          CLR       nei_show            ;点亮中断0操作指示灯            ; \/ e3 e, i9 u3 S. H+ k0 J$ X. t
                SETB      send                ;发送操作已完成标示) d  ]1 F9 M" L7 Z4 f  t8 r  K# P
                POP       ACC
, R7 R6 O8 y  _, d! i' _          POP       PSW
* r8 F' w. Y* n          RETI                            9 {2 [0 d' X, b) v' ?7 }8 X- j
;-----------------------------------------------------------------------------------------------
* S" F+ v* C  x; a1 V;外部中断1操作
/ \# r/ N% l/ J* i/ z;-----------------------------------------------------------------------------------------------     
0 y) u/ K' N& l" K4 N- of_1:      PUSH      PSW                 ;保护现场
1 e, B0 K4 T  i- w          PUSH      ACC
) a3 S4 X+ y' U$ F* w          NOP                           ;延时等待响应" i! I8 K0 T5 [9 Z- U: P! L
          NOP 3 W7 ?, H6 t% C/ B8 ?; |  R
          SETB      nei_show            ;关闭中断0操作指示灯
$ A" d% z( D& k2 H          NOP! b5 F( g0 k1 h. W5 v) }3 ?1 ~1 x
          MOV             A,#11H              ;把55H送到累加器
. z: A" M1 w1 t4 F. K7 s( A          MOV              SBUF,A              ;送到缓冲区6 Y5 h* d3 j5 q7 ^! |3 M4 j0 }
          JNB       TI,$                ;等待发送完成
( N% F6 v# r1 L/ T  z' G# ]          CLR       TI                  ;允许再发送6 f0 N9 F4 @' N! B
          MOV              A,#99H              ;把99H送到累加器
( }8 C) d! O2 R( R+ p          MOV              SBUF,A              ;送到缓冲区
" G! V6 U- z9 G          JNB       TI,$                ;等待发送完成4 _: l3 i- [1 b" {9 O, U+ c
          CLR       TI                  ;允许再发送7 w/ Y" u" u. s' ~6 ?  j' @
          NOP * V' H0 _1 _+ a/ _' O! g) A
          NOP                 
* y0 ?$ l& \, b% `" }$ F! @3 u          CLR       wai_show            ;点亮中断1操作指示灯 2 L3 M8 `& a$ p
                SETB      send                ;发送操作已完成标示% j5 y" t5 k" b
                POP       ACC
7 U& y, ~" X3 e& @, U          POP       PSW5 l3 e. [, Q9 h# Z5 y
          RETI                    3 n- F3 f4 I* t- D
;-----------------------------------------------------------------------------------------------
: U! E" m( h, S# r# D; V$ g0 c  N;串口中断子程序; y6 H* w4 Z  U7 Y% p1 H
;-----------------------------------------------------------------------------------------------% J! S; a$ j+ {4 G) N6 [
serv:     PUSH      PSW
0 g6 A# h" R* @6 H/ J& g* w          PUSH      ACC& f# B! Z4 \% T: p! S7 h$ Z
          NOP
" k9 w8 i* [# N9 n# \5 A          CLR       RI
% Y) G) X9 A: Q) P. q; U          MOV       A,SBUF4 {( {" g, J& j, {! s9 A' ~/ J
          MOV       R0,A
7 x: G0 O( o* n/ |4 I' V          CJNE      A,#11H,NEXT1
4 {( A% i8 [+ z9 Q+ ]" I  X: I. V          MOV       A,R0
$ Q& N7 K. B4 L9 DNEXT1:    CJNE      A,#0AAH,NEXT2" v! ?  ^1 [# j
          CLR       nei_show, ]- Z' s2 s) g+ A
NEXT2:    CJNE      A,#99H,NEXT3
" g  w+ o: x; Y) T          CLR       wai_show) }* n1 ^- s3 d; ?7 q
NEXT3:    POP       ACC# |; L4 d) I8 m1 N. r
          POP       PSW
; E1 r- f- K6 J6 D1 x          RETI+ C: ?! k% f$ W5 E
;-----------------------------------------------------------------------------------------------4 o3 l& [4 j+ T( n, Q/ ?# ?) `3 u
;延时10ms子程序
) R3 `) r: H" s  D;-----------------------------------------------------------------------------------------------
1 ?# i, p/ k! u+ rdel10:    MOV       R7,#40
" ?0 m9 g  ^# B5 E1 @/ {del1:     MOV       R6,#123
! {& Q, ~- v4 I. @' M* c          NOP                  
& ]' O! `$ l* |$ idel2:     DJNZ      R6,del2
: l9 O2 C6 j. R% a          DJNZ      R7,del1
5 l) S" q. X8 x  k( R; V          RET5 F$ {/ T/ x, k# u0 {% B
;----------------------------------------------------------------------------------------------- ) V) P: ^+ V  y5 o! L7 E1 z+ f5 Q1 c3 `! Q
;中断初始化子程序
% V9 @" }+ C! p3 {4 C2 A0 h;-----------------------------------------------------------------------------------------------
! g9 z, R8 `- g) C1 hinit:     SETB      EA                  ;MCU开放中断
9 @- u# T0 R! Y( a3 q; r          SETB      EX0                 ;允许INT0中断! c: g, z$ S$ R+ t- ?7 n& P4 M
          SETB      IT0                 ;设置INT0为边缘触发形式
( J2 i5 q; u6 N          SETB      EX1                 ;允许INT1中断
2 H5 L4 b+ `8 a6 y. z) i. k5 X2 S          SETB      IT1                 ;设置INT1为边缘触发形式
* P' E( w) }5 x% Y          SETB      ES                  ;允许串口中断4 ]0 R( ?  a' p  Z
          RET % m( j! c$ g6 `
;-----------------------------------------------------------------------------------------------
4 W+ k! r$ w6 |;串口初始化子程序
; y) q) t. w: x, @7 O* {- S( S' h;-----------------------------------------------------------------------------------------------   q; `% r- u8 [( r5 w
initRS232:MOV                    TMOD,#20H           ;定时器工作在方式20 L6 ?9 R5 R# I% d* m
          MOV              TH1,#0D0H           ;设置波特率0E8H-2400,0D0H-1200
# R6 t/ f4 Y0 i- c1 ^          MOV       TL1,#0D0H
; `3 S0 M) |" r5 T9 |          MOV       PCON,#80H           CON-电源控制
; }$ g: j( s0 c; x; F! M7 }          SETB      TR1                 ;启动定时器1
  B& M4 n# S8 W7 d! K5 P6 d          MOV       SCON,#0D0H          ;SCON-串行口控制  MODE3 启动串行口接收数据   
) z$ n4 o6 O' r' M. n          RET                           ;返回7 U4 K" {7 ]; i; i0 ?
         
2 F* T" i& E' @& h; j) t          END) V3 l* y5 F* }! Q0 M, Y

5 q# F' W/ b8 c( I: | 现在调试中,灯也不亮(电路中,发光二极管正极接5V电,负极通过上拉电阻接单片机),串口传输也不成功....
! r$ [' e8 J, y* j5 | 另外,小弟个人还怀疑按键的解法有问题。电路中采取独立式键盘一段直接接到中断源上,一端接地。并没有采用电源+上来电阻的形式。我查了下书籍,有的说到,单片机里面有上拉电阻可以这样子接法,但小弟还是怀疑~~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2025-2-3 05:36 , Processed in 0.055608 second(s), 33 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表