找回密码
 注册
关于网站域名变更的通知
查看: 558|回复: 1
打印 上一主题 下一主题

51单片机模拟串口程序源码

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-18 10:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-18 05:11 , Processed in 0.093750 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表