|
#include "Include.h"
* y( c6 @' M3 l: j i! f& c! N& b
s+ I& L" t2 p) Dunsigned char xdata uart_rx_buf[128];' ~* z! L. t- k* ~$ w
unsigned char xdata uart_tx_buf[128];9 g# @) p0 l2 V& j
volatile UART_T xdata uart;
: @, o( |/ Z8 D/ U6 F M# Junsigned char xdata uartGetBuf[8];
( T3 E% D' L4 m% c( qunsigned char RxCmdPt,RxCmdTimeOut;: d3 z6 C4 k+ B0 p" T
7 |% d/ D/ @! Z! I4 `% E
static void Serial0(void)interrupt 4 using 10 Y# _, [: V) J% w: i7 ~* k% p
{
1 B' \! p9 ]# k4 e. ~5 k unsigned char temp,head;5 `: ^. V% ]+ t1 {" {
2 E) f% i% @4 y2 [8 K8 P. S( y
if(_testbit_(RI))! m% q( i1 e0 F! k4 V' E
{
- b0 T' F& s/ V; U temp = SBUF;
! m b) ?- ?4 k. U head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));9 R3 x! }9 f) L& a) x
if(head != uart.rx.tail)& c* a7 m1 b: V; [
{
2 n# [! X" ]$ f5 l4 e7 c6 m uart_rx_buf[uart.rx.head] = temp;# j! a2 V" X1 E' o
uart.rx.head = head;5 U7 f7 E- k5 b) t
}else
( r" H q' j) C" U9 O8 d {
! A$ M8 u" ?# Q& z6 F3 | uart.rx.error = 1;
" W! g+ p: j! Z- Q }' l6 B3 ~1 V8 Y$ c8 N9 B
}$ C% T( h, U {
if(_testbit_(TI))4 C7 G4 z. _9 j$ |& N' \
{
* \! a2 t% q" E if(uart.tx.head == uart.tx.tail)# d7 D( I) `' r7 W9 o
{
/ A, K, |* W' o |7 r9 v uart.tx.busy = 0;
* O4 H2 W. q S/ u1 r$ A! z }else' f/ R) l# E9 j/ U1 v6 u: i
{
* X( d, ]3 _ }1 @ SBUF = uart_tx_buf[uart.tx.tail];$ ]8 D/ U+ r/ d% W6 V6 H' E) `
uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));
6 Y9 Q( x* R" y+ h! Y }( _ l0 Z. K) A! r( {- V
}
; D3 I; O; e/ o" {: o3 l% a}9 @% _( u- \# n0 F+ _" r2 l
//函数 串口中断初始化1 Q* ?( O4 N: w+ e% {" V. W# g
extern void UartInit(void); W6 l' O S: `$ I4 _. r, F# }- }% y
{6 R% X3 H& i+ V
RCAP2L = -(XTAL/32/BaudRate_9600);9 m. G# p. H' j' i) ^, o
RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;8 z5 p4 `9 s: R |( _5 j: J8 E
! m7 A' h) U6 G* K" U. a3 F) ` T2CON = 0x34;
9 c5 l9 E M* N5 _5 [. K1 y" { SCON = 0x50;
3 \7 p8 E( z, o# J# J8 S( x. P4 C- `. H$ ~0 f8 B
IP |= 0x10; //serial 0 high priority
Y# ]9 }2 M% U IE |= 0x10; //enable serial 07 o' o0 L" \! ?% T2 {0 d0 S
& c5 b, D2 U$ L# z% y memset(&uart,0,sizeof(uart));- N2 H9 C1 k; A, p: @: e
}
' c m% E" N/ t9 c- s! k// put char
% V# j7 t- Q6 t/ _& D9 P+ _+ E+ aextern char Putchar(uchar c)
1 j3 S" v" H6 [' T8 d2 G9 u/ i: ~{
' v) y2 t$ Y* Z unsigned char head;
/ M9 z3 v& I( B: ^6 a
6 s [2 }* Y# y% _1 g7 p Z Y- i head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));
: r9 J/ F. G4 d8 M# q uart_tx_buf[uart.tx.head] = c;! C1 G* e$ M! q4 x' K$ C' `
uart.tx.head = head;
! a6 c$ Y- S; p: J4 C' l, E) G
3 s: p8 K) M( I: R. _, T1 Q7 f; k if(uart.tx.busy != 0x5a)7 t6 { `4 D. k, W
{! l* ?! _0 ]- p$ a% \% r/ }" M
uart.tx.busy = 0x5a;
5 R. B7 X9 q& v7 j& s8 J( h TI = 1;8 i' c% w" W( [ F
}
5 h. G0 a& m. m) Z# ?; a5 x- V3 { return c;1 M* X! d" \/ ~: \+ X1 a! m
}
* C, l! \# ]: N t//函数 判断串口是否有数据传进来
& A4 Z. A; g2 H+ `& G// 如果有,进行接收数据0 B: F$ Y, S4 ], T' M0 i
extern uchar GetRxBufSize(void)- n1 d/ u2 R$ q+ m: j
{6 X) k! }" ] {& D/ ~
unsigned char head;
f/ j4 ^8 I) |- Q
9 J/ K# o( K0 ?4 L3 C- k head = uart.rx.head;
! y: T5 i" p( q% X if(head < uart.rx.tail)
" p: [ S8 s/ \- y$ Z {5 i8 }3 d) Q7 X, _4 t
return (sizeof(uart_rx_buf) - (uart.rx.tail - head)); v* X: q, C( J5 o7 l
}else
5 g5 S; L) U7 ?" { {
7 Q" Q4 ~5 j0 S- h- h' r return (head - uart.rx.tail);/ `; W9 Q' M, A
}. T2 c2 H2 b$ a. f) z
}
/ Q5 s1 r: Z3 G3 p//函数 从串口缓冲区取数据,只取前8个字节的数据
5 s h1 N- h# g, O& \static void EnterRxCmdModeByPc(unsigned char c)
6 @! S0 \) F0 f5 g& B% M{+ s* S# {! C+ ~' \2 ^
if(RxCmdPt < 8)
/ H- G$ H* F5 E$ |7 L {
$ j+ `, ~, d \6 f. r* i7 \ RxCmdTimeOut = 10;. g7 b. |: l. v* A
uartGetBuf[RxCmdPt] = c;
4 @- n% _" W( u; }+ t: P6 ~ if(memcmp(uartGetBuf,Updat,3)==0)
4 O" p- \# u: R6 O' t; W, u1 t9 a {/ f. L& q0 u" v+ }
EnterIspMode();! i7 W* h; M5 F/ X% V* L
}
( S: F9 s" b; y RxCmdPt ++;% T( L& ~5 ~( t( H& S' @; e
}
- \9 ~, O/ M0 `/ i0 K1 [}% B; l( S9 C& r( r+ x* S
//函数 取缓冲区中的数据
y0 z+ j) t: A6 X0 [, J//返回- l1 P- j7 S, j1 o/ @+ X
extern uchar Getchar(void)
+ P8 d z: j, s/ U{ Z- N7 h0 L: a9 [) u9 `) |" V% {
unsigned char c;7 f0 ~; J& I$ D5 [0 }2 j; _, _
3 {$ W* O. c+ ~6 [# O c = uart_rx_buf[uart.rx.tail];- @* m& t6 R5 x7 ]" _, B9 K
EnterRxCmdModeByPc(c);2 A$ W+ L* s& ]
uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));
1 O2 w' k$ y8 e% B3 b6 O6 y. V uart.rx.timeout = 100;
0 G; a' e- T0 Q return c;2 H& f0 U) W/ T; H
}6 S* R6 I% @; T: w' g5 x& t
//
+ [; W4 I' ` g( T" E' ~# {1 Vextern void UartTimer(void)using 1
- z8 P6 I$ Z' u3 W( x{- U) E& T- A5 z( F2 q: a
if((uart.rx.timeout)&&(--uart.rx.timeout == 0))8 Z8 O! X. t; _- j. u$ o
{0 w9 W! R. c8 f6 g3 C: o
uart.rx.error = 1;- H5 V% P6 V$ X1 t2 m
}8 x0 v, D6 Q$ T+ d n5 d0 |5 F
}' K) m8 k$ a; O, T
//
; ]1 m+ G) [+ N* S; v9 U" lextern void ClearRxCmdPt(void)( e' i. y. Q% s) b) N
{" u- w1 R% {6 t v" p" Q- R5 A1 Z
if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))
, C7 t- }, q+ R$ @ {
+ M4 Y: H& f! L3 Y& j* b RxCmdPt = 0;
; ^- f- w* S: ^' |9 m0 `1 d }
+ X% l7 u5 T% b) u7 ~5 J# H1 b} |
|