|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机模拟串口程序源码
5 C) A6 ]) N) @0 ] \6 C
! M( k1 [% X" z: P; q
) @6 d/ P/ u0 l- N# t
5 w4 c3 O# b% ~, @- v#include "Usart.h"
% ~3 s+ `6 @- ~9 @: Tbit RXD_OK=0; //接收完成标志位
3 O6 p: p% L, t- Dbit TXD_OK=0; //发送完成标志位
0 k: Q* d, ]( [+ V5 i9 m Pbit Send_State=0; //发送开始标志位- G( i$ e4 |2 ^1 r
bit Sending_Flag=0; //发送中标志位4 V! O. T7 }" U& S5 R1 w* E4 @0 `# k8 @0 G
uchar RXD_Data=0; //接收数据缓存区
- ]6 e0 K& ~% p4 W7 e! d* x' k" O4 Juchar TXD_Data=0; //发送数据缓存区
$ f' j/ n; [9 ~- M, Hsbit led1=P3^6;
( E# C" Y* D- h- g% csbit led2=P3^5;
E% S; @6 _% B9 s8 F) E# D- k/ B9 C& esbit led3=P3^4;
1 L5 q- B2 N- o2 Z0 `! O ^1 a$ {/***************************************************************************! S( u0 c2 Y6 {3 G2 r& {
*函数名称:Usart_Init(uint Baud)0 }. u( y5 j) m+ y, q2 }$ {
*功能 :串口初始化 波特率对应定时器溢出初值(11.0592)
, N, A! [ f1 G& d, H*入口参数:波特率 4800 1927 ?! g2 b- K+ w% D" ^) G7 w
*出口参数:无 2400 1288 ?6 ?5 Z: O h1 p- Q0 m
*说明 : 1200 0
6 Q: k- I0 ^% s: C***************************************************************************/
. A& C: Z. A2 M/ g2 Q K9 p& G! Yvoid Usart_Init(uint Baud)) M/ p( \, U3 x; d" Q4 `
{
6 y' q# M! W5 s- n/ m$ z uchar T0_Low=0; Y1 t- B2 n4 X# Y9 I: a, m7 p. s5 z
T0_Low=(Crystal/(12*Baud))/3; //求出定时器初值 3倍采样速率
9 |' q5 x1 e! G) W- a* @ TMOD|=0x02; //定时器0自动重装模式4 A5 S0 Z' J- D5 ^, w. q! n" P8 i# N- H
TH0=TL0=256-T0_Low;
6 @6 @7 {, p- l0 p( k ET0=TR0=1;
1 W V9 z% ~( h3 J6 u3 O2 l EA=1;# P1 G+ g: d6 M9 z8 k
}
% _$ P( K, y5 E; |/***************************************************************************
( e# J+ M, L! x' r. E8 }: N9 S$ x*函数名称:Data_RXD()
* ~) M5 H# f% D4 P7 m* |# S" S*功能 :数据接收
* N* C$ W H( e7 `7 h# Q8 m# L*入口参数:无# E& [% k& \+ R- K7 u+ I
*出口参数:无3 T' V2 k; {! A' Z
*说明 :# c, t3 ~" w, {' c- T* e
***************************************************************************/
. o; o4 C# h% I9 x" Fvoid Data_RXD(); j7 R3 t1 o/ I9 ` R: I7 ^6 j+ W
{1 T" n/ `$ M! k; ?: N) x2 J2 T" q; r
static uchar RXD_State=0;, V: L" s4 r h l' k1 d K9 ?
static uchar RXD_Cnt=0;
+ m7 i! q, N, F% ]9 `" r static uchar RXD_Count=0;1 r1 B0 a& j) ^# \! f& a0 u" Y( ]& S
switch (RXD_State)
/ T- f9 o5 n3 w( l3 N) x: S' d* p { e$ S# d& A% o# K9 n c6 d r
case 0: //3倍采样速率采起始位9 `& J0 Q$ q- S, @* E1 r
{
& c! z4 N/ H& S+ }5 k if(RXD_IO==0)
O0 ?6 ^, W, u RXD_State=1;9 |5 J0 g& l. V5 G" |2 `( @
}break;8 T7 y! q! j" ?+ d
case 1: //采到两次起始位- ?* l u J/ \
{ //采样频率校准到1/3与2/3之前
; B. R7 {8 k# i if(RXD_IO==0): C. ~. | m& ?0 S/ ]
RXD_State=2;
* ?9 C2 _0 n' ^; K else RXD_State=0;) e D3 a- M3 B6 _- p5 |
}break;; u: ~* ^7 m9 j; |
case 2: //以正常波特率采样,取出八位数据位
3 a+ M" h0 J$ s3 W% { {+ f$ F( F$ w0 @, `" _
if(++RXD_Cnt>=3)
& j7 V# i% [/ x% ` {
% \% X; P' z% I RXD_Cnt=0;
7 O4 k9 i9 W) o I2 u- i$ I* e if(RXD_IO==1): s4 H$ D. V! [- [6 t5 h/ \& I
RXD_Data=RXD_Data|(1<<RXD_Count);8 ~6 L" C1 M6 x' B4 G& T3 u; [
if(++RXD_Count>=8)- [' [, m/ D( `% {$ g8 m7 x* \; C, o2 A* l
{
. p' u2 M# `0 c RXD_Count=0;1 p; L+ R1 M, y# J) z
RXD_State=3;) V$ B2 ]( x0 N+ }) s
}
, a+ f/ v$ _" a) |, |( k* K }) a9 I, C9 O! M* k
}break;% e7 Y9 d* O: E8 ~, P5 Q
case 3: //取出结束位
4 j% p- H3 @1 w% _' j: B$ b { //结束位正常接收完成标志位置1
* r& b" t% v+ D2 f4 ]1 A: r7 d if(++RXD_Cnt>=3)
* g$ ~$ s; D: } {
9 F6 M- v! t) e M' _! R# f* g: g RXD_Cnt=0;
# `, o7 \; w) d( G# p4 A4 T if(RXD_IO==1)
0 J ~4 F3 G: T1 {) h/ O8 n5 R {# J) c" V/ `3 Z, R! B8 \
RXD_OK=1;
" A8 m5 M G' |( r$ `1 l- u6 { RXD_State=0;* V8 S- p4 v5 e) c
}
J: T/ a& x% Q) j( b4 |# Q$ o% o, J else 3 p5 v3 C3 S6 N+ C$ v$ L" e
{
6 y* e# ?' K' F5 t( H: w$ W RXD_Data=0;# J, B: A8 c) P; F' I- m+ v
RXD_State=0;7 x1 g' _5 k1 S, q: j
} D. W5 o; Z# t
}
) g' m5 ]" \7 J7 K$ x }break;$ _( P Z) \1 ~: C
}
9 n: W. [9 b5 d4 Y2 Z}
1 C; a0 ]/ a8 |; B0 h/***************************************************************************
( }& y' V" ^8 \4 Q3 \- C4 n2 D*函数名称:Data_TXD_Buff(uchar Data_TXD)) Z& F: t8 t ?0 h
*功能 :数据送入发送缓存器
4 ]+ |& f; d H+ i) z' o*入口参数:待发送数据% s2 D$ ]1 z; X4 K7 Z- ^
*出口参数:无
3 w2 p" o1 G: V3 b+ E2 y% U2 a*说明 :5 F6 e/ n2 h2 t2 \, V
***************************************************************************/' e$ T7 X3 S; r$ n. E3 E9 J
void Data_TXD_Buff(uchar Data_TXD)3 x& ], t9 z4 O. b+ R z" u
{2 n$ i+ m! a3 k, D, Z% \3 Z
( Y% e0 h, D& S I8 \& U2 w TXD_Data=Data_TXD; //数据送入缓存区
# x9 m c& K; W8 r7 b+ } while(Sending_Flag);
! E9 u4 A, r* W Send_State=1; //发送开始标志位0 E8 F7 W5 H C- A; ~9 f0 `
}& _9 l7 T% y8 R6 H: v" p% E% k$ h
/***************************************************************************
; X {2 s0 i0 B" G) j*函数名称:Data_TXD()
) m# P" k; D# [9 e5 p: H/ F8 k6 C*功能 :数据发送
9 |. d' u% B" K S. U*入口参数:待发送数据- S0 w/ ~( _1 z! f* J
*出口参数:无
l3 a/ `5 H) s$ l7 h1 [. f*说明 :, b, Q2 U7 c8 ?. w0 e0 l
***************************************************************************/9 s5 n1 V% Y/ {! E G* Z% S6 Q
void Data_TXD()6 w! Z" ^, K. ^8 B, n. l& }
{1 h9 t& q! r% e' ^6 ?' D b
static uchar TXD_State=0;; P* G4 b0 x6 o! k* j7 n! [
static uchar TXD_Cnt=0;2 g% Y' G3 K x" O- L" q
static uchar TXD_i=0;4 ?4 p+ c' A) F% V% U* j+ j
if(++TXD_i>=3)
[* l. w% R# P' j. [1 }8 O4 ` | {8 g3 D& T2 |% h8 p
TXD_i=0;
) H; D2 ^# q! g; D; @: K switch (TXD_State)+ E, K, T4 P$ J( O
{
! E! B, g6 Z- y2 b8 C) K- ~1 \ case 0: //检测发送开始标志位
# m& f: F- T v" O5 k7 ] {5 D. \8 }) C8 S5 w7 F u
TXD_IO=1;
' E+ L4 A* U* I" l8 F if(Send_State==1)
2 u' b. a6 [5 j+ m/ E1 ] ~4 ? { + [, p# L7 U {
Send_State=0;
- x4 A1 m/ h# l/ h# j, j) x# L; E TXD_State=1;" x# { h+ u; | L
Sending_Flag=1; //发送中标志位置1: _/ M; x% M2 [! H$ E
TXD_Cnt=0;) B5 X2 Z# k: Q$ p- G& r
TXD_IO=0; //发送起始位
! h+ v" Z7 O' ] }
: N* b8 B1 C Q5 b; {( X; ]; d @ }break;
5 c5 }% Y9 F% j; I4 ^$ ? case 1: //发送八位数据
/ ~7 i& F& T- R. j( M& s { //八位数据从低到高发送4 F7 x) e+ H+ S; u4 h0 F
TXD_IO=TXD_Data&(1<<TXD_Cnt);# F4 M2 [+ T7 O- c+ c5 r! Q {
if(++TXD_Cnt>=8)' K7 R( q# ~# p* ?$ J3 K8 e4 H: Z
{' ~9 P' }% x Z: {4 V! N) ?
TXD_Cnt=0;* H" L5 C, g5 C) i5 u" ]7 x
TXD_State=2;8 I+ t' x7 Z. {3 |
}
4 f# c6 j i& s) z2 T }break;) ?* ^5 H9 }* [' y- D+ I
case 2:6 \" M3 W/ z7 x
{
' F% S$ k4 U) i# s TXD_IO=1; //发送结束位
5 L# b; k8 m0 C5 L6 |4 T TXD_State=3;! X. h; X3 [# T
}break;7 s/ g& O+ v+ F9 c* {8 s3 M
case 3:. P3 Z8 Q& r6 A) P: O
{: Y" W. M- ]; \; l$ z) @: f* ?$ s# d
TXD_State=0;6 @* ]9 l$ n' C
Sending_Flag=0; //发送中标志位清0
' N0 R% c4 n" s; o4 U TXD_Data=0;+ L ]6 Z. \. p' E
TXD_OK=1;
. U! I. c( F5 q% ]) _- u; T. k% p }break;
$ T, X( x7 g: v9 ]$ Q! p6 k }$ y+ F/ M _( I5 W/ E
} $ V U- l/ R. ~, ?3 A" \& H
}
7 K3 U' c1 p# `8 `) b7 Y/ b. ]; |- j& ~* P
" e' _: r! ?$ z- |
/***************************************************************************
. k1 W& O8 }/ z: {* ~' ]*函数名称:TimerT0()
; Q" m5 }$ j7 h: b*功能 :定时器T0中断. B* }4 S* q( b, }- V5 R
*入口参数:无
* l- Q& `; P* D9 v7 G*出口参数:无+ X# b* S; W7 \3 u; ^
*说明 :
( r0 [* m3 x; u) G+ J# R7 c$ k g***************************************************************************/6 x8 a& ]& Q& \. J
void TimerT0()interrupt 1
7 U$ {6 x+ b) r2 w7 ?{( m! A( _4 q; W3 O
Data_RXD();
0 N6 I9 G b: b( d/ W Data_TXD();
/ q4 G* ~6 u& g}) r8 O. Q; h" X& H
7 q$ b7 z2 v. i/ w3 l下载:
9 E3 ^3 D7 e( r4 w1 ]' T; `% V4 _- i5 g; G2 M. Q) F1 L
|9 A2 S- X H+ ^' {% \
|
|