|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机模拟串口程序源码
" R2 z5 d; {) r; L
S6 s( ^) s8 J6 P0 C
" i+ Q; Z3 q6 r 6 K* y$ _% U$ `4 g1 e8 m1 N
#include "Usart.h"3 U6 v S6 |) |4 T, \8 h
bit RXD_OK=0; //接收完成标志位
. O: L) K, v% j( O7 M& Y' a. y# m" Fbit TXD_OK=0; //发送完成标志位. H/ b& }. r0 i c" d
bit Send_State=0; //发送开始标志位
( D' u' k; J m6 D( Ybit Sending_Flag=0; //发送中标志位
( P% E1 W" R8 L+ d: w& ^3 [uchar RXD_Data=0; //接收数据缓存区
$ n4 I1 P! n1 L3 g' W, R: duchar TXD_Data=0; //发送数据缓存区
: {( ^& S9 {8 z. P3 {sbit led1=P3^6;
( z% s& Y) f: zsbit led2=P3^5;
& k/ {" h1 D0 {( asbit led3=P3^4;% M, N2 p: X& F5 T( B- o+ }
/***************************************************************************
( ?, D/ w; q* D# g, }*函数名称:Usart_Init(uint Baud)# n5 N5 N! @# n
*功能 :串口初始化 波特率对应定时器溢出初值(11.0592)5 O+ V9 a1 s$ p3 T" U1 Q1 `
*入口参数:波特率 4800 192
7 M; J8 J$ Q, \) N; Y0 H, P*出口参数:无 2400 128
6 s& H L5 t. \9 c*说明 : 1200 0
; o% Y: h" G3 O0 @- ]# s***************************************************************************/
/ Q* L5 b8 h3 w& L# lvoid Usart_Init(uint Baud)
2 j/ W& S- ~/ q! |5 D# h{ 1 m9 U( C9 O' C, {/ U
uchar T0_Low=0;
; z) t8 S! O% p4 W8 _# R T0_Low=(Crystal/(12*Baud))/3; //求出定时器初值 3倍采样速率# r! Y- N: [: _3 [
TMOD|=0x02; //定时器0自动重装模式7 R! O2 X {) q0 Q
TH0=TL0=256-T0_Low;( z" y E, L) |! Q0 A1 O: X
ET0=TR0=1;2 W4 ^+ m2 V5 A, e
EA=1;
6 ~5 H: X( y3 R$ |, u, t0 }}
3 h' @8 P8 D0 h: E _ w- J/***************************************************************************
2 s0 d7 }- w4 F1 z# P1 M" F/ J9 c" x*函数名称:Data_RXD()3 \' `, ]/ Y# B3 C& R
*功能 :数据接收
9 ~6 ~- [0 |& d- ^$ w* h*入口参数:无
6 _$ w$ `- C; e* J% R- o: X' M! I*出口参数:无3 U, Z! Y' f$ r4 Z, M3 C
*说明 :) I" V p8 `' T& e: O+ }$ s
***************************************************************************/' U2 D# B7 \% R) Q9 I
void Data_RXD()
8 ?' ?- [9 B5 y# R/ ^) w{
! z5 o* ^* V' L" x% i static uchar RXD_State=0;
' ~3 O. g& |5 q f4 c static uchar RXD_Cnt=0;7 A( U% u; F; h. H
static uchar RXD_Count=0;
* ^6 {6 z4 Q% {* l& Y switch (RXD_State)
0 i3 e) g2 X- C3 f3 t {
0 C A. v( V* ?4 n- b4 I7 k% K4 @; g case 0: //3倍采样速率采起始位
" y" c( R& |1 W3 k {
( P S1 [; x5 Y3 R( g2 h if(RXD_IO==0)
& ]. P, A' P2 z3 O a1 D) L# Y RXD_State=1;" l# s l y6 G2 y i
}break;! i2 ?/ @6 E4 c5 `' z' g- `
case 1: //采到两次起始位! R" Z+ }5 O. Z( X' f a
{ //采样频率校准到1/3与2/3之前 ]9 h' `1 I3 N% j4 R
if(RXD_IO==0)
8 ^% T0 S. \8 Z1 i: x" C5 l8 _7 h RXD_State=2;
2 D& J6 j' b4 v9 p( t! J else RXD_State=0;
& V' m# [/ z: ~! u }break;
4 s) f4 z7 d) m2 U: C$ Q! [/ o case 2: //以正常波特率采样,取出八位数据位5 S" m: o/ B4 W& S$ F
{
# s9 E' X5 H* q4 g" u& Z) o if(++RXD_Cnt>=3)
F2 j6 K1 q- E$ D* S8 w$ { {* e1 y/ U1 c# {, P& M) h: Z9 }8 @
RXD_Cnt=0;. B2 n, {) Z ^
if(RXD_IO==1)
( e6 b* {$ z( X' s RXD_Data=RXD_Data|(1<<RXD_Count);7 B8 Q$ @* o' A" i$ r( i0 N Y
if(++RXD_Count>=8)
, O/ c0 _6 R+ D8 i/ T* O# W; h {
' U" r$ \3 G* q3 }& F2 D( R, ? RXD_Count=0;8 o6 N- Y0 q! R+ K5 @8 n
RXD_State=3;
2 H; T" b8 O9 J& `6 A# H2 m }
' M5 ^$ C5 Y+ A: g6 I4 Q9 j$ Q }% Z7 S$ C1 S# |. e: U8 w2 {
}break;: s; L: W7 X' @. e( R
case 3: //取出结束位
+ s3 j' M' b3 B }% h; r { //结束位正常接收完成标志位置1/ {/ S& t0 t3 W& I4 F: ^
if(++RXD_Cnt>=3)5 y/ U l. ?4 l- _3 R
{& T- ~) d" x( o
RXD_Cnt=0;
' d) U: Q# z3 |" T: I$ J: E5 G if(RXD_IO==1)
1 y% S, j' ^2 d {
4 d: {+ t4 Q/ S7 e% S8 m RXD_OK=1;. f5 `' j8 r5 G/ t9 i6 D, Z! L; g
RXD_State=0;' D- ] q, ^) r
}
3 A" p5 V) E- P. I M* M else ; K5 ]! ?! n4 J ^3 @
{1 ]2 o0 T" j8 g* t5 _8 h
RXD_Data=0;
" y( Q# j5 S( g; f; [$ r Q% H& L RXD_State=0;+ p1 ?! l7 F* c; J1 d
}
, W3 t! C' @7 I' @( k }
$ ~; [* D+ f. F7 j$ K9 a. O" I }break;
- K+ {% x% T+ l3 A; b/ I! d' {- P }
' e: i7 _) L# V7 E$ M. J! f}: f8 s$ a3 [, b" w: I( V, p2 A
/***************************************************************************3 N, C# A$ C& r
*函数名称:Data_TXD_Buff(uchar Data_TXD)2 W# f; `% L% V# L7 _- w9 d
*功能 :数据送入发送缓存器. Z/ O# \, f* X! F
*入口参数:待发送数据
8 R9 U# _7 c* v- `. Q8 ^*出口参数:无$ H" E( ]- u9 k
*说明 :: r' b: l5 V' x# E
***************************************************************************/
: |3 U% F) H9 `) N: i$ Fvoid Data_TXD_Buff(uchar Data_TXD)3 |, W' p5 h$ q7 t
{% q u9 J) a0 k# Z! m* D
7 @) E( c @0 A/ @# T g
TXD_Data=Data_TXD; //数据送入缓存区
6 `; j- {: }. H% Y while(Sending_Flag);
% }( q) r' I+ Y6 \. f Send_State=1; //发送开始标志位
/ z Y% o$ R% E0 ~9 T}
: q a: g5 c7 H- d( W3 I, _5 U/***************************************************************************
+ J( l$ y& y% T) b9 j*函数名称:Data_TXD()
5 y0 x+ }$ P9 V) J; L8 Z% x. N*功能 :数据发送
# q) a3 v" M4 o3 _*入口参数:待发送数据
4 D5 d8 u$ ^0 e* V3 g*出口参数:无
# J' g0 l+ ^8 @) t! _! ~*说明 :
' Y4 o& I0 h! g7 v* m5 E***************************************************************************/
% }/ ]& U# _: K% x/ P1 O6 Nvoid Data_TXD()+ q, p, z3 D4 C0 m3 N; `9 n
{
" ~0 ~; r: r" `8 `6 i/ U4 s static uchar TXD_State=0;- t) E" ^5 G. e( g! x6 d, T- q
static uchar TXD_Cnt=0;
) S; T: `8 Z- c; Q. t static uchar TXD_i=0;2 ]. `$ |7 Q/ l* P/ ?4 t
if(++TXD_i>=3)7 w3 X" O2 p4 ]7 y* }
{
M" u2 f6 v( g TXD_i=0;" z, K" ?& v2 W
switch (TXD_State)* ]2 Q$ _; d' M$ M+ A! n
{8 i5 b4 Q0 E8 F
case 0: //检测发送开始标志位, Y- {- v! k9 m G
{* C# X: C# }6 [' ^8 i
TXD_IO=1; , D, ~. j4 S! A' [( p& o
if(Send_State==1)
* c7 L2 @) Y- N5 C! j { # N& G) k( f2 B, x7 u% A
Send_State=0;
/ r- |9 b' U/ R2 S. V TXD_State=1;
% l8 g0 B9 f0 ^. e3 _1 j2 N- Y9 b8 { Sending_Flag=1; //发送中标志位置1 N! T8 F9 O3 J+ M# |1 F
TXD_Cnt=0;8 Z8 Y3 w* g7 h# v9 L$ u5 O l" [% D
TXD_IO=0; //发送起始位4 o! [( H) x5 d( u) m; \
}
% q# j& P: }' h/ M" B L* q% N: C% c }break;- ^4 T6 H4 C z' z' O
case 1: //发送八位数据
. A) D( }/ t6 E2 J' h, C1 f1 d1 A g { //八位数据从低到高发送# S" {& o0 N4 g. K. [4 ^2 M/ ?, t
TXD_IO=TXD_Data&(1<<TXD_Cnt);
8 Z$ R: l$ V- @3 ~ if(++TXD_Cnt>=8)
8 U/ {# { L/ p z: N6 T+ o {3 \ w, d2 y I( _7 w
TXD_Cnt=0;# D- J& d. k' N$ @) c( E" G9 D: z
TXD_State=2;! A2 f' K X* ]" f$ k; k
}- K' z, V( D2 E+ `( F
}break;7 o$ h2 k: ^" ?9 A0 K5 b
case 2:3 A7 g; b+ o9 J V4 ^9 I0 f* T
{9 _6 T1 V- G1 p+ {8 |7 `; v s
TXD_IO=1; //发送结束位
* A, h/ `5 o9 B& [( A+ R. O TXD_State=3;8 D5 x. W& @4 K! L$ k
}break;
[# t0 F S0 ~ g1 n case 3:
5 }: u# [+ ^, S" T! ^ {
. S9 z7 m3 F% O$ O: O G TXD_State=0;
, ]- ^/ ]( z2 S( J u6 d. `' W Sending_Flag=0; //发送中标志位清03 W4 `! @& z2 v# Q& C- Z4 D
TXD_Data=0;2 z* D' ~2 S$ b1 o; j( O
TXD_OK=1; 0 B- \% ?; R: D5 |# `1 }
}break;
5 C* w* ^; _) @: L8 b! r }
5 r, L5 D" x9 o- d) i2 [) k6 S, ] } & ]# n" P3 ?' c9 b8 c
}- E' Q$ e X& m: s' [* e
3 h; V0 z2 w; G' b+ X+ b& o4 T
, x0 C' G0 q! I8 U/***************************************************************************' T7 o8 l9 S. }& {. d
*函数名称:TimerT0()8 Q3 g* K' {2 M: @
*功能 :定时器T0中断$ C( `% ?* B& P7 J
*入口参数:无
, f9 z/ d; W2 v*出口参数:无
1 w e- B( O, d$ k*说明 :& i; t: O: r9 `1 L) J- D
***************************************************************************/& Y- Y3 h2 U* t% g
void TimerT0()interrupt 1- G* j% `7 R; w& Y& t
{9 \$ d- f7 x* }% V
Data_RXD();
% [+ C c- ?* E$ M Data_TXD();
7 p7 N- ]: k# L2 g}
, @6 Y& k! z) _# w
6 E+ w& K* k9 K- ?4 Y6 Y8 W下载:, c6 @( d7 q2 a9 }; l, C+ v
7 i& O% x: W- ]. y+ m. Z! e
, a* i7 y/ d5 q2 p/ F# I" z
|
|