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

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

[复制链接]

该用户从未签到

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

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+ ^' {% \
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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