|
幸福万岁 发表于 2013-7-23 11:52 7 f9 A" ]; i# p7 b: ?4 N( G0 X" Y5 g2 j
这个函数也可以写的简单点 ( C9 M2 E0 W% r/ X
我比较喜欢写成 这样 一目了然
/ p/ G' n3 W, ]/ ~3 G哈哈 7 Z: V- A0 U( B# c% a
非常感谢你的帮助,确实是延时问题,目前是发送6位,接收10位的问题例如发送5a 06 00 98 00 01 接收为5a 06 00 98 00 01 01 01 01 019 _0 [: f: K. N& j, t. J
' C, ^, ` r& F' {6 P( H. r#define uchar unsigned char
+ L5 m* G: n2 [/ h% Uuchar port;
7 Q+ ^" F' l' S! r9 Puchar rec_data;7 U# K- N, `# i B m' S( H2 u. }
uchar str[6];2 L o' s$ Q/ s9 D @/ A
uchar point=0;
* N* r+ X I7 ` a' yuchar flag=0;& N4 y* U# P/ K0 u2 M
//串口初始化 & ^; J. T6 c4 ]9 Y! \8 q" P( |
void UART_Initial()
6 I: G. n! b) f1 l3 [{
) M2 X$ R, d! ]! x! G4 } SCON = 0x50; //串口方式1,允许接收
6 N0 _5 o* n7 I TMOD = 0x20; //定时计数器1方式2: y" w3 C: Z' @" H" m4 Z: v
TH1 = 0xFD; //9600 波特率 FD
, [- z" L9 a3 _% t' y ^ TL1 = 0xFD;
8 X# m; O' r- m EA=1; 0 D% _9 z/ r: u8 F6 Y- F
ES=1; $ l& p2 U [0 z8 T3 V! `4 j6 P
TR1 = 1;
1 {+ e) Z4 o1 j) L, g4 `7 j}
$ l+ I u: P7 b- S+ C; @- D: W 3 r7 K7 y) e7 C5 p1 K
void waitsend()9 }, ~. P4 \* n8 D9 C4 G
{" l( ~6 L- L0 i
TI = 0;
/ p5 [3 y% [3 z1 ?9 ~2 x ES = 0;3 z9 y- w* a, ^# B1 y3 M s
while(!TI)# O# ]$ R9 o1 g) q# Z* Q6 R: W
{
8 W; T7 Z6 ]$ ]% r };
- H) ~4 o1 p* W! D+ p TI = 0;
; @$ c+ Q' u9 Q+ W3 C' f0 _0 b- F$ q' w( Y ES = 1;
+ J: h, X7 c, o b}/ l) O& {8 M$ c6 [
9 T4 O! O8 P: _, a5 W u8 _4 Bvoid delay(long i): T" t {' G% B* H# l8 H( _; p
{
! h6 O5 V3 S, y ]7 |: _% f3 g, P long j;6 }& ]7 H& ^3 V' _' A
for(j=0;j<i;j++)
5 L. z# j. V7 G' Q6 U1 K7 x3 U! ~# E {
7 a+ Y m( `2 J% Q' E8 p0 D5 E' o' x SomeNOP();
: E# {5 w" A: g Z* @0 W SomeNOP();6 @ ^# m! f2 f6 h6 X4 R4 \
}
3 M& s/ c5 E5 u% X! j}5 L& d1 D* T! C" s5 B3 e$ B
1 ?9 U* Q: Q: O9 A1 Bvoid delay1ms(long i)* j$ F/ w3 V k: R
{
5 s7 P( ^5 k! `/ R+ S, u long j;+ b9 U" c- a/ d8 Y3 |& t( l
for(j=0;j<i;j++)& ^. Q, E: k! [+ h
{
* p# }- |6 W- V( Z& W# V* D delay(70);
* G+ o- V2 u: \. `4 b) |1 H* v }. n3 N6 D$ q: i; T: w
}
) T- L6 R0 e) R6 O) w# p7 b# F8 ivoid COM_REC(void) interrupt 4 " O( L5 j: C8 o# W4 ~9 l% d" m
{
1 J& n- D7 ^! V' m6 c$ n$ T6 j3 @ r3 o& h1 Z: h, F9 }0 ]- l
if(RI)
5 E3 L6 Q: \2 u+ m( T. M { //清除串行接受标志位
% C8 A" {8 T% x& x. w: d3 s RI = 0; _! O. h5 X% |( e
rec_data = SBUF; //从串口缓冲区取得数据3 M- M. _( W. S- L9 N1 S( o
for(point=0;point<6;point++)
0 e5 W" J' d% C! w' C {/ I5 a/ u5 F- n& a8 R0 I& N9 Q8 w
str[point] =rec_data;
+ ?( ~+ \! l1 K7 s( k //delay1ms(1);& @/ o. {! h: K; _
SomeNOP();
, D; _7 K( G* w9 l9 Z& O( H. a SomeNOP();
4 Z' z2 h% b4 P7 `4 h( ~ }
, I! M0 g2 n1 \7 H' g# v1 E point=0;
. c; e! g9 V+ Z flag=1;
) w2 e( c$ n5 ]4 n* b4 W" Y }
& W+ ? I) X$ z/ h4 g" P( Z3 w! q. k}
% M# l2 Y9 D evoid COM_SEND(void)" |7 d, b1 I* {3 J' A. ^
{
1 a- l/ n- b |! }) }for(point=0;point<6;point++) //连续发送数据
* B# H1 M, r0 F ?. A& N" @ {: W" q1 N8 y! p! h( n. {5 f* l
TI=0;
' O8 I0 |. u( w* I' S, K3 v SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口& M" e9 D8 v4 w' K: B- J. W
//delay1ms(1);
/ V* p* j1 [. s) a) ` SomeNOP();
- [" g* p7 h+ R& ~. O! D6 i SomeNOP();9 \8 o l! m8 T$ ]
SomeNOP();
% K7 `- Q0 ]1 g3 T# H$ J% H: i* e }" x" d+ M$ a( v5 w m9 o
//SBUF=Read_OneByte(str[3],str[5],str[2]);
' }/ o$ j4 _9 e0 k
1 U8 R S$ ^# A% I9 r}
8 O: o' l. y7 W! x* x7 cvoid main()
+ _8 w4 J4 E) A5 s0 |5 h8 ]{
1 i. s' Z) x Q8 b8 ^. c UART_Initial();
, S/ h/ K. C( \& k- B1 q delay1ms(2);
3 n' V0 a' G: W! K while(1)
0 m) ^# e. I3 f" @4 l: v$ D' ~* ~ {) t0 D) e, y& S3 ~
while(flag)2 o P2 [; ?9 Z8 x1 A
{
: t# z: J$ @! P3 s) A. P+ \9 @ //RI=0;9 p& F' q+ }+ s
COM_SEND();8 O* v: k& o; M# |6 I U! p- ]; ~) ]6 F
flag=0;8 L8 K! r$ p: r: [/ m
}
1 ?+ g3 r, J: g: [8 X }
; J+ W' t9 U7 E. X: t} |
|