|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机模拟串口程序源码* c% N; \, ^" ?' b4 l
8 P% s' S- r- c* p- W) s) A' |
N% I& C* m" K' w! z* e0 N 5 i) @6 O& |/ l) ?# L. i) A- q
#include "Usart.h"
/ S( e9 C9 O: V7 }2 t( }) xbit RXD_OK=0; //接收完成标志位
3 |+ Q' i; V9 Q& s( zbit TXD_OK=0; //发送完成标志位 z; W/ d* c( m% x+ F
bit Send_State=0; //发送开始标志位
5 h7 @) E) F9 P) q2 j; ~bit Sending_Flag=0; //发送中标志位5 l1 U1 V( q- r- c& L- h2 h) s
uchar RXD_Data=0; //接收数据缓存区
4 u% u& d2 ?1 Z2 K2 q4 Auchar TXD_Data=0; //发送数据缓存区
: c8 t: O' f1 h! d/ o d: dsbit led1=P3^6;& w% U9 [) V9 K1 G H
sbit led2=P3^5;
! N. Z7 v8 o& g7 |: `7 G8 Usbit led3=P3^4;
4 i ~ w0 B2 i: \; J. L a/***************************************************************************9 p5 z. C( |3 w
*函数名称:Usart_Init(uint Baud); c' F' B, l0 J6 U# A0 C
*功能 :串口初始化 波特率对应定时器溢出初值(11.0592)& G- n- E& H! B$ w( D
*入口参数:波特率 4800 192
9 ]" D( b9 [) t! t*出口参数:无 2400 128! S# ]; P% y P0 ~5 c
*说明 : 1200 06 \& H, {) a8 \" M f( [# C6 ^- c9 F
***************************************************************************/
! ]8 W; j" k& \) d) evoid Usart_Init(uint Baud)* H) r7 {- r9 G- j" ]1 x: P1 `& C t5 g
{
" t, o: W; `" r, |8 m uchar T0_Low=0;
& h, v- k1 s! l- ? T T0_Low=(Crystal/(12*Baud))/3; //求出定时器初值 3倍采样速率2 g( u6 H4 w9 q
TMOD|=0x02; //定时器0自动重装模式4 t4 {4 f8 _$ \3 B+ @3 b6 |, x" f
TH0=TL0=256-T0_Low;, c/ R- ]: U, E+ |
ET0=TR0=1;( n# Q* F# T* n6 n
EA=1;
% D2 C; l4 A3 G' T}
; u, i+ @. i2 |6 T, d, z/***************************************************************************, I7 T E, v7 Q" e% I
*函数名称:Data_RXD()
2 T% `- ~, Y/ v* r*功能 :数据接收
/ I8 w. x3 K" E% y*入口参数:无+ n( M3 V. Y( E( _
*出口参数:无
' ]6 Z- M6 c8 Y$ @! X*说明 :' L$ \6 _, i# |- M- J8 t6 I v
***************************************************************************/2 f/ t& [0 h" K( e
void Data_RXD()
0 F2 ^4 l3 H# F* h7 C0 f8 r0 I' W% K8 Z{
$ N- }, X. f7 B5 o) ^ static uchar RXD_State=0;
( A6 n5 n8 }5 m& e static uchar RXD_Cnt=0;
X0 w) j7 L, K' w9 H static uchar RXD_Count=0;9 V8 n3 |7 h+ M
switch (RXD_State)" W; k, u3 N9 U! G9 ] A& I
{
' Z; e7 O, s( U+ |8 H case 0: //3倍采样速率采起始位
, P ^. x2 h% e7 _% b {
0 l( U1 G7 n# J) }" | if(RXD_IO==0)) m. p! {5 s& {" s' v- G
RXD_State=1;$ I3 x" t* U. c; n
}break;+ [1 d2 w7 [* p5 f0 g3 S
case 1: //采到两次起始位3 k5 g5 b0 f3 Y/ M$ J8 \0 Y9 S" E
{ //采样频率校准到1/3与2/3之前
A0 @1 z- L7 q" c& |8 p if(RXD_IO==0)
6 v& J( B4 E8 A- g RXD_State=2;* `% D. a" t$ J1 \ |5 H) U* w4 A
else RXD_State=0;3 V) s2 t3 k7 f- o
}break;
( {5 w7 D2 q" p; i# v, ] case 2: //以正常波特率采样,取出八位数据位0 o9 j; @* X# X& m- W" v
{
! R* p/ Z/ V4 Y: I# s$ ~9 s% q2 B if(++RXD_Cnt>=3)
5 K7 o4 @4 d8 o9 \3 B7 ` {
% c3 M2 A' R6 ` Z; P2 L& m% u; R; J RXD_Cnt=0;
. [/ ?& }# H& ` if(RXD_IO==1)0 G; f) j0 E. B4 ?) R
RXD_Data=RXD_Data|(1<<RXD_Count);
3 P0 G, t/ B1 H2 ]4 V if(++RXD_Count>=8)' ^5 `9 I9 G0 {8 n. ^
{% }5 E7 T9 a5 ?
RXD_Count=0;/ P/ i( G, ?. w) E( h" L
RXD_State=3;
& w Z. Z5 T0 r% \7 \ }
& b1 P1 y0 j. Z$ p4 S2 h. K9 a }
( D( `" ~2 x0 t1 U, l% q0 H6 U }break;
, t' \3 y% j) C/ n- w4 e case 3: //取出结束位5 o/ w* }, P* I% Z- F1 g. u# ^, F
{ //结束位正常接收完成标志位置1
5 ]" [1 J0 F/ L/ {9 ~% A if(++RXD_Cnt>=3)
( w2 m G. }: Z" D- G% u {) e& r; p: C( I* M# C5 `+ q
RXD_Cnt=0;: \+ s$ N- x: ]9 L
if(RXD_IO==1). C! l1 C) t; z, W
{9 N/ \. K# D- G; x. Y; I7 c5 ?
RXD_OK=1;* \ Z% [+ \4 r; a& d% {4 K( s5 d* [
RXD_State=0; r& }: ^$ K7 ~$ ^( G1 [8 w
}
U% u7 P x! k0 U/ t `2 s1 Q else
3 |$ H! h( F. p l% m {
0 M' q$ l5 S7 t' i5 N7 H C RXD_Data=0;+ S" m5 h2 K1 } [
RXD_State=0;4 D$ S5 M) L( Z- v% A4 m p2 p2 f1 L
}
- i" N: p# [, v& h0 ^ a } 7 _- [: j$ n" A0 E% u7 z$ E
}break;
. ~% D& Y" u: h( a$ L, \ }
& W2 ^( q( f" }! o5 f2 J}
# I6 e8 A4 u4 V: ]& u; U/***************************************************************************2 D" u2 M: a6 d- z
*函数名称:Data_TXD_Buff(uchar Data_TXD)
" K8 U" J0 e3 n: G ]: F- A*功能 :数据送入发送缓存器3 t* `/ `) p X" n
*入口参数:待发送数据
- ^2 q# P8 ?. a9 J*出口参数:无# e/ v+ ]+ H' `$ n2 u# m7 v4 `8 L
*说明 :
! d F1 M4 z( p& ^; m; k9 H***************************************************************************/- }1 M5 ^, G) g/ s# H6 f
void Data_TXD_Buff(uchar Data_TXD)& a9 B- i5 g3 {2 L: y% c, o
{" U* y1 X! f! y$ O6 r* C- Z
% Q* w; s, W, O5 b
TXD_Data=Data_TXD; //数据送入缓存区
+ x# g7 i: ?1 L | while(Sending_Flag); + r2 J8 M# R3 }( u' Y! G8 j: \
Send_State=1; //发送开始标志位
0 G/ t- E" q" `! c/ W9 y/ J}5 \ `5 p% L0 ]8 m2 H4 n3 m
/***************************************************************************
) ~/ R s/ t" }1 Q. g5 R+ m0 a* A' r*函数名称:Data_TXD()1 a6 x1 Q$ y# S- B( y* b
*功能 :数据发送5 }, `5 s( _7 g1 s) t3 `
*入口参数:待发送数据
( ~/ A, @: l j2 ]) N M5 |0 q*出口参数:无
! r- _3 i0 q# f5 [/ `( ^- s, P# u1 N) x*说明 :
& N7 ^6 s: m2 s1 \- D***************************************************************************/
( u/ l. M/ A/ zvoid Data_TXD()
" I: \: ]$ ~' Z7 M, h% B5 Q$ }{, u1 x/ m7 x# d( z5 t7 ]& I- P
static uchar TXD_State=0;3 C6 ~ l6 S3 L8 h: `2 E
static uchar TXD_Cnt=0;
$ N8 X6 o+ z2 t7 \, M6 t static uchar TXD_i=0;
& m. Q; {2 @. g2 j. [ if(++TXD_i>=3)
7 \+ U& U9 O: v: ` {3 i0 \" L# n; E( }; o, ?
TXD_i=0;
5 ], z2 i' h$ s5 a* G$ ` switch (TXD_State)4 _4 [ f# y& l7 ]" ]# o% i
{
& T! X/ J" `: ^' G; y5 W case 0: //检测发送开始标志位- V$ T8 c" |5 |; \9 E. J
{1 x7 Z/ j9 V& u0 I/ F
TXD_IO=1; ' l( L1 K% a# A+ i, Q( E
if(Send_State==1)6 }3 V+ W4 U: P2 k) Y" a7 e. q
{ 7 M3 ^. I, i& o
Send_State=0;6 ?& j4 |8 x5 k6 u, d
TXD_State=1;
& R% [) m9 Z1 {7 K' j9 @$ X Sending_Flag=1; //发送中标志位置1
3 ?/ t6 G# ]6 _: ?8 y6 z TXD_Cnt=0;
9 @3 w% n$ r( M1 R1 \0 g TXD_IO=0; //发送起始位
* |2 ]( b+ |& [0 ^* }5 M$ {, \0 | }
9 E5 I6 @- [6 \! u; F F }break;# W! U& l3 Y8 A
case 1: //发送八位数据
; W- d2 N- W0 L4 E. D { //八位数据从低到高发送
# _* A/ o. f: d3 x3 _/ V3 \9 W9 m5 v TXD_IO=TXD_Data&(1<<TXD_Cnt);; n$ I: y: O8 F' u0 a! G
if(++TXD_Cnt>=8)2 x. P. T! }8 K: w. u/ J
{
x* P+ \- r$ ^; p1 o4 E TXD_Cnt=0;
/ x3 V3 ?7 }' H4 T* { TXD_State=2;3 _+ c! {! u' h& f8 Z: C) F* `/ ~% i9 L
}; _, d+ C+ l6 _' _
}break;
5 d$ `) ]2 Z5 B. s& X# a case 2: ?2 ? L; f8 G5 q$ A
{
- n! a7 U5 X9 b. ]* r TXD_IO=1; //发送结束位: b7 }' V2 O0 [7 t
TXD_State=3;
3 i- p6 O" T7 J* U' h }break;# `% c( K7 t7 ~$ |, N& o! H
case 3:) f( B5 E: b# V3 Y. _7 ^( m) i
{" q' @3 ]7 M2 L/ ]
TXD_State=0;1 z9 s: p/ F! h% y/ S, b- {0 o
Sending_Flag=0; //发送中标志位清0/ u3 \# `0 N! `8 }, o
TXD_Data=0;% E: Q# k) w+ b) R- Y/ @* r
TXD_OK=1;
2 m% [+ _! N, ]* E" T }break;7 Y& ?& p5 ^3 @. \! Z9 E
}/ e/ ^: r, V! t, A7 D6 U* f
}
; s" r) z, t A}. f N& N( B* d% k& Q8 L6 c
' E1 @1 l0 U) V \
7 h9 n5 b' D. p8 y/***************************************************************************6 D, S S8 b4 M7 c
*函数名称:TimerT0()
" B4 m3 v, \; `7 X9 E# M: e*功能 :定时器T0中断+ C% s. A5 ^4 | U1 L8 t
*入口参数:无$ H, R& g G) A% A5 W
*出口参数:无
" ~8 D. `/ f3 W, _: K*说明 :+ X6 _: X' M1 i
***************************************************************************/' K3 y# k4 O" F5 W3 z
void TimerT0()interrupt 1+ h; F. f/ O* P2 h
{
% U0 a7 t) t6 G, R% k Data_RXD();2 |( V) q+ f- j5 U
Data_TXD();
) L V( C+ V. b, H/ z}9 l8 ?, P" A5 x$ A
# `; i V% k! S下载:) g. W& E5 d0 j4 e- W' d
$ O4 A: Q) s+ O+ E6 N" U6 V6 v [. g ^. ~ I6 T
|
|