|
幸福万岁 发表于 2013-7-23 11:52 ' o" _, b+ z/ R+ X
这个函数也可以写的简单点 8 b! p% \& ]/ X- R' g
我比较喜欢写成 这样 一目了然
9 [( d+ x5 l! b" T1 k哈哈
8 X7 D! P4 P) \/ E1 F/ q1 C非常感谢你的帮助,确实是延时问题,目前是发送6位,接收10位的问题例如发送5a 06 00 98 00 01 接收为5a 06 00 98 00 01 01 01 01 01
1 |: H. [0 p L
, B7 W/ [( y$ J- Z' Q E- ^3 L N j#define uchar unsigned char
9 Q5 Y/ e- U6 N& d+ r. _uchar port;9 Q5 o! {3 k1 v6 z0 R
uchar rec_data;0 a8 G. S2 e2 v, W8 p5 A
uchar str[6];
/ O" W% b, H3 s- e$ [uchar point=0;$ B' ~9 T* r3 W! T% |0 k
uchar flag=0;* q, h. L, I s; O: ]
//串口初始化
# X3 N" w& A/ A: E6 Q$ z# |, `; g9 Hvoid UART_Initial()
/ f& L: ]# a1 w; J6 y{
- j& Y' B9 t7 r2 s3 |+ ] SCON = 0x50; //串口方式1,允许接收
, P; h4 }, g( I B8 {* R TMOD = 0x20; //定时计数器1方式2
% z1 K# B: b/ Q# ]# u2 a" e1 p TH1 = 0xFD; //9600 波特率 FD3 W7 ~' o# G: k1 s# f) \ q O
TL1 = 0xFD;. a4 s1 T6 F- F2 K9 o) l
EA=1;
: k% I# W4 V" M+ ^ ES=1;
& I( M# @. K3 l Q2 H1 k: U TR1 = 1; ! i. r5 F$ s# X, U
}
2 M6 U! v9 q& Y2 i
- B$ u" Z$ ?1 B1 P/ vvoid waitsend()( T( f" F3 x2 K8 V- X# W
{1 W( S) k7 b/ m! @) Z5 @
TI = 0;
. p6 V' v1 X8 {& {) P7 r ES = 0;, r. O& d- e& Z) c9 m
while(!TI)
* q+ f. n; [7 g7 v n {
# ]7 `% r( k8 B5 _! C6 M' X };8 Q$ ~2 U D0 e- X
TI = 0;
- w7 r, t1 L* n* g ES = 1;2 y4 {' m N! B: p4 \+ v
}4 c% z* P L) k/ M! O
8 b4 i! a. a$ u0 A. a5 Dvoid delay(long i)
6 c) B6 E0 j; s3 @% w& q{- R5 E4 E5 o8 ]0 r7 \- M
long j;
# g3 R6 `8 B' E, ~7 Y for(j=0;j<i;j++)
- s; [/ H& l7 w* ]8 o, s+ d4 A {
3 H9 f, u# u u$ ? SomeNOP();
3 n5 [! r/ q; i/ m SomeNOP();
1 C2 W9 u1 M: e6 v3 B }1 ]" Y4 D6 }# v4 n4 Y8 K; E/ x# X
}6 F# m! s* G. t2 Z w+ _
9 g5 g, J" l- {void delay1ms(long i)
8 m$ w- |6 W; P2 U/ e' n1 u! W{; O5 _+ \) I# r2 |. C8 R& k
long j;: j0 \+ @: ^; ]# @# n
for(j=0;j<i;j++)4 \, q5 V* U/ e' g
{
; k6 i0 j; ]( M* } delay(70);+ V0 ?0 q4 B: Y7 J, i
}
T3 l- T g+ G5 p8 i2 Q}# l1 U; D m8 e; {6 f
void COM_REC(void) interrupt 4
* `4 K2 o; w, G$ P{
+ s) ^% h; e9 j$ a6 Y
6 X7 ^+ n, K9 J+ Y ]7 I+ ] if(RI)
8 e: Q* m% T3 Y' p4 _8 F { //清除串行接受标志位
3 Z9 z. ~5 L0 Y RI = 0;$ a$ ?" U7 {2 s' D
rec_data = SBUF; //从串口缓冲区取得数据% i! l2 Q$ ]/ r8 {& b" u
for(point=0;point<6;point++)
6 [/ g# ?* l3 F! F {
% K) p |6 l* J4 j$ J str[point] =rec_data;* i7 X9 \* p8 Q* x9 Q1 a
//delay1ms(1);# Q- o7 L) a) y a: D# q
SomeNOP();0 v r' i, x4 B- j
SomeNOP(); u7 d) ?5 V! d# G" V4 F+ d2 A
}; A2 ^9 _& n0 H' A+ ?7 k8 Z3 N2 T
point=0;
+ D* ?- o L+ M* D/ d" I flag=1;
" D* N$ T$ ^9 Y" \9 X' M }
% k4 f) ]4 m C! ]4 i+ g; U( K}# C ~5 @# {! K
void COM_SEND(void)
: `, z2 Y, u9 Y{
: M- a2 e' \+ K2 _5 b* Ufor(point=0;point<6;point++) //连续发送数据
. {4 G5 ^/ \. D( n& @ {4 ]$ ?& x. ?* S( H; L# B$ j
TI=0;
# C( C- J2 d! ]0 I+ d% A+ R SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口2 l# L+ x/ j; T3 K+ h7 j) m
//delay1ms(1);
6 U' N" {. H& H, r SomeNOP();
# Q/ P' f5 K: G% i9 U SomeNOP();- s: B }8 w, o- t4 I$ |% I/ @! M
SomeNOP();
1 {2 z5 s! i4 _ }
9 o4 K2 ?# w s //SBUF=Read_OneByte(str[3],str[5],str[2]);+ D# Q; O+ e3 Y; m# @9 }
8 y. ?2 [: e& V, h+ c}% ]& Y# F1 k% W, o( S
void main()1 C) L) [7 ^8 z8 V' D) q
{# }2 {; X/ Z1 @7 X' M- u4 y5 z! B
UART_Initial();3 C( `6 j3 }5 w" s9 E
delay1ms(2);% V4 G( O& S& f& W. F
while(1)
, H# L+ p$ s8 `/ R- A3 x3 }: T) X {
9 ?9 [3 l4 X" ~; Z# i while(flag)
' R- U% c- }0 H0 p0 ]7 q+ G, { {) E# @+ C% C3 t2 ?1 d5 z! [
//RI=0;7 T+ `4 X& X1 ~: r0 j% `; |
COM_SEND();
" d+ `* V8 V7 Y6 u( }: K0 j( R flag=0;# d" g$ H" |, Z
}# q% y: X4 T/ |1 G7 [2 u
}
% e, p' [7 c, [ z6 P# L. f} |
|