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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
51单片机模拟串口程序源码
" R2 z5 d; {) r; L
  S6 s( ^) s8 J6 P0 C

" i+ Q; Z3 q6 r 6 K* y$ _% U$ `4 g1 e8 m1 N
#include "Usart.h"3 U6 v  S6 |) |4 T, \8 h
bit RXD_OK=0;                           //接收完成标志位
. O: L) K, v% j( O7 M& Y' a. y# m" Fbit TXD_OK=0;                        //发送完成标志位. H/ b& }. r0 i  c" d
bit Send_State=0;                //发送开始标志位
( D' u' k; J  m6 D( Ybit Sending_Flag=0;                //发送中标志位
( P% E1 W" R8 L+ d: w& ^3 [uchar RXD_Data=0;                //接收数据缓存区
$ n4 I1 P! n1 L3 g' W, R: duchar TXD_Data=0;                //发送数据缓存区
: {( ^& S9 {8 z. P3 {sbit led1=P3^6;
( z% s& Y) f: zsbit led2=P3^5;
& k/ {" h1 D0 {( asbit led3=P3^4;% M, N2 p: X& F5 T( B- o+ }
/***************************************************************************
( ?, D/ w; q* D# g, }*函数名称:Usart_Init(uint Baud)# n5 N5 N! @# n
*功能    :串口初始化                                波特率对应定时器溢出初值(11.0592)5 O+ V9 a1 s$ p3 T" U1 Q1 `
*入口参数:波特率                                        4800        192
7 M; J8 J$ Q, \) N; Y0 H, P*出口参数:无                                                2400        128
6 s& H  L5 t. \9 c*说明    :                                                        1200        0
; o% Y: h" G3 O0 @- ]# s***************************************************************************/
/ Q* L5 b8 h3 w& L# lvoid Usart_Init(uint Baud)
2 j/ W& S- ~/ q! |5 D# h{                                                                        1 m9 U( C9 O' C, {/ U
        uchar T0_Low=0;                                       
; z) t8 S! O% p4 W8 _# R        T0_Low=(Crystal/(12*Baud))/3;        //求出定时器初值  3倍采样速率# r! Y- N: [: _3 [
        TMOD|=0x02;                                                //定时器0自动重装模式7 R! O2 X  {) q0 Q
        TH0=TL0=256-T0_Low;( z" y  E, L) |! Q0 A1 O: X
        ET0=TR0=1;2 W4 ^+ m2 V5 A, e
        EA=1;
6 ~5 H: X( y3 R$ |, u, t0 }}
3 h' @8 P8 D0 h: E  _  w- J/***************************************************************************
2 s0 d7 }- w4 F1 z# P1 M" F/ J9 c" x*函数名称:Data_RXD()3 \' `, ]/ Y# B3 C& R
*功能    :数据接收
9 ~6 ~- [0 |& d- ^$ w* h*入口参数:无
6 _$ w$ `- C; e* J% R- o: X' M! I*出口参数:无3 U, Z! Y' f$ r4 Z, M3 C
*说明    :) I" V  p8 `' T& e: O+ }$ s
***************************************************************************/' U2 D# B7 \% R) Q9 I
void Data_RXD()
8 ?' ?- [9 B5 y# R/ ^) w{
! z5 o* ^* V' L" x% i        static uchar RXD_State=0;
' ~3 O. g& |5 q  f4 c        static uchar RXD_Cnt=0;7 A( U% u; F; h. H
        static uchar RXD_Count=0;
* ^6 {6 z4 Q% {* l& Y        switch (RXD_State)
0 i3 e) g2 X- C3 f3 t        {
0 C  A. v( V* ?4 n- b4 I7 k% K4 @; g                case 0:                                                                 //3倍采样速率采起始位
" y" c( R& |1 W3 k                {                                                                        
( P  S1 [; x5 Y3 R( g2 h                        if(RXD_IO==0)
& ]. P, A' P2 z3 O  a1 D) L# Y                                RXD_State=1;" l# s  l  y6 G2 y  i
                }break;! i2 ?/ @6 E4 c5 `' z' g- `
                case 1:                                                                 //采到两次起始位! R" Z+ }5 O. Z( X' f  a
                {                                                                         //采样频率校准到1/3与2/3之前  ]9 h' `1 I3 N% j4 R
                        if(RXD_IO==0)
8 ^% T0 S. \8 Z1 i: x" C5 l8 _7 h                                RXD_State=2;
2 D& J6 j' b4 v9 p( t! J                        else RXD_State=0;
& V' m# [/ z: ~! u                }break;
4 s) f4 z7 d) m2 U: C$ Q! [/ o                case 2:                                                                 //以正常波特率采样,取出八位数据位5 S" m: o/ B4 W& S$ F
                {
# s9 E' X5 H* q4 g" u& Z) o                         if(++RXD_Cnt>=3)                                 
  F2 j6 K1 q- E$ D* S8 w$ {                        {* e1 y/ U1 c# {, P& M) h: Z9 }8 @
                                RXD_Cnt=0;. B2 n, {) Z  ^
                                if(RXD_IO==1)
( e6 b* {$ z( X' s                                        RXD_Data=RXD_Data|(1<<RXD_Count);7 B8 Q$ @* o' A" i$ r( i0 N  Y
                                if(++RXD_Count>=8)
, O/ c0 _6 R+ D8 i/ T* O# W; h                                {
' U" r$ \3 G* q3 }& F2 D( R, ?                                        RXD_Count=0;8 o6 N- Y0 q! R+ K5 @8 n
                                        RXD_State=3;
2 H; T" b8 O9 J& `6 A# H2 m                                }
' M5 ^$ C5 Y+ A: g6 I4 Q9 j$ Q                        }% Z7 S$ C1 S# |. e: U8 w2 {
                }break;: s; L: W7 X' @. e( R
                case 3:                                                                  //取出结束位
+ s3 j' M' b3 B  }% h; r                {                                                                          //结束位正常接收完成标志位置1/ {/ S& t0 t3 W& I4 F: ^
                        if(++RXD_Cnt>=3)5 y/ U  l. ?4 l- _3 R
                        {& T- ~) d" x( o
                                RXD_Cnt=0;
' d) U: Q# z3 |" T: I$ J: E5 G                                if(RXD_IO==1)
1 y% S, j' ^2 d                                {
4 d: {+ t4 Q/ S7 e% S8 m                                        RXD_OK=1;. f5 `' j8 r5 G/ t9 i6 D, Z! L; g
                                        RXD_State=0;' D- ]  q, ^) r
                                }        
3 A" p5 V) E- P. I  M* M                                else ; K5 ]! ?! n4 J  ^3 @
                                {1 ]2 o0 T" j8 g* t5 _8 h
                                        RXD_Data=0;
" y( Q# j5 S( g; f; [$ r  Q% H& L                                        RXD_State=0;+ p1 ?! l7 F* c; J1 d
                                }
, W3 t! C' @7 I' @( k                        }        
$ ~; [* D+ f. F7 j$ K9 a. O" I                }break;
- K+ {% x% T+ l3 A; b/ I! d' {- P        }        
' e: i7 _) L# V7 E$ M. J! f}: f8 s$ a3 [, b" w: I( V, p2 A
/***************************************************************************3 N, C# A$ C& r
*函数名称:Data_TXD_Buff(uchar Data_TXD)2 W# f; `% L% V# L7 _- w9 d
*功能    :数据送入发送缓存器. Z/ O# \, f* X! F
*入口参数:待发送数据
8 R9 U# _7 c* v- `. Q8 ^*出口参数:无$ H" E( ]- u9 k
*说明    :: r' b: l5 V' x# E
***************************************************************************/
: |3 U% F) H9 `) N: i$ Fvoid Data_TXD_Buff(uchar Data_TXD)3 |, W' p5 h$ q7 t
{% q  u9 J) a0 k# Z! m* D
        7 @) E( c  @0 A/ @# T  g
        TXD_Data=Data_TXD;                                  //数据送入缓存区
6 `; j- {: }. H% Y        while(Sending_Flag);                          
% }( q) r' I+ Y6 \. f        Send_State=1;                                          //发送开始标志位
/ z  Y% o$ R% E0 ~9 T}
: q  a: g5 c7 H- d( W3 I, _5 U/***************************************************************************
+ J( l$ y& y% T) b9 j*函数名称:Data_TXD()
5 y0 x+ }$ P9 V) J; L8 Z% x. N*功能    :数据发送
# q) a3 v" M4 o3 _*入口参数:待发送数据
4 D5 d8 u$ ^0 e* V3 g*出口参数:无
# J' g0 l+ ^8 @) t! _! ~*说明    :
' Y4 o& I0 h! g7 v* m5 E***************************************************************************/
% }/ ]& U# _: K% x/ P1 O6 Nvoid Data_TXD()+ q, p, z3 D4 C0 m3 N; `9 n
{
" ~0 ~; r: r" `8 `6 i/ U4 s        static uchar TXD_State=0;- t) E" ^5 G. e( g! x6 d, T- q
        static uchar TXD_Cnt=0;
) S; T: `8 Z- c; Q. t        static uchar TXD_i=0;2 ]. `$ |7 Q/ l* P/ ?4 t
        if(++TXD_i>=3)7 w3 X" O2 p4 ]7 y* }
        {
  M" u2 f6 v( g                TXD_i=0;" z, K" ?& v2 W
                switch (TXD_State)* ]2 Q$ _; d' M$ M+ A! n
                {8 i5 b4 Q0 E8 F
                        case 0:                                                 //检测发送开始标志位, Y- {- v! k9 m  G
                        {* C# X: C# }6 [' ^8 i
                                TXD_IO=1;        , D, ~. j4 S! A' [( p& o
                                 if(Send_State==1)
* c7 L2 @) Y- N5 C! j                                {        # N& G) k( f2 B, x7 u% A
                                        Send_State=0;
/ r- |9 b' U/ R2 S. V                                        TXD_State=1;
% l8 g0 B9 f0 ^. e3 _1 j2 N- Y9 b8 {                                        Sending_Flag=1;                 //发送中标志位置1  N! T8 F9 O3 J+ M# |1 F
                                        TXD_Cnt=0;8 Z8 Y3 w* g7 h# v9 L$ u5 O  l" [% D
                                        TXD_IO=0;                         //发送起始位4 o! [( H) x5 d( u) m; \
                                }
% q# j& P: }' h/ M" B  L* q% N: C% c                        }break;- ^4 T6 H4 C  z' z' O
                        case 1:                                                 //发送八位数据
. A) D( }/ t6 E2 J' h, C1 f1 d1 A  g                        {                                                         //八位数据从低到高发送# S" {& o0 N4 g. K. [4 ^2 M/ ?, t
                                TXD_IO=TXD_Data&(1<<TXD_Cnt);
8 Z$ R: l$ V- @3 ~                                 if(++TXD_Cnt>=8)
8 U/ {# {  L/ p  z: N6 T+ o                                {3 \  w, d2 y  I( _7 w
                                        TXD_Cnt=0;# D- J& d. k' N$ @) c( E" G9 D: z
                                        TXD_State=2;! A2 f' K  X* ]" f$ k; k
                                }- K' z, V( D2 E+ `( F
                        }break;7 o$ h2 k: ^" ?9 A0 K5 b
                        case 2:3 A7 g; b+ o9 J  V4 ^9 I0 f* T
                        {9 _6 T1 V- G1 p+ {8 |7 `; v  s
                                TXD_IO=1;                                 //发送结束位
* A, h/ `5 o9 B& [( A+ R. O                                TXD_State=3;8 D5 x. W& @4 K! L$ k
                        }break;
  [# t0 F  S0 ~  g1 n                        case 3:
5 }: u# [+ ^, S" T! ^                        {
. S9 z7 m3 F% O$ O: O  G                                TXD_State=0;
, ]- ^/ ]( z2 S( J  u6 d. `' W                                Sending_Flag=0;                     //发送中标志位清03 W4 `! @& z2 v# Q& C- Z4 D
                                TXD_Data=0;2 z* D' ~2 S$ b1 o; j( O
                                TXD_OK=1;        0 B- \% ?; R: D5 |# `1 }
                        }break;
5 C* w* ^; _) @: L8 b! r                }
5 r, L5 D" x9 o- d) i2 [) k6 S, ]        }        & ]# n" P3 ?' c9 b8 c
}- E' Q$ e  X& m: s' [* e
3 h; V0 z2 w; G' b+ X+ b& o4 T

, x0 C' G0 q! I8 U/***************************************************************************' T7 o8 l9 S. }& {. d
*函数名称:TimerT0()8 Q3 g* K' {2 M: @
*功能    :定时器T0中断$ C( `% ?* B& P7 J
*入口参数:无
, f9 z/ d; W2 v*出口参数:无
1 w  e- B( O, d$ k*说明    :& i; t: O: r9 `1 L) J- D
***************************************************************************/& Y- Y3 h2 U* t% g
void TimerT0()interrupt 1- G* j% `7 R; w& Y& t
{9 \$ d- f7 x* }% V
        Data_RXD();
% [+ C  c- ?* E$ M        Data_TXD();                          
7 p7 N- ]: k# L2 g}
, @6 Y& k! z) _# w
6 E+ w& K* k9 K- ?4 Y6 Y8 W下载:, c6 @( d7 q2 a9 }; l, C+ v
游客,如果您要查看本帖隐藏内容请回复
7 i& O% x: W- ]. y+ m. Z! e
, a* i7 y/ d5 q2 p/ F# I" z
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-9 22:39 , Processed in 0.093750 second(s), 26 queries , Gzip On.

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

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

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