|
#include "Include.h"
4 q5 D/ V L! w/ Q, F' @, K& J) U6 `
unsigned char xdata uart_rx_buf[128];
3 f$ g# H: X- J, _0 w2 dunsigned char xdata uart_tx_buf[128];# u( t) b2 `% {
volatile UART_T xdata uart;6 ^1 d/ i6 ~$ w
unsigned char xdata uartGetBuf[8];( \) o) c+ V$ v2 W& K% f
unsigned char RxCmdPt,RxCmdTimeOut;# Q- _2 Y9 h8 n, w- ? x
8 ]0 l- ]( \, |" T6 ? V. vstatic void Serial0(void)interrupt 4 using 1& N, P6 Z* ~- M. ?" B7 g
{+ g6 K, }+ m$ f* l; V
unsigned char temp,head;
' |5 G7 {4 N6 M. |5 b! v
4 U. @: s( P7 O if(_testbit_(RI))
7 X! {' g5 X% ^% n6 } a7 ` {2 q9 }1 `) N; l- `; `9 ^
temp = SBUF;
2 }& D. _; ?* r& N head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));2 v( F& W" N/ ], x
if(head != uart.rx.tail)" H! U; ]0 v. U5 b# y0 j' }5 ^, Y+ u ^
{
4 G3 J. ~# V6 s, e2 x2 _ uart_rx_buf[uart.rx.head] = temp;
' d( T% I4 Y9 {+ }5 } uart.rx.head = head;
: _6 o# h) I, G& H3 k }else
! T7 q: Y2 X2 ]2 O/ e g- s/ _/ } {
# n+ ~4 ~1 \& f' p' O uart.rx.error = 1;6 X6 O j! q* I7 P1 \8 W* `- T
}) W2 G0 ]; M! b7 ?5 ]. a9 h
}) ?) N" p& g* x& i
if(_testbit_(TI))
! I( ]; Z/ Y; P {: u1 S! W6 p* F
if(uart.tx.head == uart.tx.tail)
: `1 r0 [. i3 d5 Z4 j {
6 O% S+ c/ H; w4 O7 m0 Y uart.tx.busy = 0;
3 {3 D* K( s, z& u, D% S. G }else
) h+ a$ k+ Z0 X, }% o, Q {
5 m! }* }2 K A# L& J SBUF = uart_tx_buf[uart.tx.tail];7 c! Q2 R' N$ o# x: j/ \
uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));
u: A/ f+ i t& I5 K }
- R! h- @( `& u* O# W Q0 @, D! R }0 A: @) R: g' @. A! Q5 m
}
9 K( A/ w# c) u//函数 串口中断初始化
! A9 O; }3 c# K Q5 G1 iextern void UartInit(void)
) O6 X% a, l' T* B/ C+ z4 y{" G3 T" R8 ]- Q& f, u4 w$ ~
RCAP2L = -(XTAL/32/BaudRate_9600);' m) h: o: Y+ n; S$ n+ C
RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;$ R+ n7 J z' k7 O2 H9 a
# h! }0 w j5 E- A2 I& c T2CON = 0x34;
* u" c4 N$ m7 s* i SCON = 0x50;
" `, T: }. R1 E! T- D0 q& w
: y4 X8 ^, E* F IP |= 0x10; //serial 0 high priority: M$ }6 T1 L6 [: I& |( v% U: e
IE |= 0x10; //enable serial 0
: @) }, `" s9 {. @7 j; ?. e) N8 f; F7 K% }4 l
memset(&uart,0,sizeof(uart));4 O1 y7 e. O$ P9 U
}+ h4 F M& W% E4 ~% f* H
// put char3 m2 m* Q+ C8 a* v6 P: ]% n
extern char Putchar(uchar c)
+ c9 J" _1 ^0 A. T{
$ O) r* B, J* k* o" r$ e0 A# i unsigned char head;
$ l) x3 r. n& i
" q; F8 o G+ E' X T& C3 X head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));/ G8 Z' F* p$ V* S
uart_tx_buf[uart.tx.head] = c;
1 `0 o C! G: ~/ S7 K! U y uart.tx.head = head;( F: M5 U3 ~5 O* [5 B
; P1 ^) x# J/ h6 i4 i' o5 Q' I if(uart.tx.busy != 0x5a)
) h! O/ O$ s7 h' c! x2 U4 e {. }# Q7 H$ ?/ L+ V2 f: ]. s5 H
uart.tx.busy = 0x5a;
, n; o, j( q6 }$ }& _$ U D TI = 1;* |, j" L2 G0 q) N9 _
}9 S' H4 h2 Y! D7 u: v. F
return c;
; R1 R- ]* J$ e3 t$ L) z1 X}; W8 u' W/ K& b7 p. k: D) {
//函数 判断串口是否有数据传进来
0 f* e4 ]6 P _9 U6 \2 i// 如果有,进行接收数据
k9 N; N! q5 j7 p. D- Uextern uchar GetRxBufSize(void)/ l: z4 V9 w- r0 p- l
{. }2 K% A$ H# u' P* Z
unsigned char head;( v) z5 l9 d' I# E( Y0 Q( T
$ Y5 Q$ N9 B) T5 X* p: N head = uart.rx.head;
' X- M: ~# }: d- V9 Q if(head < uart.rx.tail)* L& ?& x# @+ n
{) I% q0 j3 E* ?( R: h2 h5 l
return (sizeof(uart_rx_buf) - (uart.rx.tail - head));/ Q+ b) \8 B/ x2 k7 ]
}else4 d- I" s8 ]2 f% P2 B
{
^' G( H6 f$ [* O# _8 b. y+ X; v return (head - uart.rx.tail);
X3 ^# l% ~# x* k' ]+ A }
9 F0 C4 [& O+ \5 b% u# D: T6 _}8 C" |0 \' t- C( Z" r
//函数 从串口缓冲区取数据,只取前8个字节的数据
, i2 R6 Z, s! k! W! Y+ |7 C' O% Estatic void EnterRxCmdModeByPc(unsigned char c)- E" y& Q1 @& }' O# U6 u9 P
{
$ b2 ^ j; \1 J if(RxCmdPt < 8)' k% S- C0 L, J* Z! T
{8 P7 q# b! c" e& Z1 ^
RxCmdTimeOut = 10;
- n; \" @. W2 e/ h, Y6 r4 X% C1 C! x uartGetBuf[RxCmdPt] = c;8 H6 I! r1 S$ }+ O
if(memcmp(uartGetBuf,Updat,3)==0)8 G; c1 T; a" s! G
{
$ i4 f. b& Y* { ?3 R0 W EnterIspMode();% P5 O5 X8 g7 v" }! L3 z% F+ {
}
K. S x; o! J" M5 V RxCmdPt ++;. n* G4 R9 S$ E& g: k Q$ S6 i; L
}2 u3 R! n: B; B/ [
}
$ W, F/ }5 M& {$ S" `//函数 取缓冲区中的数据
3 a$ T( u0 S* X* D J+ a% _//返回
: ]3 ?% t. @7 I. @3 V/ Vextern uchar Getchar(void)
* K9 L8 H) X- W y. n{9 E7 }3 T8 M$ b9 u" u0 p) A
unsigned char c;# `( ~: F0 `' ]8 I
# P0 F' S+ ?: y8 d
c = uart_rx_buf[uart.rx.tail];
8 ?" B, X" p5 u6 \ M EnterRxCmdModeByPc(c);: l5 J# W: }/ V. B+ z* A2 N5 A
uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));
5 Q. D/ j) i3 d uart.rx.timeout = 100;6 r. x' G( i% ^ B" C) G4 k
return c;
, I( I+ y: |/ G5 \: k}' m @6 `# ~( c' h
//
- r' B4 k- _5 aextern void UartTimer(void)using 1: B8 \3 T2 }, o! r3 J+ T
{
0 n7 P4 W7 ^. ]. O: T9 {7 R0 y8 R if((uart.rx.timeout)&&(--uart.rx.timeout == 0))
! n( w" s$ n4 b4 F* P4 t; e: | {
. N" q6 y8 X5 ^3 m! V1 S* V uart.rx.error = 1;
! c1 R) [4 x# m6 b }
' I6 s! Z4 S7 K3 R}
; `7 E* [9 Y6 f$ s0 y//
: c {; H0 J1 rextern void ClearRxCmdPt(void)0 ]. l- j/ s& d( h
{$ y- w5 a5 r! |3 Z
if((RxCmdTimeOut)&&(--RxCmdTimeOut==0)). k( l M1 q6 |1 `
{/ R+ _. h& E n
RxCmdPt = 0;, D" D# w; J3 _# n0 Y. V$ i
}; `2 g2 [8 \. z6 H
} |
|