|
幸福万岁 发表于 2013-7-23 11:52 - D$ @3 W3 x9 ]* B, e
这个函数也可以写的简单点
6 T6 G" ]7 W4 ~* ?" f3 I9 l我比较喜欢写成 这样 一目了然
% B+ v6 x2 X0 r4 r哈哈
% K) P* d7 g; ~- Z0 g非常感谢你的帮助,确实是延时问题,目前是发送6位,接收10位的问题例如发送5a 06 00 98 00 01 接收为5a 06 00 98 00 01 01 01 01 018 R9 d( m! h/ Z
6 d* X/ c# o( [+ _# h% t; t
#define uchar unsigned char
8 g% ^ p1 Y1 h3 C% P Iuchar port;8 r7 A3 Q, H9 t- \$ F
uchar rec_data;
) E+ v' b' S$ D# V+ i7 O1 duchar str[6];
" ?1 I( G1 ?* Q; E6 K& M" k+ ]uchar point=0;
- M$ Y( ] p/ A" K3 b. Yuchar flag=0;. J% Y/ ]3 m$ F7 }: ~( H/ }* k, l
//串口初始化 1 L- P4 A3 T5 \6 w3 [
void UART_Initial()
9 l3 G% i4 D, t E+ H% `8 J{ ) W9 r: z, T, Z m( S% Z; H6 o" j
SCON = 0x50; //串口方式1,允许接收
8 [; [, c2 ?" o4 b TMOD = 0x20; //定时计数器1方式26 w+ X. f# Y9 w- s( N% S t& ^! h
TH1 = 0xFD; //9600 波特率 FD
1 ~; G& o% T- \; u5 W+ L TL1 = 0xFD;& t6 h/ Y* w0 \2 u2 d9 `; s
EA=1;
- e( c3 d: o0 ]4 M8 L9 b ES=1;
$ @7 t0 @; H, a+ s! X" P TR1 = 1;
7 ~9 m8 F0 w$ U% ]}' T$ K! L' v! {! [+ @ g# _( s
5 I$ @. g0 O, d& C
void waitsend()
/ O a, o, y# T+ j$ C{8 t% ]9 I( |/ V |4 y7 U/ W
TI = 0;
1 w! {( i! ^" v/ U- k" K ES = 0; v3 A9 r) I' E5 Y+ W0 B6 m; a
while(!TI)4 s- _ ^, U8 P& ^8 @1 b8 j
{' j: M7 m( [% z2 E) {$ b
};
) k8 ]& h5 y8 M/ k7 k TI = 0;
: Q5 T: B; p: R. J* Y' v9 U ES = 1;
$ m, `, z/ _- _+ q}
; D6 [: z3 S3 X4 m& J
E. `1 n! ^/ ^, I. {1 m+ K) }void delay(long i)
% h4 u& i5 v% d' c) K, {& ^{
# u. ^4 D' o+ G2 b' Z- B long j;9 Y) [5 }6 v: o* r
for(j=0;j<i;j++): |) b) a. m5 A
{
% T7 E& c* m4 G0 A3 z SomeNOP();
8 @+ z' ?6 ^9 x SomeNOP();
0 D5 R$ ^+ X9 H/ A, Z; R }* Z2 F) E! L6 z* x
}% \) O {4 {3 s" v
! E1 x' B8 s( Z" z5 d I2 w
void delay1ms(long i)
- r( q4 B6 h% ~: q5 V G* p4 V# `{
" }& h- Z) O, y1 {% D) S long j;
; C: C% ?% I% k9 m0 h1 A for(j=0;j<i;j++)) n# M3 d# J4 E- `
{
3 Q6 d% R. D. W% V3 I delay(70);0 h' o6 e5 T4 O
}7 |" I$ a3 ?1 E% G. |
}
! e' N) g, h4 `1 evoid COM_REC(void) interrupt 4 . a% d" v! Q& `
{. D' @1 n! L& }9 L0 D# H* F! b& ~) \
' P7 v! Q2 {: t7 ]9 A# g
if(RI)* ^5 H7 g/ M" U# j
{ //清除串行接受标志位0 j) i. k9 u% g g
RI = 0;
$ |# p& m9 A% M+ r rec_data = SBUF; //从串口缓冲区取得数据
9 C+ Y- n1 O' i( M& m& t for(point=0;point<6;point++); l. Z6 o Y# R( w: A' H
{; k8 V4 H+ x a% n6 u& H+ `
str[point] =rec_data;" w% B$ f) L& Q
//delay1ms(1);% F4 t& \( ~5 n: _
SomeNOP();% l c( Q$ i% E: G) H
SomeNOP();
: F: k, ]9 n; [8 e- E } G9 A. K( ]3 n7 t1 q. I4 I9 ]
point=0;' C: M+ v) Z7 q
flag=1;1 H9 @' S+ X8 X
}
, r h4 R" `/ i4 j}- Y7 g/ [ B! d* a- x' t' d
void COM_SEND(void)
! Z* @& M" O. g" x; ?' B" J7 F{2 Y( R+ d. k1 \$ D4 m3 |. I2 T
for(point=0;point<6;point++) //连续发送数据
) g) c, I( C9 F: Z3 s8 P$ S {- {: Y* F1 b A3 g- T. ^$ o
TI=0;/ F) b9 k9 j: n ^6 y1 X! {
SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口4 {& E" v1 H+ g
//delay1ms(1);
* L9 J8 u" f- B( D SomeNOP();
" U9 y' |1 {2 l0 { SomeNOP();
( i: W: S% t; j% O# ^ a SomeNOP();
& W5 Q9 ?, ^2 c' y. N) c$ I- a8 u }
3 {% S( U& u! P7 R //SBUF=Read_OneByte(str[3],str[5],str[2]);( Z! x. A, L0 l
+ ]3 ?- ]: ]8 Y# M+ V$ m' [, {
}
. s0 L8 B, q3 S" U/ M5 q& `void main()
( F: E+ V9 ]9 w8 @ [# n5 f{1 b) H3 g2 r) X4 Y$ W% d# G1 R
UART_Initial();0 L0 O2 _# ~) I- ^
delay1ms(2);
6 F& r5 }% _0 j0 x while(1)
6 X5 d! L/ g+ H# x7 ^" e {
, W" C3 ]4 Q. Y5 f. t8 b while(flag)7 L _6 t* f A8 h
{6 F( j& k' i' X9 J
//RI=0;4 g- Y2 Y5 K! B
COM_SEND();
; S5 B+ y, l( a# ^. ?" V flag=0;
0 j2 e/ r- E. V, @" @7 J5 ~ }
$ H, l4 C9 f. l5 K/ w; K0 j9 x* j }
/ X* D5 ^0 G% X! t' m. [/ I" v8 N} |
|