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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
51单片机模拟串口程序源码2 Q1 V5 n" T$ i6 ]2 D
2 k' V! E( C& P  S

/ B3 c, b& i0 D: Y
% p, O% _8 }5 a7 w# p#include "Usart.h"  f; i% ~; u/ p. X. g- M
bit RXD_OK=0;                           //接收完成标志位* F* a! Y1 D4 Q4 y7 X7 g
bit TXD_OK=0;                        //发送完成标志位
' N3 T3 T9 {% |4 j' Zbit Send_State=0;                //发送开始标志位; j' Y. o4 H! X' E6 R; b- B
bit Sending_Flag=0;                //发送中标志位
+ E& `# u0 e% a; j7 s+ R! A' R$ juchar RXD_Data=0;                //接收数据缓存区
: Z. w0 o$ a+ {8 o1 A, f7 u* W9 Q, n  uuchar TXD_Data=0;                //发送数据缓存区
- L0 y2 {. p4 }; \, X  f" {) Wsbit led1=P3^6;
( _+ Z$ p. {  ]8 D+ Hsbit led2=P3^5;. D2 V3 o# b5 [. O
sbit led3=P3^4;9 U. ?$ d4 q7 T* M" \
/***************************************************************************$ }3 Q# m7 \, c* E6 v- }
*函数名称:Usart_Init(uint Baud)" K; U& z8 G. ~% y. l) }3 G
*功能    :串口初始化                                波特率对应定时器溢出初值(11.0592)- k! K) V! E6 R- B
*入口参数:波特率                                        4800        192& L) a+ r( b& q! c& q$ b
*出口参数:无                                                2400        128" d1 B) H$ M6 j+ G& Z. y
*说明    :                                                        1200        0
! m# \* f+ D2 }3 u***************************************************************************/
/ c' A; C2 t7 Kvoid Usart_Init(uint Baud)
/ t4 j5 N$ s6 l{                                                                        9 k# ^6 i) Q" y  Q3 }- x" f0 }
        uchar T0_Low=0;                                       
3 V$ F7 r# ^3 ]6 g4 N! K; Q0 x. F        T0_Low=(Crystal/(12*Baud))/3;        //求出定时器初值  3倍采样速率
  P( U0 b6 x7 w* @        TMOD|=0x02;                                                //定时器0自动重装模式( C; ^( S, u4 i( H# l
        TH0=TL0=256-T0_Low;$ x" _* l: d+ z& L! g, |
        ET0=TR0=1;
/ z& B+ i; {, }8 ]8 |3 `* T        EA=1;7 M' |1 P, r/ ?1 H) J7 ?
}4 k7 m; {' L' K" A9 H
/***************************************************************************( w( G& D8 d7 R/ K0 _
*函数名称:Data_RXD()
; X8 \0 k- \# U7 b*功能    :数据接收
3 r5 A2 ]7 X: K: F" Z2 L# d*入口参数:无
0 [5 H3 k  e- H# F& b; z*出口参数:无3 d* V; O5 R" l9 p$ J
*说明    :( H' V8 @! _2 f; I! k+ k) I' }
***************************************************************************/  y6 R* b/ b4 g( b( y) X
void Data_RXD(). F$ b( C: i% T1 ^. B% y
{
) V' x$ C( r1 ]; A: d, u1 N  b        static uchar RXD_State=0;
4 u' s7 O8 ^* m4 f$ Q  e  d, p        static uchar RXD_Cnt=0;
8 y; c5 W& i; J% E" O        static uchar RXD_Count=0;4 }3 K: x  w6 h. ~
        switch (RXD_State)
& ^2 w" I9 m) s# Z# t0 d        {3 o/ j' g6 o" L4 n: Q* p6 k
                case 0:                                                                 //3倍采样速率采起始位4 E8 H7 }+ `: |& |
                {                                                                        
: _. N% D( ]* B$ ~2 ?) n                        if(RXD_IO==0)/ Z" |# G7 N- y+ n' \0 z' p
                                RXD_State=1;" Q0 t* g  C& l* Y& w
                }break;7 I- v7 D+ ?8 a. c/ V
                case 1:                                                                 //采到两次起始位  n0 E0 Z" y5 r# q# [
                {                                                                         //采样频率校准到1/3与2/3之前, t" D5 S! `# D' g$ B$ T8 g( u
                        if(RXD_IO==0). Y4 l: }; Z  p6 i' ~" @2 M) |+ J
                                RXD_State=2;
) a% U1 h4 E3 R                        else RXD_State=0;4 x0 G' E5 D+ E% p
                }break;
