|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机模拟串口程序源码
7 x9 b( ~! x9 j& r
9 P) U9 K8 O0 s M
5 ~* U. Z* x. H- v% @ ( L# s' X" D4 b& I- p' v0 g
#include "Usart.h"
& t5 L9 |4 ]& h1 I* Sbit RXD_OK=0; //接收完成标志位" r! ?1 l+ ]% A2 q- h+ A8 d
bit TXD_OK=0; //发送完成标志位
_% b& f# i) K, Gbit Send_State=0; //发送开始标志位' E% V+ z( V! {" m8 h, Y
bit Sending_Flag=0; //发送中标志位% F) V: f, H9 c' \
uchar RXD_Data=0; //接收数据缓存区
' g! ]- R. w% F" ruchar TXD_Data=0; //发送数据缓存区: X1 @6 B7 q2 e. t
sbit led1=P3^6;
" P/ D, B6 q0 h+ `/ Y! Z; isbit led2=P3^5;# P% x S3 v$ \* {- ]; p9 q9 \
sbit led3=P3^4;+ C( D7 X6 N- f/ c5 H
/***************************************************************************
. `! S/ ?, C- `& N5 [4 H7 b*函数名称:Usart_Init(uint Baud)
/ K% ]: o; f0 y* w, T+ r0 j: V2 h*功能 :串口初始化 波特率对应定时器溢出初值(11.0592)
4 ^. }7 X: o% d: @& `* K+ Q2 ^*入口参数:波特率 4800 192
; U3 c E4 \- q v T7 C*出口参数:无 2400 128
- n. i; A. r% e% h( R: I+ |1 r& z*说明 : 1200 01 l* U- Q: [# Y$ u& b
***************************************************************************/) Y+ S' X. Z# Q0 N
void Usart_Init(uint Baud)
' D- J {3 ] j{
/ O# i! Q) ]* ~$ p/ D2 d0 w% H( j uchar T0_Low=0; 5 L; E% ~3 b1 Q* y3 l
T0_Low=(Crystal/(12*Baud))/3; //求出定时器初值 3倍采样速率
/ n, U3 w2 t2 \" M& r TMOD|=0x02; //定时器0自动重装模式
: {' \1 P/ v/ e. j2 m1 G TH0=TL0=256-T0_Low;
6 ^1 c. C* X: |# B9 W. `9 W* E ET0=TR0=1;
/ G; `. \) `( Z. B6 C& Y( h EA=1;
% ^+ T. U* E8 V3 J8 U6 h}; _3 v% L/ G# h
/***************************************************************************& A( Z4 x- _, H/ M
*函数名称:Data_RXD()
/ Z$ i0 j @+ v1 Y0 e*功能 :数据接收 l* g& i E8 O% Z
*入口参数:无# ?3 y W1 q4 p- e* ?
*出口参数:无' f6 s, a& U8 P- }, |8 F: `, j9 f
*说明 :& E9 q$ i) `# R3 ?( t; N w( S7 d; _
***************************************************************************/
" H2 D: l0 Z8 X/ hvoid Data_RXD()
. {# C- ~ c# V) e8 q{" q3 T& [ M7 p* E$ D+ k
static uchar RXD_State=0;# `8 F: [) x- p
static uchar RXD_Cnt=0;
9 @) M7 p; y% J0 @9 k2 \8 Q3 j" a& t6 _ static uchar RXD_Count=0;
A4 j6 B8 z( J$ K switch (RXD_State)
- x" B1 N& Z$ c) }! _: G' s! I+ _ {5 \4 Y- B3 O/ {1 D2 g
case 0: //3倍采样速率采起始位( ~" Z) t- d4 |5 ^: f
{ 7 H$ v6 X' T& \
if(RXD_IO==0)' w0 f/ L- R( M/ \. N! C
RXD_State=1;
. m# Q; [; N2 X) ~# g }break;
6 w `6 E2 h% A case 1: //采到两次起始位
5 k# h% v6 P; v) [9 r" H) H9 V { //采样频率校准到1/3与2/3之前+ d( [ y: {# [1 ~; C
if(RXD_IO==0) ^# O7 W" _5 E1 K
RXD_State=2;+ i/ a3 R' i3 {* M" a+ S7 s
else RXD_State=0;
1 }5 o7 `$ Y g; d& p' I }break;: p( P0 G" ^. M, N- a
case 2: //以正常波特率采样,取出八位数据位
+ X5 M4 t+ Q8 A0 ]5 ? {1 _; k" p) }1 S& E( { G4 d
if(++RXD_Cnt>=3)
( I; W+ } L# z# l+ T {
6 b" l- c, S( ^. |4 m RXD_Cnt=0;+ L& Y5 @$ I1 \! a0 [1 e
if(RXD_IO==1)
2 S/ Q& {& I) k( X8 b RXD_Data=RXD_Data|(1<<RXD_Count);
2 W# a' {% C9 U# _& Q if(++RXD_Count>=8): q# z. S0 B! [1 R; L
{- Q1 N0 F6 j. `
RXD_Count=0;( n+ I; W# `* B
RXD_State=3;
3 Y1 V* A2 j- G" ^/ j. e5 q2 X# W }
1 H+ [$ ]$ Q7 Z9 B. X# z }( e+ N" n1 ]" F
}break;
2 x" d& k% k# l8 i6 @ case 3: //取出结束位; J4 ~ M* w8 c& h; E$ J5 G( U0 C$ G
{ //结束位正常接收完成标志位置1: t) k* c" X2 @5 @
if(++RXD_Cnt>=3)7 Z% A5 H: O3 U9 c6 @3 _; j
{. y2 f& E4 b2 G! ?4 m
RXD_Cnt=0;- v: {9 ~4 t) O: L/ |
if(RXD_IO==1)( A% [# U, i2 O, {
{, X! d) |# A) P& U$ R8 w
RXD_OK=1;7 i$ q* P* B5 P, G! K# j; [( e
RXD_State=0;
* f* N: f0 F/ t, q: s! T( { } ; V, q7 l. ~2 b9 |1 S
else
, k, @, `8 L$ ]+ `9 U* k. j) P& Y$ p) g {
l! m* d& n8 G1 e4 e" } RXD_Data=0;
+ Q( V8 z8 C8 z RXD_State=0;
4 g0 o2 l- K8 Z/ R. M }7 I2 v5 u3 S" C* Q
}
* A6 n8 T* a& ?9 p6 f ?8 j7 t3 A5 l }break;3 h5 I: ^1 J1 B u `6 Y" g
} 9 I& S4 m; W* M: F
}% B3 c9 u8 ~0 E
/***************************************************************************
# h8 D- @8 E5 w& M: [* v5 f*函数名称:Data_TXD_Buff(uchar Data_TXD)
0 k6 k( [. }# G# K' C*功能 :数据送入发送缓存器
- ?: g, V3 n9 }*入口参数:待发送数据( O! l" v; P. b: R7 u
*出口参数:无
. g, t' p- `8 g8 s4 S7 `, `*说明 :
* S4 Z& G1 T. |* V% ^' d***************************************************************************/
3 D3 V8 g: R* [void Data_TXD_Buff(uchar Data_TXD)1 B2 c$ f2 t' N! }& s, @- ^
{
& u$ j* H9 r9 F: a
, D7 t7 V7 W$ E" I9 f$ [ TXD_Data=Data_TXD; //数据送入缓存区
9 W! G: k1 P8 I# v7 H while(Sending_Flag); 1 d7 N5 p4 v' C6 z3 l5 k
Send_State=1; //发送开始标志位
. J0 z' ^2 b. l* a( \& D}
* u' y" v( I ^1 `5 F8 ~9 Y/***************************************************************************6 t D& B6 D# i% w
*函数名称:Data_TXD()
$ U. P4 S% J4 O$ R$ o7 J*功能 :数据发送
& I1 z: v. N" \) L*入口参数:待发送数据2 _1 ^, G+ y1 Y+ w
*出口参数:无
: U3 k1 o# V+ z y6 C& G*说明 :- [* l/ n$ P/ V; }
***************************************************************************/6 ~8 R4 Y1 W' m: x1 d* ?: d4 B
void Data_TXD()0 F, M. P- I' `5 w+ V2 S: u+ w x
{
4 b4 n B: P' |; \ r( S static uchar TXD_State=0;
! U+ e0 I: C$ b5 N static uchar TXD_Cnt=0;" C4 `6 `. w$ d3 z
static uchar TXD_i=0;
6 q2 z( L: [2 o9 F5 b) r if(++TXD_i>=3)# \0 q) Q7 w! @+ b. y
{
! V, S6 G8 K' M. B TXD_i=0;5 ]7 K3 Y/ D1 ?
switch (TXD_State)
$ M5 B/ y* F# h6 V; j& R, |8 ^6 Z1 [ {
* m. k7 Z: r! B [; E4 e1 | case 0: //检测发送开始标志位
6 Y# S f4 o9 x {7 P8 n, h3 K# g0 L1 Q3 O
TXD_IO=1;
+ r0 Z G+ q7 h! m6 q if(Send_State==1)& o; z- a8 P7 a/ p- u+ f; O
{ 3 l) Y+ ~: ?4 r" k$ i: f
Send_State=0;
+ `0 c" O4 K2 r1 R- A v TXD_State=1;1 y& { l+ J: v) P6 J3 o
Sending_Flag=1; //发送中标志位置1
/ e9 ~$ u; A$ E! j: c8 L. v TXD_Cnt=0;
4 ?, v% ^. N3 Z1 \6 X TXD_IO=0; //发送起始位" M! R7 b- K' z% l( h$ h3 ?3 ]
}
' `' F1 {' {3 m- y }break;& J8 s6 j# _8 \/ S8 C; J
case 1: //发送八位数据
4 A Z& |; B2 L$ B' D$ ^ { //八位数据从低到高发送, n2 ?- U0 f$ f/ s
TXD_IO=TXD_Data&(1<<TXD_Cnt);9 X7 G2 n5 ~3 [- X% J# `2 {
if(++TXD_Cnt>=8)
3 T1 }! c- v; {5 z% Y" b {
: l7 a. X7 {+ q1 x& O& `7 | TXD_Cnt=0;
C' I! y! u. b$ T& r. R: y TXD_State=2;0 {! T5 j" t+ w
}
+ a ^) _# {! P0 s0 f }break;8 `2 R* n. G6 z
case 2:6 ?/ A* r/ W6 N0 S( F
{. V8 B7 y) L1 h& l1 D1 h
TXD_IO=1; //发送结束位$ n3 Q( w# G0 G# o$ L2 M
TXD_State=3;4 H, t9 f/ L4 M1 m! A. X8 @
}break;
" a; @9 ~' J4 |, t: K: n |) A case 3:
# z% o: h/ a2 ^7 `/ h {
" A1 Z0 c; ]2 r1 M9 _) k TXD_State=0;7 S* X% y5 b/ T+ h9 c2 r) K
Sending_Flag=0; //发送中标志位清0
$ [7 o- m, S* ~/ ^3 r7 [# Y TXD_Data=0;" T, ]! d, { R! p8 c4 V
TXD_OK=1; / v* P, P( y3 Q
}break;
2 I9 B, n) |7 J3 h }8 D5 w3 {! ?/ ]/ C6 A4 i
}
7 z- x( ~$ p( e6 w \}, S6 k- M }4 w* p+ p
0 p9 B; K0 b% d9 O$ n k' v) t
: H1 Y7 i' x* a9 K* X/***************************************************************************
1 o& m( s* T5 I4 ?. E; g9 X0 u* }*函数名称:TimerT0(); c+ E1 K1 d6 A+ h; R: h$ ^
*功能 :定时器T0中断
! C! [6 _6 o T+ n3 a*入口参数:无
) [9 L4 r/ A' D! T% V5 `4 r*出口参数:无5 W8 W3 z | q- N+ ]
*说明 :
! A/ f, j9 [) G; M% ^***************************************************************************/
' ]* I% _) |; N- `( Svoid TimerT0()interrupt 1. E; ]6 y5 j, C
{
, R3 J1 u J: e) v Data_RXD();
2 K- R6 r& r. G2 {% x, _ Data_TXD();
; e: h5 j V" s* J}% {& H s4 \$ ?* Y: q. R4 N
! J3 z9 U. J% P: P
下载:0 a# a0 C/ r$ [& Y$ }2 O. G) Q" @
4 t3 b2 V4 t: d' c; Q+ i
& G" j( }6 a5 a8 U. Q
|
|