|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机模拟串口程序源码
1 E4 v7 o, {0 }
2 ^6 s) G2 Y" ^$ e N! g2 W
; z' \8 o9 k5 @8 k9 \# e
$ w- K6 P& _; V& i8 d% O8 ]* [#include "Usart.h"
# T: | E( ~- `- U5 ]- Dbit RXD_OK=0; //接收完成标志位% x0 Y% B b2 M4 ~+ K1 D! f
bit TXD_OK=0; //发送完成标志位
% g& a# }9 [% N* g v% Bbit Send_State=0; //发送开始标志位
' O/ d. M: @! [! x/ [0 b) V7 {+ cbit Sending_Flag=0; //发送中标志位* H$ r1 [( A9 b* z3 D6 h5 J
uchar RXD_Data=0; //接收数据缓存区0 A! C3 C* v# Q8 J- Q% T
uchar TXD_Data=0; //发送数据缓存区
; l9 T7 z/ d9 D: Osbit led1=P3^6;
: h: L% U8 P( X2 r6 w/ Z8 @6 Xsbit led2=P3^5;
! E+ f, V/ m W5 W, X- psbit led3=P3^4;
- t0 O- s" V3 c/***************************************************************************
) F+ T# q, w: I2 S4 S*函数名称:Usart_Init(uint Baud)- v2 B' g/ K1 \5 d
*功能 :串口初始化 波特率对应定时器溢出初值(11.0592)
) `6 b9 A3 { d* R$ E$ k: a*入口参数:波特率 4800 192
1 b+ z+ F+ x- \5 j4 y6 E" |*出口参数:无 2400 128
* k; ]4 k2 d4 c: h. P*说明 : 1200 08 \5 n( ]: M2 Y" {6 x0 F. N
***************************************************************************/
9 q1 [/ S: Y+ p- E K7 avoid Usart_Init(uint Baud)( N: J- v7 y, F) t1 n, w
{
( ^4 W0 u. f) O uchar T0_Low=0;
$ J5 g3 k: c) T" D T0_Low=(Crystal/(12*Baud))/3; //求出定时器初值 3倍采样速率
2 y9 x$ f+ v$ d9 [4 A* {! B; H7 b0 k2 I TMOD|=0x02; //定时器0自动重装模式9 ~5 Z$ C' \+ V/ R, U
TH0=TL0=256-T0_Low;# z, U1 s( s" Y1 L: n
ET0=TR0=1;2 o3 j' d$ h8 k9 B K
EA=1;5 w1 R3 P1 N9 o* H2 t, g4 s* @
}
+ y" Y G E/ J3 h/***************************************************************************
8 S( j6 b, s6 p4 ^& c+ K' \*函数名称:Data_RXD()
1 J* M2 |0 |3 [: O2 I* x" }/ B*功能 :数据接收! N' P- ?9 r5 h2 j
*入口参数:无
* y1 F3 [1 W( b5 t# B2 T! j*出口参数:无$ t. q0 D0 ?) v% O# C9 ^0 o! s
*说明 :$ T8 j0 K1 a+ U' ?; E4 v# }
***************************************************************************/
+ F3 f# z7 p' W9 S. d# R g1 |void Data_RXD()5 Z* C/ T4 g# F: B! Q2 A! R
{
* {% r2 n8 w% u# v) q; P static uchar RXD_State=0;: _8 N. B" @" Z* m$ z
static uchar RXD_Cnt=0;8 C% G l6 X5 M4 e, N& C
static uchar RXD_Count=0;# h( X! I* h. ~5 f! r7 n% _
switch (RXD_State)
. D( R2 Z& Y) [, D* b/ V8 S {
' L! F6 I. v0 b4 L# Q9 O case 0: //3倍采样速率采起始位
, F9 Z t. l. f z6 d/ [2 W { 4 y0 Q, _' ~7 J* N/ x, k
if(RXD_IO==0)) K# @) ~$ |4 s
RXD_State=1;% L3 J! ^ `. i+ M8 g
}break;5 _6 v( C0 g5 e% i! G6 C
case 1: //采到两次起始位5 H8 ` P2 d* I& m! q6 c6 ^( |
{ //采样频率校准到1/3与2/3之前
* a& L) {/ Q9 E; ~/ Y7 s if(RXD_IO==0)
# F- ^- ?1 B" k% l6 c* Z/ l9 E RXD_State=2;
8 u9 T5 V& A+ ^- p) F else RXD_State=0;& u* k. T9 N7 q) U) J. L2 J
}break;' ?! h8 D+ V& \) u/ Q: E5 Q
case 2: //以正常波特率采样,取出八位数据位( {/ \! w% T3 R/ Z
{+ e. Y1 ]# L+ `' q0 w6 d' m. A9 Z
if(++RXD_Cnt>=3)
4 K/ ?2 v/ s$ i' u' l a {: b5 `( |% _4 V* u. z3 m5 ^. { k2 ^) {
RXD_Cnt=0;( T- k, [. ~; {* O* G C, F, M" x7 ?
if(RXD_IO==1)6 r& ^9 |! `5 N7 [* \ A
RXD_Data=RXD_Data|(1<<RXD_Count);
6 A9 R( S9 K5 o9 h+ ? if(++RXD_Count>=8)
7 B. }& ]2 j( X7 O D: Z8 C1 h {
5 z! K- Z$ `7 e' e7 r8 b RXD_Count=0;
: I. s! Y' ~3 {% b, M* C RXD_State=3;
. O4 u2 i8 Z3 i) j1 _ }( Z8 J& j: H# N2 S# ^1 @6 \: A
}
5 J2 U6 N. d. F; g8 \ }break;' r; o# z0 g: y+ p! C. w% U
case 3: //取出结束位) Q4 x" ^% w4 D7 T4 K7 J" U
{ //结束位正常接收完成标志位置1
0 Z2 l# @$ i4 a D1 F if(++RXD_Cnt>=3)
X8 M6 u! p4 I, Z9 a/ H {4 W `) X d8 U5 |, e9 G, X! R
RXD_Cnt=0;2 v5 m+ n! G+ m$ q' i' R
if(RXD_IO==1)# i+ i% P( h$ B
{
8 G. l/ a j) i! n3 b- i5 w$ u, K RXD_OK=1;
4 A* r; j3 ]4 c RXD_State=0;
, e/ }" t/ j K6 ?; `/ S } 4 X+ P( `/ ]# r' H# r, V/ p% ~! u
else
- Z H9 |5 [2 Q+ x6 f {: G' G/ T) N/ c* |2 \
RXD_Data=0;3 W# _: B7 _$ O" v: Z
RXD_State=0;
% N: s6 O5 r, t$ z' F }
' k8 h( b4 c7 A: M2 N3 v; } }
3 \4 m- H$ A v9 c }break;
" B) K( v* i3 }, X& q } $ F- B; ?( s/ X( R! l5 Z
}! x' g: R) Y: `1 z; q
/***************************************************************************- U5 O( u. x) E9 s& M4 x+ i
*函数名称:Data_TXD_Buff(uchar Data_TXD)
* ~0 |$ `9 w" k% O) E9 d*功能 :数据送入发送缓存器. a- w+ @$ M( y0 w# c2 f3 J) {
*入口参数:待发送数据
; ^' p8 K) z: H7 H7 t5 U- o8 _3 o*出口参数:无9 j0 E5 ?5 z. q
*说明 :9 E1 h& F" N6 ^2 w" j! {, N
***************************************************************************/
+ k) u [- X" p2 a+ Ivoid Data_TXD_Buff(uchar Data_TXD)/ s+ z' R) D) W- Z; V
{
( C% T5 \% y4 D$ ]6 I/ y, B& h
2 e q: k, j" ]3 I1 H TXD_Data=Data_TXD; //数据送入缓存区3 Z- s; H- r7 Q: I* s3 x
while(Sending_Flag); $ _! P& a; j4 c z5 S- P" L
Send_State=1; //发送开始标志位
g& U$ d1 X' G7 u* U- R7 g H}1 ^8 \& t% x5 f4 d7 t/ I
/***************************************************************************/ a+ L, \* I3 Y! ] s) Z
*函数名称:Data_TXD()
, r; y+ h/ o2 c) @*功能 :数据发送
, d8 Q, _$ @* k( l# ?*入口参数:待发送数据. m4 t" {. B F. A/ E
*出口参数:无
( @1 S. I+ K( s4 E4 A*说明 :) U0 O; s2 M& r6 F( f
***************************************************************************/
( u) F i& K8 {7 Svoid Data_TXD()1 e! y3 K7 v1 |4 H- c9 a
{
% w2 m% j, m. Z6 C static uchar TXD_State=0;
! S# O' v. O3 g, [* ]+ d# G8 b static uchar TXD_Cnt=0;8 X- B' G( M J2 B/ _* T" [7 v
static uchar TXD_i=0;% w- |% k6 y+ ~4 p1 ~
if(++TXD_i>=3)
5 S/ c W" H" `5 s {5 h% C5 Q; G' `
TXD_i=0;! a' R2 ]+ b# a& \. W
switch (TXD_State); _/ i8 _/ B) Z- r7 d* l
{' c6 ?' J/ O( }% Q# Z0 ^- C
case 0: //检测发送开始标志位
* G: b1 ^' J. W p4 d. t# b( w {1 l. U3 c3 Z4 R/ M% g9 r/ y
TXD_IO=1; ! t$ f& _3 P% l" @# Y
if(Send_State==1)
4 z1 z3 G3 q! t, [ { 5 D& C1 D$ }9 D3 r' V
Send_State=0;" p |. L3 y1 ~3 b2 g; m
TXD_State=1;
- Q) g( z( @4 |! O; K0 m Sending_Flag=1; //发送中标志位置1$ ?+ C1 {4 E8 Z& e
TXD_Cnt=0;
8 |9 s2 e, P) S0 j& } TXD_IO=0; //发送起始位* |0 v8 G6 @+ `- J5 F5 M$ \' I& m
}" q# P* j2 I( Z' y L
}break;& T5 y$ R3 E( `
case 1: //发送八位数据- }& H% S& w, L. ]% n
{ //八位数据从低到高发送+ a. `% d' K) O3 |
TXD_IO=TXD_Data&(1<<TXD_Cnt);
' s/ \' @4 l8 M% a/ \ if(++TXD_Cnt>=8)3 O6 j7 s# R9 w0 G, `3 l: K, [
{4 F9 J9 N" V$ V$ Y! l% r v( Z J. l
TXD_Cnt=0;
% X( [$ J# }. G/ g3 m. K TXD_State=2;3 f- s- O5 ?1 U
}
. ~* x" N! ]1 k9 r0 ^' ^ }break;0 U8 i+ K$ H, l8 i ?( J# b
case 2:6 F; L b) |/ | y' Z S! ^
{
4 p( c9 a. g1 Z% J4 L4 P% k1 i0 \2 Q TXD_IO=1; //发送结束位0 k6 @( W2 V/ ^+ l/ L& }: I
TXD_State=3;
: [, I# a* ]. b" d }break;, U6 k0 G( q) C0 P0 R3 u) d- |
case 3: Q9 k8 J6 ^! _
{
& o9 w6 Y! I" w; { TXD_State=0;) v6 H) i* k4 p
Sending_Flag=0; //发送中标志位清0
- W. Z4 Z5 U, p: K TXD_Data=0;
0 T% Y' f; h2 V5 k TXD_OK=1; 8 u' z, h3 a! X2 h
}break;
/ p2 j( j4 ?% r% u( V- D2 [ }6 R6 T& \% N, K5 y( m- w% Z
}
4 E5 S, ^- J. x2 v}" `) u$ k$ B! D$ K# y- z# k/ A, ?4 m
$ t, z1 k2 L+ p$ ?3 g; |( j' R3 n4 b
/***************************************************************************( e) E$ Q! @1 n6 `- m
*函数名称:TimerT0()
$ k+ X' ~* B2 r9 t( K# W*功能 :定时器T0中断5 X% U7 Y! F1 K: e( J9 J, L5 A
*入口参数:无
9 k6 N( |& t( i*出口参数:无. }! _8 _/ \; S/ u" h: {0 E
*说明 :9 u+ u% S' {( Y& ^
***************************************************************************// I1 M2 [. o9 R
void TimerT0()interrupt 1
$ s0 @% g7 [, K3 W( y$ q6 s9 a: S{
# @! E0 z. w6 j2 a j Data_RXD();% T$ o" ?3 d9 ]4 ~4 A
Data_TXD(); 7 N3 @+ o: X* c; s( o4 }
}) t0 n3 n. w; O+ \! }" [% I6 w* f
2 C h8 F! T& r8 `- f) l
下载:, N2 E3 Y) z# Y
: R% Y X4 D2 n0 Y7 u* r
$ @' R# h4 c# I6 Y% p; v
|
|