: m' N, Y' B  @  E, E6 w: s# G5 P                case 2:                                                                 //以正常波特率采样,取出八位数据位& a& z( a. c3 F
                {
" _5 U! f( c, \1 _: Y* Z2 j$ [                         if(++RXD_Cnt>=3)                                 3 i& {: u* O2 L" y- w
                        {1 i( k& o1 Q- k' ]
                                RXD_Cnt=0;5 o/ M  b% ]" U2 X- \
                                if(RXD_IO==1)% N6 \. x2 `  I7 _2 `4 ~4 W' Y
                                        RXD_Data=RXD_Data|(1<<RXD_Count);. L+ g0 E8 G* C4 H- [$ _1 m; Y
                                if(++RXD_Count>=8)
' i$ Q  h* Z, f- {, s: _3 A                                {
. v$ b4 }4 U! k' l5 s8 w! k% O3 y                                        RXD_Count=0;/ V' F0 Y' R0 @6 O
                                        RXD_State=3;
. B" t% {6 s# A' J/ D4 P* D                                }
. G/ J3 @4 v0 q" J5 A                        }
5 i; c! M# X/ D! j3 z                }break;) r" f4 w# E  t) z8 w$ h. R$ A
                case 3:                                                                  //取出结束位
: c0 b" g/ f" l0 n# |% r/ L+ l  J                {                                                                          //结束位正常接收完成标志位置1
% |$ l% f7 D! v8 M# n0 ~* M                        if(++RXD_Cnt>=3)! c) P5 i: g$ t+ J2 x
                        {
) A% O, q% B% M( a) s6 E                                RXD_Cnt=0;
; P5 S0 B8 G2 E+ p' _! {1 \                                if(RXD_IO==1); m0 _! m; {4 i% e# R
                                {2 {# }1 X% |& O3 O' r9 Q! x2 i  l
                                        RXD_OK=1;
/ o+ P) n  [& K" @( E  S: d% d                                        RXD_State=0;
$ o; Y9 |' y6 ^# u                                }        $ V3 x, ~1 B9 M1 I( N$ R+ }
                                else
+ \+ E! F! s3 H; ^- C/ {                                {- r& d* e6 ^5 S. ]2 @+ m# @
                                        RXD_Data=0;1 R+ N5 @$ j, \0 \/ F  [+ z
                                        RXD_State=0;
/ V5 j8 ^+ i, S1 l1 }% W                                }
0 d) s/ n" v5 \$ @/ j                        }        + I' m( E! Q8 y' Y' g) \
                }break;
& _( N4 ~7 b( m2 r. I& r2 v        }        
2 t$ M. F) c2 a3 |}% o/ F8 ^4 G% b0 b1 P
/***************************************************************************/ o, r: h4 [9 L, }
*函数名称:Data_TXD_Buff(uchar Data_TXD)6 e( {0 U; |  P8 `7 S0 j9 u" L
*功能    :数据送入发送缓存器
' C: j0 `: I8 Y1 i' }1 [*入口参数:待发送数据
& G% j3 `* r$ |* V  V" F*出口参数:无
3 K' N3 m- P, Y; }7 s4 D*说明    :; Z  N1 h& W; E; K. g: H4 t$ B
***************************************************************************/
; ?) ?% ]8 Y% C6 E4 B, @% n8 Z+ A2 Yvoid Data_TXD_Buff(uchar Data_TXD)
! k# n" V# Q: c" u' ?. s% X{
& U  l/ `) ?4 }        
; l% Q' L0 k: y1 }  A6 I        TXD_Data=Data_TXD;                                  //数据送入缓存区0 D6 A# V5 K& F* o
        while(Sending_Flag);                          
. E/ b: R( D9 M+ k0 P3 \7 |        Send_State=1;                                          //发送开始标志位
3 N( @9 ?2 K/ k9 t}0 o0 Y" d- Q- s9 @7 d  {  X1 r; n
/***************************************************************************7 T/ Q$ \- A1 r3 q: [
*函数名称:Data_TXD()
$ \# \6 b# R3 K9 a- P/ X! T*功能    :数据发送
0 s8 k5 Z  s+ w! q4 J3 y$ t*入口参数:待发送数据7 G" m, c' V7 k0 m3 l/ y# j% t
*出口参数:无
3 {& Q. E4 t  n6 I7 `  i*说明    :
: b- D. y& ~  a( g# E) w4 l***************************************************************************/
7 w" v. a& }: U$ M1 u8 F+ N( }void Data_TXD()
! y8 p, a3 Z, i" `{
" j( {. v  }0 k! A5 r/ o2 r        static uchar TXD_State=0;$ C5 `' ~$ b' I- _$ l8 f
        static uchar TXD_Cnt=0;
( a1 @0 f) \0 B7 O2 _7 ]        static uchar TXD_i=0;0 S( G! P, i0 _, i
        if(++TXD_i>=3); @# {' U- Q" i- J& O
        {
6 W& ?) @/ T; k, [$ a( m5 r                TXD_i=0;. g# o/ |) ?* ]# \) t# U% W
                switch (TXD_State)
" ~1 @2 }8 S- H& X* s: q, U                {# I2 n; v9 V  @
                        case 0:                                                 //检测发送开始标志位
; K; d" ^' l2 E                        {* _# b- @/ n! k! u- _( A
                                TXD_IO=1;        6 l, {& ^  F0 Z/ H. j
                                 if(Send_State==1)
& {' x/ {+ _9 I9 u0 F! l                                {        
' a# }# _6 [9 K, H$ `( C0 i; D, p4 C                                        Send_State=0;$ E7 x* Y! x6 K' D/ V
                                        TXD_State=1;
# q6 W6 g" i5 s& L0 h* k! X, C                                        Sending_Flag=1;                 //发送中标志位置18 s0 d# y  _/ s! s3 I+ L
                                        TXD_Cnt=0;
6 Z) j# y4 M5 E* y0 e# M1 G                                        TXD_IO=0;                         //发送起始位
: X. l! k: `  o5 i) W5 E) W' Q                                }0 l% X2 c5 M8 e/ o1 S& m
                        }break;* J) _; U! Z. W
                        case 1:                                                 //发送八位数据
, a( e) O; d7 ?" H, k                        {                                                         //八位数据从低到高发送
6 H, f' ?* P' u% b' y! Y" [                                TXD_IO=TXD_Data&(1<<TXD_Cnt);
1 m! u( |2 b8 {. Q; ]                                 if(++TXD_Cnt>=8)) l3 e0 T" O1 |0 ]+ y* i  J% f5 x
                                {
; J  |0 t' V- B$ P" r* @                                        TXD_Cnt=0;
6 M# B$ C" z) e6 q& C2 N                                        TXD_State=2;0 K; v% |  p4 N- o, l+ O
                                }' n3 u; S4 a3 s$ r. @5 M
                        }break;; H! D1 _0 y$ |7 n! q7 X4 K/ F5 E
                        case 2:+ [9 v3 A& Q3 ^# O& E2 e8 V
                        {
  d. z# g/ P) l! r: L8 [                                TXD_IO=1;                                 //发送结束位! Y/ i; Z! M% l
                                TXD_State=3;4 ?; X9 p( b3 ^3 v: w
                        }break;
6 n' ~, n) q9 C0 a                        case 3:
# `6 G. z+ E$ \% U" H6 @$ ~& P                        {! |/ M& Q$ |* Z8 Q; T7 {1 ]
                                TXD_State=0;3 @3 u, L8 H+ W0 k# I/ ~0 I
                                Sending_Flag=0;                     //发送中标志位清0
! Y- O% |/ }' {. c2 T2 h                                TXD_Data=0;
( f( }1 ^) l7 x                                TXD_OK=1;        ' W. x3 W. z* a7 j1 d
                        }break;8 D' S: Y1 F$ r: k( _8 q
                }6 x) H- F* R7 A7 ~! @" Z, E5 O* h0 o
        }        
/ q! R: R! j* @1 B: r0 Z}
" f# Y' t% Z2 K  t6 }/ \1 _' D6 P6 d$ y% o8 ~
# A* N. g; g4 }* A! `
/***************************************************************************
0 o# }. l3 Y* `: W  K8 Z*函数名称:TimerT0()
2 }" i9 t" U/ W*功能    :定时器T0中断
, y# n' s1 N# y, D1 Q*入口参数:无2 ^$ R, H) S+ ]
*出口参数:无
: m. @' _# z4 l1 V" A*说明    :
' D2 n% j) X  }& h* N) B- j5 p***************************************************************************/  o3 l  z3 V$ d$ J, M
void TimerT0()interrupt 1
+ Z8 ]. `" L  p& u& I{
" V3 A$ c# s* Q0 q& T1 z        Data_RXD();
" ?' n* E( J1 O& r$ S( p5 `$ j4 l        Data_TXD();                          
; H, T) a8 G+ J3 m; Y! |& F. m}
+ j( t, j/ \2 f
! T+ U- \1 k' E1 W/ t下载:% @7 G2 T! M' z' @* j
游客,如果您要查看本帖隐藏内容请回复
- `7 f7 J3 z+ i/ Z! v. G
* ~6 ?) J/ M& w9 y0 q/ m& U. v
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-18 16:36 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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