|
#include "Include.h"1 D V! M5 h2 v3 F; O6 n- \5 }% F
+ I6 b! q" |5 y' \9 k4 h" U
unsigned char xdata uart_rx_buf[128];
4 P) f. r3 k. {. C% t4 E! |unsigned char xdata uart_tx_buf[128];
' t* z! s1 T; {0 f/ Jvolatile UART_T xdata uart;
5 e$ _1 Y1 G9 W* v: Kunsigned char xdata uartGetBuf[8];5 J8 f, }/ A0 q& @" X: u
unsigned char RxCmdPt,RxCmdTimeOut;
/ z, h$ J8 C8 s& p( C0 t2 L' f/ _) s$ c+ f; g
static void Serial0(void)interrupt 4 using 15 K: g2 n# I$ u% v) a
{) x2 o' ]0 _, a% I0 J W% r( J
unsigned char temp,head;! \! S4 q& @3 n6 b1 G% N
6 F: v( z- Q8 l7 S2 Q% ?
if(_testbit_(RI)) g) S+ C1 ~% j+ U
{1 L7 k* C+ T d3 `1 U k
temp = SBUF;
% L: \4 P0 g6 R( W0 M6 o, q( J head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));
) `5 ` k, y( w$ t$ i( F if(head != uart.rx.tail)
7 u; e# f. H0 c" B4 J {
K7 G% C1 Q9 ]: K: v3 t9 x% _ uart_rx_buf[uart.rx.head] = temp;
6 q$ Z* K# V1 i6 O; C: H# A, d uart.rx.head = head;; f+ a& [7 C, w( H$ ?! `3 L
}else& y: c2 T, y% [ s& _5 ]
{
- E3 E J2 S. K5 M8 ]& @ uart.rx.error = 1;7 [* Q+ O6 O# h0 f: r/ `0 T
}
, n. m- \; `8 i1 Q7 y+ {" D* P4 ~ }, ~9 I$ G' Q h! b2 p3 E) J
if(_testbit_(TI))+ {! r) y2 R4 j' g% ?7 x2 f9 v
{
/ r6 U! E2 ]$ \0 c7 | E if(uart.tx.head == uart.tx.tail)
# v% z/ r7 a J# h0 o- A {! ~5 }6 Z2 N5 ~ ^; r; ]
uart.tx.busy = 0;
: y) s% F; ?2 v, B! r( i }else( s8 S$ o# i3 X7 M7 H+ M
{
" j" B( I5 L( ]5 T8 e% e' f4 R0 W SBUF = uart_tx_buf[uart.tx.tail];' c7 y3 h4 [7 p
uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));
6 o: w5 |3 m. ^2 c/ i4 P$ f }
- ]$ ^4 v/ Q, ` }
5 a; P! f5 g3 [, B4 Q9 o T}9 x; \+ z# j4 @7 N
//函数 串口中断初始化
" F; @# A1 @" H( g' }extern void UartInit(void)0 m* R" e( i& D
{
. A* ?' P* i( o" t' P RCAP2L = -(XTAL/32/BaudRate_9600);
) a" T. g5 E4 k' r RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;5 f( Q: f) a7 b) l# Q. }" v8 g
* i) N, ^* ~$ `/ K% Q T2CON = 0x34;
) _/ }+ [0 N `8 ?/ V+ G8 f SCON = 0x50;
& t' ^- \/ E" \( [' ]- b o. p3 f2 T( c0 e) l3 n6 b4 y
IP |= 0x10; //serial 0 high priority0 }0 E" _) u. Y* ]7 v3 s
IE |= 0x10; //enable serial 0
! ?3 ?5 {+ C8 `9 }& Z8 P: c* `3 X- C+ M' v3 K
memset(&uart,0,sizeof(uart));, @9 o! f& H' J
}
" R9 d4 y2 t7 U// put char: W: D# h) b/ Z: u9 b
extern char Putchar(uchar c)1 A8 S2 K8 E, e+ l; ^$ h2 z4 a
{
1 m6 Z- S2 o7 q# p3 Q unsigned char head;
# J7 J) i1 J/ w- V7 s3 e2 C: v6 o: f' X+ I
head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));0 c3 T6 @5 H: x2 H& d
uart_tx_buf[uart.tx.head] = c;
+ r( q1 m( L F; ` uart.tx.head = head;3 x! P: L1 k5 w; T) ?( a
( J% m4 a e! P2 T/ | if(uart.tx.busy != 0x5a)% P! B1 g. n7 G. X# d* j q1 l2 s
{$ P4 ~# ~' |8 p
uart.tx.busy = 0x5a;
" n; a# Y9 U: O! P( l2 c1 H TI = 1;
7 |& L5 O$ w/ a }: Z- G: W$ Y/ m5 s0 P
return c;/ A( f! w9 X8 H9 y/ X! k8 D
}0 [- R/ }4 e( C Y
//函数 判断串口是否有数据传进来
% O% X: m. P$ ^+ _// 如果有,进行接收数据
# k- C* ]8 A, A) W; k+ `0 p% `4 i% fextern uchar GetRxBufSize(void)
) ^5 D# _) u2 V# v& Q& t7 i% \{
: Z# L7 r3 y& y$ i9 L* U* n& w unsigned char head;7 i5 J( g; m9 T; x; s4 l# X) {
, Z) \" [: F8 l( k( m" ]# I* e head = uart.rx.head;/ P5 [# o5 `2 y$ |6 V9 }6 g: l
if(head < uart.rx.tail)
$ a! V% T' P4 G3 W" T {
1 B) P$ l. |, }0 |7 F( a" t- ^, X return (sizeof(uart_rx_buf) - (uart.rx.tail - head));9 P" T' _, E7 f1 R
}else
7 I/ E: p8 ^- h9 ~- Y! z. [ {
! H. N; ~/ I$ l2 c8 l return (head - uart.rx.tail);
% \% z; b# _+ t8 a: j( @ }
* k! H& h8 [0 ~( a$ f& ?}0 r1 V [5 E* K# I8 L
//函数 从串口缓冲区取数据,只取前8个字节的数据% s0 X7 D6 X8 b; N8 U
static void EnterRxCmdModeByPc(unsigned char c)
: S4 A1 l3 y, y+ M. R{
* n+ H! }2 ?% s M) |' m% v* @ if(RxCmdPt < 8)
- K+ ]/ X% J$ P; H& J: y% u9 o {
& {5 z' b n0 y3 M& h' [ RxCmdTimeOut = 10;
8 x* y G8 s. R, K9 W. R% T uartGetBuf[RxCmdPt] = c;
7 u+ `4 q7 ?' E2 q if(memcmp(uartGetBuf,Updat,3)==0)4 h @) k3 i& s/ w
{9 o0 C- P; \2 r
EnterIspMode();
) a# ?5 O0 q' q$ [; ^' _ }
`' Z- d0 M3 \# b# b" Y8 g RxCmdPt ++;' X0 V4 ~2 u1 v% t
}
8 |- h2 Y" d! |- ?- i7 d}, v$ b+ W1 z0 g
//函数 取缓冲区中的数据 D2 g% P8 z% W+ e8 h
//返回2 q4 s7 k" v( j( [- s( k8 c( n
extern uchar Getchar(void)
6 E& ?% W5 j+ i4 |{
. {5 l6 d% h, g8 r- j% D( G# @ unsigned char c;
' h3 l' M( R7 `3 g' I: U9 P1 P) ^5 j p- h
c = uart_rx_buf[uart.rx.tail];
8 ]9 x! |9 I# \' m) q6 A1 S EnterRxCmdModeByPc(c);
' C; G" ?9 |& K( u/ U r1 R+ f. W$ t8 V uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));0 b0 R5 I8 R4 Q# d
uart.rx.timeout = 100;" y7 }0 h \* s1 z
return c;
$ u# T" C+ m8 K, A% ^) C$ R. S% z6 c}, f6 q3 c4 ?6 p/ U: ?
//0 U: E. c8 C* `3 F0 @
extern void UartTimer(void)using 15 `9 R! K% A: Z1 l
{
3 r4 w" I" x5 |' k8 h% D if((uart.rx.timeout)&&(--uart.rx.timeout == 0))
& R1 w" s! K4 ]! s- F: b3 @ {
6 H* ~( q/ B+ T uart.rx.error = 1;% t& W1 Y* {7 t6 @! T% s
}
" |: {# Q2 k7 ]/ n Y$ o% E/ C}, p9 v6 N! s- K: V/ D
//
( F% O0 P9 W. {8 Jextern void ClearRxCmdPt(void)# u. O4 A" {" I+ b6 M* V
{
# I5 r6 h S) k4 ` u" [ if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))
* i6 A) U$ W* W* u% t1 s {
) J$ f q' R$ c9 i4 o RxCmdPt = 0; \8 R4 f9 S% [& x7 P- G
}1 F( e0 e/ f- C; f/ a& M, P1 [
} |
|