|
幸福万岁 发表于 2013-7-23 11:52 0 Y j4 v4 t. a W y" T2 g
这个函数也可以写的简单点 2 w ?5 w% A9 D
我比较喜欢写成 这样 一目了然
0 s' P( ^5 f5 Q- U( a哈哈
, q6 F; d; k4 f非常感谢你的帮助,确实是延时问题,目前是发送6位,接收10位的问题例如发送5a 06 00 98 00 01 接收为5a 06 00 98 00 01 01 01 01 01( M/ d. n ^ r$ K/ \: j, ~
4 t7 v' i" r: x2 k#define uchar unsigned char
! L3 _5 n4 u; I4 m. r; S8 @' uuchar port;( X3 v) J; @& q& h/ ~" X
uchar rec_data; B# i# F: d. v1 i7 y
uchar str[6];
; y7 p: ]& q* y- P' n( H8 kuchar point=0;
, {$ V; E4 c7 z. H4 S6 l9 X! o6 \- Tuchar flag=0;6 f9 D$ Q8 W/ W
//串口初始化
2 h" c) Z2 O# @- Z; Ovoid UART_Initial()
) W- b8 Q& F0 g+ R9 y9 c{ 1 Y, X8 ]: E2 m# ~4 y
SCON = 0x50; //串口方式1,允许接收8 \5 E1 G" t: {/ y* ?/ E
TMOD = 0x20; //定时计数器1方式2- g* x# \$ G8 R: u
TH1 = 0xFD; //9600 波特率 FD
6 Y' R. ` I1 T& C; A3 p0 w" I TL1 = 0xFD;
7 O G& p. a. g% S0 q EA=1; / [6 g4 D; Z6 ?8 k/ \
ES=1; * d+ X9 e0 t( R" e# g
TR1 = 1;
, {6 d6 Z3 u( ~+ [ ?}
4 N0 p, o3 ^$ j2 o9 S0 n5 {
' e2 o, c4 ]1 {3 C. \! Wvoid waitsend()
7 s5 S J/ |/ k8 R3 j- t& i6 O{
& g- Y+ P2 o* R; u: c TI = 0; " k' i. G9 v) D" }
ES = 0;
# h3 o1 H& s5 M5 K while(!TI)8 e" o) b' C |* g
{
" Z: H+ C6 s0 { };+ F; h2 U6 V- \$ Y1 n
TI = 0;& }$ a* F" ^ z- \3 Z' [3 Q4 P* E
ES = 1;1 y0 y! \1 @# |6 @- B5 h6 n! ?# U5 e+ h
}% o8 F: n! ]& w8 S t
1 P" Z' E' Z" Y. V0 ]6 Cvoid delay(long i)
$ K$ ]) q8 ?: D# B: k* D+ j{+ M1 V& w. \7 @+ }1 I8 c$ f# J5 g
long j;
' v# a9 A' k2 _: s" _ for(j=0;j<i;j++) ], j. V4 i4 d j& j
{- A' _0 s$ g! W2 I. \
SomeNOP();
# J5 Y- L. v/ C& w1 T SomeNOP();
( u* k) u" z* a. }3 n }
; B, a; h: h+ U& {}
7 `. y: E% A4 Q \+ [' [ b7 s9 k1 W5 e: d. c
void delay1ms(long i)
+ ^/ g2 _ }5 m% a7 a{/ R3 p7 C( f& b* h# S6 a
long j;
7 B+ O& `4 r, t' y& H for(j=0;j<i;j++)
4 J& O! v8 }- E J/ m8 L8 G {
5 i+ [. c% S9 C$ O, h: ?- s delay(70);
2 m/ O5 D; ~8 v5 h# m- G+ Q }3 P7 L" s4 V0 I, ^3 e' q
}1 j3 o: o- P( \" r
void COM_REC(void) interrupt 4
9 u) w5 N$ A4 `& C5 J{% d! r7 \% ^: P( L$ @ k
/ O0 I& u c4 k
if(RI)
3 ^0 u7 r1 k/ y; R9 A! U { //清除串行接受标志位
6 O9 [; y2 c$ x1 g- T2 s* ~) R RI = 0;
3 C. X) K" y2 z d3 Q" ^# p$ g rec_data = SBUF; //从串口缓冲区取得数据
7 ` u! [" q5 A5 F z, z0 Y# Q for(point=0;point<6;point++)2 ^" _1 }. T$ B4 {4 l
{: G: i# r! d+ P/ U* i
str[point] =rec_data;
7 O1 V& @3 I' o! ^ //delay1ms(1);
, i4 b v! c7 _ SomeNOP();; t0 F5 ]. |1 i8 l; e
SomeNOP();* ~2 Z2 t( z$ K2 M
}! u3 }. e- A: X( q1 \
point=0;
$ A. p0 i- T; h; s' v flag=1;
9 g. X# {$ F, c% X, A+ T }
5 x) d9 w4 v( C5 ^9 `8 S8 {, c- ]" R}0 S& Z* i* }3 s+ l# d( d
void COM_SEND(void)0 I( [- H9 W+ ?
{* ?/ X @: C U/ [% [3 Z
for(point=0;point<6;point++) //连续发送数据
- C! a4 M. D6 L0 {1 V9 m7 J {; ]2 B6 T3 f$ c4 ]- a8 B/ H
TI=0;" p* R5 M+ W6 Y9 ^# V
SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口
% u# {4 M0 }( i( x# |" U/ W //delay1ms(1);
" d# f, \5 G. E$ B. I SomeNOP();
( A0 q3 f$ y5 n SomeNOP();
+ h) m6 p! A4 }0 |' t SomeNOP();% T" `6 q* R! Z* M
}
& l# }, e- K6 ]' W; K$ G! O: p //SBUF=Read_OneByte(str[3],str[5],str[2]);2 b9 b+ ]8 K$ W2 C* o5 V. n/ D
# R; }5 S/ c& {6 L( X}
8 A, d6 [& \% P2 _& j; _void main()1 e+ e3 F2 F# H3 T" C
{4 d/ L, v0 r6 o! |' t/ z& H
UART_Initial();
2 Y; z3 X1 c' O delay1ms(2);
! D4 z4 ~" u+ i$ K1 v2 `( c5 s( n while(1)2 i6 i" [6 ^: R9 S
{
% \, Q, C5 W: z( Y2 C' ?- q% N while(flag) ]( t, i8 U% J6 ~4 J
{
5 F: _- T! g4 B& \ //RI=0;
3 Y: w! K: k! ]" z COM_SEND();
: j! a R y0 K flag=0;
( e6 b' O" J- l+ \ }
$ e5 r7 L- G7 _, Q$ C1 `& T' Y6 S }
# A; [+ K3 I# R7 [# |} |
|