|
|
幸福万岁 发表于 2013-7-23 11:52 ![]()
0 u) j, { V5 |6 f5 f6 `, A5 b9 B这个函数也可以写的简单点 , m8 i5 G5 Q* f4 W9 E& k
我比较喜欢写成 这样 一目了然 8 @1 n3 c0 R8 R% ~
哈哈
6 w* U& h0 [/ K, h& ^. w% f非常感谢你的帮助,确实是延时问题,目前是发送6位,接收10位的问题例如发送5a 06 00 98 00 01 接收为5a 06 00 98 00 01 01 01 01 01
7 z, n# x3 v2 c4 O- X# m
6 m- ]3 E8 s, [/ O1 T N! d#define uchar unsigned char
0 f& i6 j6 `% k. H- m6 t" U8 W% {uchar port;! @3 e3 I% c: o: G
uchar rec_data;" z2 t \- O! [
uchar str[6];
; H/ w7 F6 c' y3 W$ l7 B5 H$ E! _uchar point=0;
& `) [$ j) p4 c1 F; G8 ^uchar flag=0;1 S- a3 t% E1 d# @
//串口初始化 9 ]6 Q; n6 V0 g h1 R
void UART_Initial()
$ L, ^3 L( l, I) }4 ~7 c$ c4 D8 i{ ; A, }! w4 N0 Q9 F
SCON = 0x50; //串口方式1,允许接收9 m9 k7 o2 Q3 |; W2 \7 c
TMOD = 0x20; //定时计数器1方式2( d/ E# X) T4 x" N
TH1 = 0xFD; //9600 波特率 FD T- T2 C/ B5 x, ^9 N
TL1 = 0xFD;' M+ e+ Y$ m V h% {
EA=1; * A5 E7 F1 M. M) m* t
ES=1;
- ^" W0 Y+ B' b6 y' f' m4 t TR1 = 1;
/ U8 b/ a3 e: E7 b' l}
- n+ U+ u6 X6 }; X2 ~ % w# h' ~) q6 t! |3 b
void waitsend()( B( e' d) I$ t4 U
{
h% ~6 U' d V TI = 0;
- X: L/ r4 s7 J# g9 Z* a, V ES = 0;* E; U& E. _" N6 R* j
while(!TI)+ u4 \. \% k& V, W
{
6 F( a$ S& C. q# U# i+ P7 ] };: F/ r' {0 s; |0 W
TI = 0;
* Q; x& j# t! E ES = 1;, g! a8 M6 ]. M4 m% R3 P0 E
}
1 I, `( W' A) Y) }9 n6 ^
+ h0 f7 N- r2 a: x% Gvoid delay(long i)
( S4 f8 Y& |- h{
5 Y4 r6 C1 \' {. D3 g' G# a( U long j;
- j, o- |' L. p8 b3 L A- z for(j=0;j<i;j++)
* I o% u3 p4 h4 U) k1 V2 V. b: L4 ^ {
' z0 T* H: T4 Q! k8 j! \& s! h SomeNOP();
1 C4 X" V9 L1 I9 G. } SomeNOP();
0 l6 l3 ^! Q" C6 ]' } }
- U) {5 u4 t4 a5 a}
6 c% o# K. c2 x' s) L$ H4 a& s" l3 f8 ]6 I5 r) }
void delay1ms(long i)' b! b: u0 D1 r: j, i0 I4 z
{6 \3 m' |* Q8 D) ^. @: \. I
long j;: V. R+ V% _) K7 Y$ u8 F
for(j=0;j<i;j++)
0 S% ? g# L) X& ^3 t; s {. J8 _1 A3 S5 n& M
delay(70);
9 N4 d7 ]* y% l) H3 a a2 w }/ ~: F$ v9 t. ^* L: n9 u
}
" T: [8 z8 E% S3 K0 {4 E, Uvoid COM_REC(void) interrupt 4
- E8 \. N0 ?9 ]7 C{ [' ], a1 L, I# X* \
6 _/ T. a0 X3 H* e0 A/ {1 v if(RI)
; b5 r& p4 @% |; c { //清除串行接受标志位1 e" {8 |7 D& R# z! W/ K H
RI = 0;
1 e% _9 y1 G" U4 g% X rec_data = SBUF; //从串口缓冲区取得数据7 V$ {5 L t6 }* M
for(point=0;point<6;point++)
( m4 }2 @0 M* ]! H4 _; }3 S9 X! u {2 N# \" P0 j+ a* g- N% b2 f
str[point] =rec_data;
8 S6 G5 z& B u2 V3 U3 ` //delay1ms(1);1 ?* L9 x/ _+ S7 @+ D0 \# M
SomeNOP();$ v+ ~3 p% s' u; P M. x4 m* y
SomeNOP();
3 j( ?+ q+ j0 e* b4 M }# d4 w5 H0 X* v% i3 A @/ A
point=0;/ c" ~0 a0 b- g2 @ g
flag=1;* K1 k3 i5 j8 `, @, p
}
/ c X) V9 j! R' _}
$ P+ R, V, z8 W$ k: Bvoid COM_SEND(void)
7 t N0 n- a: X9 d{
) q6 O) J7 T& C: U$ r6 c( i: _4 kfor(point=0;point<6;point++) //连续发送数据 % f+ @' X8 t' U$ n% o; q) ]
{% l: A; G! z$ a! s7 j# k# q
TI=0;
& h& e3 q4 {" ~+ N5 B SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口, `& Q* q' b& {. }9 M, R/ p+ U/ w
//delay1ms(1);
5 D, Y0 z* Y+ ]% ~1 s6 z& C SomeNOP();! L$ Y) }% V2 J. d
SomeNOP();8 j; b7 a% Z( E+ n7 d
SomeNOP();
& P& _+ C/ r: `) V. X1 @ }) @6 v4 l5 ]# @+ G
//SBUF=Read_OneByte(str[3],str[5],str[2]);( T, |! R) k1 W0 y
$ Q+ o5 ?: W4 r2 q; M
}8 o/ a ~; _% X
void main()5 Q" ?6 R1 p$ f4 b+ R$ W) P
{3 S( h. L) H! f* D
UART_Initial();7 D9 M% V% d7 Z& U+ H
delay1ms(2);
' y2 M- s! j; s; _ while(1)
" [: \' K: U6 n' f* ~9 c" j Z {
* l: W% O/ ~) m3 n while(flag)
. t! {$ |6 s( ^' @; ~ {$ Y3 X& z& ^5 P4 I
//RI=0;
4 H- Q7 {- q+ V, U6 ~+ O5 X$ k COM_SEND();
9 Y( x5 x/ ?) f2 P- i8 w flag=0;
# [1 F7 @6 i' D2 V6 ? }/ {! Z3 W+ b' [ L$ h
}' k1 f3 H1 V$ e/ y! i+ U# X7 n" {. q
} |
|