|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟是做FPGA/cpld和一些简单硬件设计的,这两天逼于要写一个单片机程序(没办法,谁知道公司人少!)...可是,委实不会啊!!折腾了半天,参考了不少书籍,好不容易码出了一段~但是调试它愣是没反应!!时间又紧,小弟实在是没办法,只好上论坛来求救~~还望大侠们指点迷津~1 e1 Q& V2 b& `1 f9 J5 n# y
. E; x" I/ X% `7 ~
要到达的功能: 80C2051单片机的中断源外接两个按键——当按下键1时把11AA通过串口发送到另一个单片机上;当按下键2时把1199通过串口发送到另一个单片机上...无按键时候等待操作!!
8 _ g- ]. Y, P: n2 a- y: B+ x 程序见下:% g9 X' T2 `% b0 ?$ @4 z! M
nei_in EQU P
% I6 M+ X' G; W/ x8 N wai_in EQU P: r4 v( a/ c+ e. {* l; v
nei_show EQU P1.3
. F; R' j' ]9 |2 m# e' I* Q wai_show EQU P1.4' e7 @: M2 j4 T- N* N o
send EQU P1.2
3 b3 K9 k: Q5 x, m. H' j: I;-----------------------------------------------------------------------------------------------
) V9 D- B- C5 l ORG 0000H
) ~) B7 Q2 y \4 h2 l5 ` AJMP main ;跳转至主程序
3 f+ b; J8 @! x) M) E7 E- Y ORG 0003H
% b% q4 b+ d& w: V- _+ ^ LJMP f_0 ;转到外部中断0
$ M! V& n. N( T& F$ I9 e4 E$ x ORG 0013H
% U" u. c: J4 G3 t5 k LJMP f_1 ;转到外部中断1/ O' ?) v; P6 i" q; u" v
ORG 0023H
7 D6 z, d# k" M+ j7 U; y$ D6 a/ R! o \ LJMP serv ;串口中断
G7 ^. v5 s; K7 ~;-----------------------------------------------------------------------------------------------
; i/ e. w9 Z# r8 U$ g;主程序
( G/ ~+ r' V9 l0 \3 |;-----------------------------------------------------------------------------------------------
0 W/ I2 R+ _5 q+ z% B5 Q ORG 0030H ;主程序开始地址: v- B& o' L* U4 J
main: LCALL initRS232 ;串口初始化
* n2 {5 T# t/ b) D) u$ t LCALL init ;中断初始化, J5 X$ M# N: S1 `% J
CLR send- I4 h% R3 V) P' Q
SJMP $ ;等待操作
0 A5 [% K" E! @$ U: ` G- c;-----------------------------------------------------------------------------------------------6 z" M0 } q1 U: w8 t9 U
;外部中断0操作
% w( c3 k( z8 T I2 x% X9 n;-----------------------------------------------------------------------------------------------
7 o, {7 X5 J$ c3 y: {- pf_0: PUSH PSW ;保护现场% k4 F: X z$ y% m( }
PUSH ACC2 |" p. T5 H* r# S
NOP ;延时等待响应
5 I' Z! Z6 ?; p* a5 I& D5 v NOP
% O: E# }1 X4 ?7 g6 l& k# f SETB wai_show ;关闭中断1操作指示灯* y! t( z7 X: ^" }* L4 z
NOP
6 G, g! ?6 w* F, b& W: d* J MOV A,#11H ;把55H送到累加器
) l1 b3 y/ `9 C. J% a% r. C MOV SBUF,A ;送到缓冲区
8 e5 t# l- B3 c* G: K JNB TI,$ ;等待发送完成
' A+ Z5 c1 b' f$ Z) D CLR TI ;允许再发送& F$ t/ |8 _* ~# _
MOV A,#0AAH ;把AAH送到累加器5 ~4 R& J& |' |; P* r" v9 D: U3 T
MOV SBUF,A ;送到缓冲区8 r, S+ j G G2 R% m- \
JNB TI,$ ;等待发送完成
. b7 }" v6 q2 G4 K/ [- g" E CLR TI ;允许再发送
" J1 Z. k% a2 m- q; r1 Z NOP & m& V! C, K1 N: b' t/ B; E8 b
NOP * ~: B. b$ I* T' |1 w# C$ Z
CLR nei_show ;点亮中断0操作指示灯 ' L% M( H5 U! c5 }
SETB send ;发送操作已完成标示+ z$ K3 r6 L/ p; W# o) ~ L
POP ACC" u" j% h) L& ~
POP PSW1 [8 L8 _5 {& c3 q G6 X7 ^" |
RETI
+ Q! ]7 W1 n9 h! Q3 z;-----------------------------------------------------------------------------------------------2 A& J/ Y' _& U9 T
;外部中断1操作
1 W9 T3 F3 O4 H' `2 M; G;----------------------------------------------------------------------------------------------- - _# B6 y. }8 D
f_1: PUSH PSW ;保护现场/ H9 R% ?5 @: l4 C/ h* }. ]" y
PUSH ACC9 T" D0 ]! V! T: z: i9 d2 h
NOP ;延时等待响应
0 E% l5 y$ o, x. B NOP
, z; s& a$ ]4 u9 w5 T SETB nei_show ;关闭中断0操作指示灯% X+ R3 W3 N: {" T T
NOP
7 n4 |* J9 A1 F! M* \ MOV A,#11H ;把55H送到累加器
2 V* N5 u7 j% x `/ V8 q. e1 U MOV SBUF,A ;送到缓冲区. \ x2 d" _7 t1 n t" I
JNB TI,$ ;等待发送完成 Y6 ]/ U9 I7 g
CLR TI ;允许再发送" k! Q* _2 k! `( c, R
MOV A,#99H ;把99H送到累加器
5 E5 T. r- \' a8 V3 t9 D) \) l MOV SBUF,A ;送到缓冲区' M% ~ ^; I9 B" K
JNB TI,$ ;等待发送完成% z x2 y% J' K; z) ~* d3 G; d
CLR TI ;允许再发送
, t+ E Y" P8 P1 x NOP & [ L# O- M# C7 a6 }6 D# ?; M5 N
NOP 1 D5 L4 t7 R& Y! T. j. e
CLR wai_show ;点亮中断1操作指示灯 4 c. j; w G1 ]3 K' O/ f0 q
SETB send ;发送操作已完成标示
+ T8 V! A' v ` POP ACC2 [9 G+ Z3 Z+ d$ @% S: [0 ]. {
POP PSW* w* }9 k- B4 `
RETI - m% P/ X# i b, i
;-----------------------------------------------------------------------------------------------
: ]1 ]' q3 v, Z, m! z;串口中断子程序$ T: b$ c. }+ _. R9 v2 c$ I
;-----------------------------------------------------------------------------------------------
6 A; ?' D4 m% Z, [1 Kserv: PUSH PSW
4 z, s4 C" L8 P8 ]: t- Y( U ? PUSH ACC6 u3 A0 A' o9 p9 w
NOP1 ?7 \& y# a# s8 G$ g
CLR RI
: w- n) u) b, J+ r5 F: ^$ A MOV A,SBUF7 P7 u" l$ r4 K& M7 T: a
MOV R0,A/ x" C! K$ v5 t6 v8 b3 U$ |2 C
CJNE A,#11H,NEXT1- k5 k3 J% s& C
MOV A,R0
# K, n) P1 N# l. e, BNEXT1: CJNE A,#0AAH,NEXT24 R! @3 `% \" |$ y; i
CLR nei_show
+ Z; f# j% c+ a6 sNEXT2: CJNE A,#99H,NEXT3
3 {3 {! ]- O* q q/ F: d4 f CLR wai_show+ v! t( m- ^, J/ ]! C! X: Z
NEXT3: POP ACC- b: ^6 l& A2 ^( o2 d* X8 r
POP PSW
S7 U T) g! z! B+ ]$ R RETI' A# c9 H: _6 {1 w6 ^4 B; I. U4 p
;-----------------------------------------------------------------------------------------------
- s6 }% @7 [8 e;延时10ms子程序
8 @& x9 N' k6 Z% J0 Y;-----------------------------------------------------------------------------------------------
" k ?( I. d, Z% h; idel10: MOV R7,#40: C% z; f" ?- q7 b+ i6 y1 f2 H
del1: MOV R6,#123+ `& `/ s: d/ m+ K
NOP % P) P* Q' h9 g3 u( U6 ]
del2: DJNZ R6,del2
" L+ M7 F+ a% d: h- n DJNZ R7,del1
5 s, n) j* u; m, M c7 k- r RET
, g7 M& x3 p6 j! D/ h W;----------------------------------------------------------------------------------------------- 2 ?/ o* I$ ~& h( [2 c6 G: G
;中断初始化子程序+ i4 y1 E0 r* @& I
;----------------------------------------------------------------------------------------------- & l5 L: e" }, b2 g9 p* O. b: D
init: SETB EA ;mcu开放中断
/ x2 E7 b" @- O% y( s SETB EX0 ;允许INT0中断% s5 \* j4 H6 W# b, ~4 d+ s
SETB IT0 ;设置INT0为边缘触发形式
1 n; M2 G3 T; I1 } o SETB EX1 ;允许INT1中断, y7 E, s0 Q& e4 O6 Q
SETB IT1 ;设置INT1为边缘触发形式
% A5 x& v* L* F A( ~ SETB ES ;允许串口中断* ~# g! D. h* O! s- c
RET
* z# t7 y; y# x# I: P: C;-----------------------------------------------------------------------------------------------
8 e4 r( S7 h2 u( q2 h. Y/ ];串口初始化子程序( ~3 A1 _* r* `) K
;-----------------------------------------------------------------------------------------------
: Y" c3 H, F; d$ E7 y" sinitRS232:MOV TMOD,#20H ;定时器工作在方式27 b) O3 n& ]0 C; ]4 H0 Y( {3 C. K
MOV TH1,#0D0H ;设置波特率0E8H-2400,0D0H-1200
; {/ \& W7 H3 o [3 L$ c MOV TL1,#0D0H
3 O" t8 _7 o6 i/ S# e6 M MOV PCON,#80H CON-电源控制
6 M1 ?0 W/ H4 g7 U6 {8 _, g5 h8 V' f8 L SETB TR1 ;启动定时器1. y6 M4 I Q2 Y! C6 Q. t G4 L
MOV SCON,#0D0H ;SCON-串行口控制 MODE3 启动串行口接收数据 6 V6 W1 o8 Z/ K' U9 g
RET ;返回
( s" W( e1 I5 N
! {- _/ |0 U: E. |5 n END
/ }+ E$ g, F$ d K5 d, _. g+ m. J6 [& Y0 y
现在调试中,灯也不亮(电路中,发光二极管正极接5V电,负极通过上拉电阻接单片机),串口传输也不成功....
0 d2 ?( L5 E0 |9 ^ 另外,小弟个人还怀疑按键的解法有问题。电路中采取独立式键盘一段直接接到中断源上,一端接地。并没有采用电源+上来电阻的形式。我查了下书籍,有的说到,单片机里面有上拉电阻可以这样子接法,但小弟还是怀疑~~ |
|