|
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 | 另外,小弟个人还怀疑按键的解法有问题。电路中采取独立式键盘一段直接接到中断源上,一端接地。并没有采用电源+上来电阻的形式。我查了下书籍,有的说到,单片机里面有上拉电阻可以这样子接法,但小弟还是怀疑~~ |
|