|
幸福万岁 发表于 2013-7-23 11:52 ![]()
2 P- `- U0 B& x这个函数也可以写的简单点 + W) @$ g$ `; D3 i' `
我比较喜欢写成 这样 一目了然
7 C' N8 _; S' I; ~& d+ f: C哈哈 - I% E T. Q0 _* t& q, y* B8 d# d
非常感谢你的帮助,确实是延时问题,目前是发送6位,接收10位的问题例如发送5a 06 00 98 00 01 接收为5a 06 00 98 00 01 01 01 01 01) Y* K3 U# I T5 u
+ J* b9 V& e1 U( n% }4 l
#define uchar unsigned char& E% E3 N) O# ^- n7 h' b- }" d
uchar port;7 s; |$ e: H4 j0 M0 z, \' e
uchar rec_data;; j! d3 m- T+ u A9 [9 F q n+ e% G
uchar str[6];
5 E5 _$ M& [$ ~: i6 k/ Euchar point=0;
# f% Y2 x4 I$ l) Q& N" F' e8 G/ muchar flag=0;* v6 e+ O u, U3 k
//串口初始化
0 n0 }6 {! f5 s* svoid UART_Initial() ' w" G$ Y- [0 C M* Q
{ 4 p. X, j7 a( ?8 \; h
SCON = 0x50; //串口方式1,允许接收
7 M& w! t0 ~. A TMOD = 0x20; //定时计数器1方式2# O1 M/ K! c2 g5 c7 u* H7 P
TH1 = 0xFD; //9600 波特率 FD
: I$ c1 z6 s+ _$ E6 u" N8 w& H TL1 = 0xFD;& z9 V+ A' Q+ U. g3 g
EA=1; . t' b; C( A8 R% |
ES=1;
6 F! l) K' y) B7 h. u% L TR1 = 1; # L$ n' u {, W/ g
}' |, v( m4 J) h; T* \1 i, h
1 H$ I2 i1 ?" e& K; @; M3 L8 h$ Mvoid waitsend()
+ X" X4 ]1 G* i- j F, ?{
* m7 L) }% u9 [0 V' o2 P TI = 0; 4 U e% S" h* f( X+ J6 ?1 j4 R
ES = 0;( R$ A" c% m# Y+ S/ g4 |
while(!TI)# k* g# p; J2 o8 l8 x. N7 ^# h
{
' X3 r4 ~" o5 ~6 q };
; {; l. l9 K) G) Y# B( p0 H! m TI = 0;- J) P' u; h' g7 s
ES = 1;
. E% c9 s. d% Z7 ?3 o N9 N}4 Y5 t- [' a3 O; ^
9 i& b% Q- a5 t/ q( c! j- I/ z: w
void delay(long i)( C ^8 H$ P8 f, Q
{
; k/ G5 K! F1 K long j;
# N {4 ?9 U5 o- N for(j=0;j<i;j++)- ~" V* V, M' A6 m% g9 x
{" S8 n8 C' s- {3 j3 g# f
SomeNOP();
* _- A1 C, x' r+ S+ L- s SomeNOP();" s, Y5 Q. J u$ u9 |" X8 _
}
0 l( j4 @ \3 w; F" H}
) g8 T- [& }0 Q0 n' D1 ]) W: M( G& X, p; B+ j' z- C+ b; m7 K
void delay1ms(long i)9 Z% {. P' T5 G6 B6 z) Y
{% s, T9 n( J( c
long j;* ~% }9 o" ^4 @' G; l& v8 X
for(j=0;j<i;j++)0 S; S& h, U; F; V7 z+ V
{
; s& s8 @/ G8 }- O6 S9 ^4 \ delay(70);. I% H8 e2 U* K* Z- `' M& e( t% N
}$ u9 G) [2 a5 \* j( y/ I9 M
}
3 V( ]" O" @& j5 ?void COM_REC(void) interrupt 4
9 Y3 E% v& H- F0 H{, f8 I8 X y8 p- U6 |
0 R% y3 ?5 f6 d8 ]5 E2 L0 t if(RI)
s! D' q: y* {$ T { //清除串行接受标志位$ B! S$ m! Q k0 O' e
RI = 0;7 b$ |0 Y% e' L9 Q
rec_data = SBUF; //从串口缓冲区取得数据
& f: X! t2 S0 v4 {! L for(point=0;point<6;point++)
) i: b2 E6 c$ G* D {
! T6 x$ U1 b0 P8 ?" U. V str[point] =rec_data;
3 C7 U p( E. q! R5 X //delay1ms(1);
2 @2 O* c5 d- A SomeNOP();( s2 V# g5 g9 ]
SomeNOP();5 U a( ^5 d( |( q- r* a9 X! }
}- c* ?. z& c* z3 ]3 {3 |
point=0;: P q. _( Y8 \7 P: v J$ \
flag=1;; G% [( c, J; Y" [$ a! e
}; m! K3 e/ f& H1 h! u; X3 ~
}6 @* a+ M" x+ {3 G$ \
void COM_SEND(void)/ U6 ]9 k- d, {
{
% } \% m& a6 s; a% _" [( Zfor(point=0;point<6;point++) //连续发送数据
& K# o2 O ?7 t% v4 ?. H4 G {
! [9 ~8 h9 z, u4 b- m TI=0;
% z5 m5 _' D$ A" b+ V5 g$ o: P6 P SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口/ c. f# Y% j2 B0 X) d. F- a; w
//delay1ms(1);
0 b. H8 p1 u" H2 _0 [$ J. ` SomeNOP();( g7 ]$ S, U2 _; s
SomeNOP();* g! v8 W5 v) r% T( ^! J% B
SomeNOP();
# I1 _9 O9 b& v8 I. } }
. N8 [0 Y7 f% Y* u% \ //SBUF=Read_OneByte(str[3],str[5],str[2]);
5 X% q& s: ?. S; p: f * A) I) z7 X( s
}
# ?$ x* j5 I0 @; zvoid main()
, ~1 ^* b+ f$ ]# Q3 q5 S{
Y- O: z9 ]1 d4 R6 U UART_Initial();
5 s' Z/ k: S6 c$ z1 ^ delay1ms(2);5 |7 x, c' C( }/ ^& E J
while(1)
3 {: J5 Y4 |: ^9 G3 [( h {4 X( p2 j7 D; U
while(flag)5 J% m# E4 {8 M/ G6 c+ R& l
{
' X9 s: v2 B6 w: l; Z. f) L3 H //RI=0;
8 B: S$ H& d4 W' y& S COM_SEND();. v) g: L$ V) i8 g* h
flag=0;2 B1 P0 o) S. ?( {0 L* P
}, j- G* y- a2 r0 B
}
9 G; @ L1 M+ H} |
|