找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

50

主题

340

帖子

3260

积分

五级会员(50)

Rank: 5

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

EDA365欢迎您!

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

x
小弟是做FPGA/CPLD和一些简单硬件设计的,这两天逼于要写一个单片机程序(没办法,谁知道公司人少!)...可是,委实不会啊!!折腾了半天,参考了不少书籍,好不容易码出了一段~但是调试它愣是没反应!!时间又紧,小弟实在是没办法,只好上论坛来求救~~还望大侠们指点迷津~$ I- b7 s$ Q; P# ^' m; ^! f
. Y6 X6 }' q1 T1 m" J  f) z& n; n+ t
   要到达的功能:  80C2051单片机的中断源外接两个按键——当按下键1时把11AA通过串口发送到另一个单片机上;当按下键2时把1199通过串口发送到另一个单片机上...无按键时候等待操作!!
0 `' {+ R( R: V# v% p$ `+ w- C. u   程序见下:; x7 C* k3 i: d4 N
          nei_in    EQU       P
' q6 U; |! I& [9 W5 m' S  \" J          wai_in    EQU       P
7 k' P$ o/ c, }4 I8 W5 \! G  l: y          nei_show  EQU       P1.30 H1 E# b# @. {( X! ~. Q
          wai_show  EQU       P1.4
  d# J5 W# L' w- `3 o: U. r          send      EQU       P1.2, A+ f; Q5 i7 }9 u# N# `5 I( [9 ?7 j; j
;-----------------------------------------------------------------------------------------------! ~; d, w8 Q1 e% y2 H
          ORG       0000H, @8 z: a! `3 L6 t
          AJMP      main                ;跳转至主程序
0 r5 W9 ^! W$ I" m3 z+ c5 R% m5 B          ORG       0003H, w, E* h+ N$ F% ~, `1 o; ~
          LJMP      f_0                 ;转到外部中断0: l1 p: U- K8 q* n/ Y
          ORG       0013H# \; T* _: d  g3 f6 l* f4 c) F
          LJMP      f_1                 ;转到外部中断1
- A( b5 s8 f1 D. e+ O$ @          ORG                    0023H
2 q. |; r$ r9 w# l" O7 V3 C          LJMP            serv                ;串口中断
" k8 f4 ]7 c. p4 H( A' L- g;-----------------------------------------------------------------------------------------------! [' W. g1 p5 c  t. w0 H7 [9 p
;主程序
' j; D' r6 B6 F" J5 {; E/ [6 Z3 v;-----------------------------------------------------------------------------------------------      
+ o( N- V& M/ p: x! B7 h          ORG       0030H               ;主程序开始地址6 c' y8 u" R  E% k; a1 w. Q
main:     LCALL     initRS232           ;串口初始化! Z% n/ v5 d' [. R( f" D+ v$ T
          LCALL     init                ;中断初始化
1 ~! v) T0 C/ A+ {, P+ K          CLR       send
* G2 r. f7 ~1 a  U          SJMP      $                   ;等待操作          9 M0 w2 c3 ~# ~1 M1 r
;-----------------------------------------------------------------------------------------------
6 U# I- A& K8 S0 G;外部中断0操作. u9 p7 ~. f4 s- U+ S. V
;-----------------------------------------------------------------------------------------------            6 ]; s4 f( Q8 O9 e
f_0:      PUSH      PSW                 ;保护现场
* I/ q) S: {8 B: [) l          PUSH      ACC$ ~9 Z/ e2 g- j# Q
          NOP                           ;延时等待响应
. n/ t6 A7 i9 o& l! Q          NOP            
; x& K2 n& p9 }5 N5 S          SETB      wai_show            ;关闭中断1操作指示灯* L' F" w) ?) M, e2 I
          NOP6 D& d8 a( Y" M8 Y
          MOV             A,#11H              ;把55H送到累加器4 q8 n) R' k9 k: h* D. _
          MOV              SBUF,A              ;送到缓冲区% n4 l# Y) j5 _9 a. c& F4 c; L
          JNB       TI,$                ;等待发送完成
/ ^0 O& e2 Z6 l9 G1 o6 C          CLR       TI                  ;允许再发送# \) D/ w1 h9 e- M
          MOV              A,#0AAH             ;把AAH送到累加器, E, Y8 \* s  k( F: s. w! q9 [
          MOV              SBUF,A              ;送到缓冲区
0 F8 @% [# [' U# X) Z- G: U. `* W          JNB       TI,$                ;等待发送完成" k0 e2 v$ L: ^
          CLR       TI                  ;允许再发送, D5 q2 d- i4 o6 |
          NOP              
  A3 F! J7 Q3 W! H' x- z7 h          NOP    8 \% H6 a" u" V! s( U+ ^' U
          CLR       nei_show            ;点亮中断0操作指示灯            # v! X: [, y: ?$ l  T3 I
                SETB      send                ;发送操作已完成标示; ~& X7 W" P7 a& X& z
                POP       ACC) T2 P7 v! U) P) C
          POP       PSW" h. v! Y; C7 l4 E
          RETI                            * N3 |& m8 M! ]  ^5 E
