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

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

[复制链接]

该用户从未签到

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

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-9 04:16 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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