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

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

[复制链接]

该用户从未签到

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

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-30 06:34 , Processed in 0.093750 second(s), 26 queries , Gzip On.

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

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

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