;-----------------------------------------------------------------------------------------------
2 p0 b6 ]5 \0 C;外部中断1操作
' X! Q' g4 z. P' j- @;-----------------------------------------------------------------------------------------------     
& W0 Y$ A  m+ S2 ^f_1:      PUSH      PSW                 ;保护现场
3 l- V  O( q$ B, g          PUSH      ACC& K9 X3 n; H- Q6 [! [* p
          NOP                           ;延时等待响应# A' Z0 i9 n; ^  _
          NOP
8 }: \8 _5 z0 u. D          SETB      nei_show            ;关闭中断0操作指示灯
& r5 |" }8 y. D* E          NOP' a; H% S7 a  y* ^/ C
          MOV             A,#11H              ;把55H送到累加器
2 r, S& i  Q% o2 }/ [          MOV              SBUF,A              ;送到缓冲区( H# [; ]# r6 F) V9 m4 _7 F; q5 |: V
          JNB       TI,$                ;等待发送完成9 ]. M/ B2 |$ a" d- x1 ~! F3 F
          CLR       TI                  ;允许再发送+ f# I3 L6 n9 @  g
          MOV              A,#99H              ;把99H送到累加器
0 Q" y6 Q( Z4 B& R2 _          MOV              SBUF,A              ;送到缓冲区
# d& s% }( ~0 i          JNB       TI,$                ;等待发送完成
8 {+ C8 `: l% x7 F) p# U          CLR       TI                  ;允许再发送2 w. {) W- B9 f
          NOP
3 z8 }" F1 @+ `* R1 M6 S( L          NOP                  + P: \6 W* k" u$ h" j" Y* e. w  w
          CLR       wai_show            ;点亮中断1操作指示灯
0 w" Z" F# l$ Q9 ^. R                SETB      send                ;发送操作已完成标示
/ p. z" A% j4 c: Z. j                POP       ACC, H! P- k0 q: O/ |' ~
          POP       PSW
+ i. F4 e) c" S* _& h. d          RETI                    , Q+ R4 e& k) K. ]# @
;-----------------------------------------------------------------------------------------------
8 X5 T2 [, @$ J( n;串口中断子程序) r& D5 e( v0 p6 s% k
;-----------------------------------------------------------------------------------------------4 P: s5 \8 J# W6 t5 Y# o0 c, G3 A. P
serv:     PUSH      PSW
6 j# \& z% W% v1 ~; M# a          PUSH      ACC* P6 V/ R+ @' O+ B" Q
          NOP
! e, ?9 Q& W4 [7 j1 T7 L( Q          CLR       RI
* o4 `7 t2 c) s8 G          MOV       A,SBUF8 n! T: x* F- P6 \+ A) ?
          MOV       R0,A
7 O' b8 v; v" U. J. t" I; Z2 }          CJNE      A,#11H,NEXT1
1 Q" ^. ?: H7 `          MOV       A,R00 @( W3 n) e1 A! `/ Z/ c8 X
NEXT1:    CJNE      A,#0AAH,NEXT2
% |, E& |( P+ U5 `- ?          CLR       nei_show
/ R8 D. M  @- O$ O% B2 ZNEXT2:    CJNE      A,#99H,NEXT3" d9 e" y4 h6 [1 b. j! l
          CLR       wai_show' s1 {% f. p2 E* Z( f! }
NEXT3:    POP       ACC# J/ C! b% ]& \% ?1 x
          POP       PSW
# V2 u( C, _: K, c) H$ e          RETI
/ u) ^  D2 v) o; Q+ o;-----------------------------------------------------------------------------------------------( M9 a' t' T, k6 U/ y4 e& W
;延时10ms子程序9 V. Z9 d7 J8 G& @( S& A
;-----------------------------------------------------------------------------------------------1 O& L0 u6 i) |# z" u- P- I
del10:    MOV       R7,#403 M$ h. T, m9 B- B' [
del1:     MOV       R6,#123
) ^( p  z. S$ ^# _9 w4 Z. v          NOP                  + [, V, B$ b$ q5 ^$ }8 J
del2:     DJNZ      R6,del20 N8 {+ Y$ z: m( f5 h9 f& j
          DJNZ      R7,del1
- i9 ]) s- F% M( N& ]7 w# a          RET  \5 o3 ^: E! p- w' j
;----------------------------------------------------------------------------------------------- 9 z6 K8 I9 j' s' q3 \
;中断初始化子程序
$ x$ i8 X% u" |+ C;----------------------------------------------------------------------------------------------- ! p) H; Y* i& U& J( k9 t
init:     SETB      EA                  ;MCU开放中断
+ G& t! B! p6 }% U          SETB      EX0                 ;允许INT0中断0 K7 |7 Z& S- Y3 O: v6 E( a9 x1 }
          SETB      IT0                 ;设置INT0为边缘触发形式
+ \( q# }3 F* V3 {          SETB      EX1                 ;允许INT1中断' n8 U, N7 N4 I+ R% @+ T7 P
          SETB      IT1                 ;设置INT1为边缘触发形式
0 v( c* X* H" C% }0 {. f          SETB      ES                  ;允许串口中断
7 T3 u% n6 h' m; n" {# `          RET ) L' B$ U( ]7 Q/ R8 X( B' G
;-----------------------------------------------------------------------------------------------
8 ?6 r, V* P6 g, P7 U/ S5 W) J5 r# m;串口初始化子程序6 n8 Z( n& ?2 u! G) v  j
;----------------------------------------------------------------------------------------------- 8 c. ^' C$ f- g; l1 k8 F
initRS232:MOV                    TMOD,#20H           ;定时器工作在方式2
) }9 \( b) i# y6 l4 M          MOV              TH1,#0D0H           ;设置波特率0E8H-2400,0D0H-1200
6 l- I% E# L- @7 a          MOV       TL1,#0D0H0 x% g# U. B, G1 E  J) e! G) _
          MOV       PCON,#80H           CON-电源控制! i* c+ z: Y2 }; s1 y- C
          SETB      TR1                 ;启动定时器1
+ Y& X: s, \7 x5 j          MOV       SCON,#0D0H          ;SCON-串行口控制  MODE3 启动串行口接收数据   5 E( c+ ~3 r# d# S+ G7 S
          RET                           ;返回
& ^) L# U- F3 Y& k" r          " e) ^8 G5 W% ?* A% z
          END
: b  ^, s% }. ?+ j
; g& k# C& z: k  H5 ^ 现在调试中,灯也不亮(电路中,发光二极管正极接5V电,负极通过上拉电阻接单片机),串口传输也不成功....
+ ~; c/ E. p! C1 e& a 另外,小弟个人还怀疑按键的解法有问题。电路中采取独立式键盘一段直接接到中断源上,一端接地。并没有采用电源+上来电阻的形式。我查了下书籍,有的说到,单片机里面有上拉电阻可以这样子接法,但小弟还是怀疑~~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-2-3 03:10 , Processed in 0.054350 second(s), 33 queries , Gzip On.

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

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

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