|
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
|
|