|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
stc单片机双串口中断收发源程序
0 L8 e, c) V( ^/ e7 G# {
9 K7 i! X7 X! a+ T% U; A1 m5 N; ?& |. x) P" W
. M, R2 V2 _6 {- _( X5 H
/*---------------------------------------------------------------------*/: v3 ?7 M# z3 v5 ]4 N4 x- [5 C
/* --- STC mcu International Limited ----------------------------------*/
! u, M" z1 M7 G: \1 u" ]/* --- STC 1T Series MCU Demo Programme -------------------------------*/( L, ~3 n0 u, g9 M: O4 l7 U9 C( I
/* --- Mobile: (86)13922805190 ----------------------------------------*/: l) l9 C9 {7 y$ g8 J. X3 e
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
( L; U9 I: ~6 k1 ~8 _/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
9 T S8 C) |; j7 i/* --- QQ: 800003751 -------------------------------------------------*/7 u' B" [7 N% c/ R8 f) C
/* 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序 */
6 Y/ G+ s, u4 y- h, f/*---------------------------------------------------------------------*/
5 ?: d; V/ e6 t" O6 B* h% l% l8 G( G( r3 J( C+ l: h, Z: H! Z: l
% O7 |2 N3 S* C1 U
#define MAIN_Fosc 22118400L //定义主时钟
9 P! W0 J2 C9 E" t- \7 V* s5 Q, h% _5 ^, F& b" \' S
#include "STC15Fxxxx.H"
$ J; d; i3 _- F$ U+ N7 ]5 v. r
#define Baudrate1 115200UL' g: E( p. n: ^
#define Baudrate2 115200UL
% i3 C4 {+ U9 |
2 U+ P3 H" m, R$ r" i
0 Q0 N, ^: Y5 S+ ^! v
! [- ?, @3 H$ `) p4 D- y. d/************* 功能说明 **************& R# k9 _4 m8 i6 z
7 D1 C8 g) H5 ?& @2 }' T4 L
双串口全双工中断方式收发通讯程序。+ R" N T3 s7 o$ K
+ z1 G+ f! r* o) N& b
通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回." M+ A0 @0 Y- H9 J% ^, r
/ y7 \5 H/ h7 p9 r6 G/ T! s& {******************************************/0 Z' p" h' ?: B; K4 W
) e& H) R0 E3 m( i
* |' M' t; E3 g' U
#define UART1_BUF_LENGTH 324 H: V- o& {; U6 F
#define UART2_BUF_LENGTH 32
0 D( A% g& S5 [2 j' A ~1 K7 B$ a1 J/ M, U( G
6 }& z$ r% e: C, Q8 W% G9 w
% P( m/ l: f1 h
u8 TX1_Cnt; //发送计数
1 G' i% g. o8 O7 w6 F7 Mu8 RX1_Cnt; //接收计数2 M7 r S/ ]% r' i
u8 TX2_Cnt; //发送计数: l, c7 O2 _5 A; _1 }
u8 RX2_Cnt; //接收计数, U# z: T5 W8 i) K1 V, K
bit B_TX1_Busy; //发送忙标志% }% C" c3 C" m( v7 A f1 p7 P
bit B_TX2_Busy; //发送忙标志- n3 T0 J8 P1 O
, x( V( y7 ~ ?& X3 r7 R9 I0 Bu8 idata RX1_Buffer[UART1_BUF_LENGTH]; //接收缓冲
/ e9 h$ u% ?' b+ n/ K# S+ a1 {% }u8 idata RX2_Buffer[UART2_BUF_LENGTH]; //接收缓冲
6 B e% R% c9 U0 E# f: E% M8 T& ?- {' y. e4 o- g
9 P/ } r* K4 ^! D2 i
void UART1_config(u8 brt); // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率. c7 Q9 C! n, {* o% a' |
void UART2_config(u8 brt); // 选择波特率, 2: 使用Timer2做波特率, 其它值: 无效.1 }# S) I" C3 s# K! K
void PrintString1(u8 *puts);
& T) c6 l, V& A4 k( h' L" y; svoid PrintString2(u8 *puts);
) R, c) B7 j1 @; a p8 r s# E: o: O# W( _8 c& Y: R/ q; j
7 T* D4 R3 b" Q
* ~1 C" j9 k: |//========================================================================
) y P" Q' r8 [2 g$ \: ?+ ^3 Z0 g// 函数: void main(void)2 f' N( b* Z( Q7 K
// 描述: 主函数。9 J, J; R) k4 Q/ v: F E
// 参数: none.
5 S1 [ l, Q g+ Q" |( s0 w// 返回: none.( G3 E+ _& n$ [; p C4 r
// 版本: VER1.0& F& C6 K: R) s
// 日期: 2014-11-28: ^ b+ q5 h% L
// 备注:
: z) W3 U$ I! A( \; g//========================================================================
" Z" i+ Y0 }; [+ a# l* _; `void main(void)
) I' P6 }' P" F{
" N4 c* S; H, G( T. x; [; i% ^ P0M1 = 0; P0M0 = 0; //设置为准双向口
8 {. [9 Z e& V0 B; D2 `7 I! V P1M1 = 0; P1M0 = 0; //设置为准双向口5 t+ }0 m0 x5 x: @7 e( v
P2M1 = 0; P2M0 = 0; //设置为准双向口
, I+ d0 Z3 X. k! B7 b4 o8 q P3M1 = 0; P3M0 = 0; //设置为准双向口
2 A \8 I% m5 a/ Z5 s; v+ A3 j& { P4M1 = 0; P4M0 = 0; //设置为准双向口7 o! w" V o0 z, N5 L
P5M1 = 0; P5M0 = 0; //设置为准双向口
, i3 u& L% R+ a4 J" Q# m P6M1 = 0; P6M0 = 0; //设置为准双向口
6 \9 ~) B8 Y6 _: l5 @6 n# Z P7M1 = 0; P7M0 = 0; //设置为准双向口
& F H+ _8 f% j+ z& ^8 S" G X' d9 P* v4 _$ J
UART1_config(1); // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
4 Q3 u& q) B& d: g2 Q M2 j UART2_config(2); // 选择波特率, 2: 使用Timer2做波特率, 其它值: 无效.
1 i/ _+ o7 [/ j5 A5 ^- t3 F EA = 1; //允许全局中断
3 R" s3 b7 L2 U" s9 F: P# B7 E* L# L8 A- U$ W
, l O1 d- m' A. P9 |" B* ^. O7 m PrintString1("STC15F2K60S2 UART1 Test Prgramme!\r\n"); //SUART1发送一个字符串) N$ r6 t2 t6 w7 M& G2 z3 Z& }' P+ o
PrintString2("STC15F2K60S2 UART2 Test Prgramme!\r\n"); //SUART2发送一个字符串
( o8 Q \4 k+ \4 c$ C, M* a" h) t2 |) Z' e# |# z& O
while (1)' `. Y5 Y& j5 r: g8 s
{+ m* x6 B1 z: b1 p, n9 B0 @5 N) c
if((TX1_Cnt != RX1_Cnt) && (!B_TX1_Busy)) //收到数据, 发送空闲, D2 w5 u7 t' i( M$ T
{
2 t+ ^/ N! Z, X2 ?/ {5 ]0 u1 ~ SBUF = RX1_Buffer[TX1_Cnt];
! j9 `) z5 u1 a. i& @9 J: B B_TX1_Busy = 1;
& R" C$ \0 g2 ]9 N, G; |+ h) h J if(++TX1_Cnt >= UART1_BUF_LENGTH) TX1_Cnt = 0;; p( E& M' f: \8 U6 B8 |! R1 j' J
}3 q/ v! H+ U# E1 P
; w3 g* ], E, L8 o! e0 [/ r if((TX2_Cnt != RX2_Cnt) && (!B_TX2_Busy)) //收到数据, 发送空闲
4 I# X7 {+ W( j6 e3 E- Y, D {; A; b! W6 C) |9 x \' @5 X. {
S2BUF = RX2_Buffer[TX2_Cnt];/ h% U. k- F6 Y) a
B_TX2_Busy = 1;4 R5 o [1 U" J& c
if(++TX2_Cnt >= UART2_BUF_LENGTH) TX2_Cnt = 0;
4 D# {2 l" N* b! Q. v6 ? }
* _; f. ~7 N' X5 Q3 o }- E& @ c. ?/ k7 M( I# _
}
& R0 i6 v T/ Q
3 S6 Q% c# z# x1 }/ f# u
- l- ]+ {; e: M( x6 E//========================================================================
: P. q5 C* q0 H// 函数: void PrintString1(u8 *puts)
* D4 \* ^) { l K# `& m, N// 描述: 串口1发送字符串函数。9 X& N5 c- j- A8 s" S' Q
// 参数: puts: 字符串指针.: H4 t: M5 n! E, T
// 返回: none.
g# X% P7 ~9 [// 版本: VER1.0
% s6 }# |+ k$ Q# r// 日期: 2014-11-28
( V9 d' w! u" S4 ~4 ]" S" h7 M# t// 备注: # J& w; I' {, j" e' K3 `. Z6 u2 Q n
//========================================================================& i1 o2 ]8 ^7 U* l. n
void PrintString1(u8 *puts)( A1 d8 P) | c" y
{
# {4 s- E( \# R for (; *puts != 0; puts++) //遇到停止符0结束
6 M6 a' H5 O8 }) a" X1 m4 }' P. R5 P {, U# \7 I& o2 u; j
SBUF = *puts;& A8 b: m7 O9 {+ ]0 \9 |& W
B_TX1_Busy = 1;2 V( w- h% J2 P& R2 j1 M! l5 v
while(B_TX1_Busy); q7 }% I& X. d* D+ W# I6 w/ Y
}0 _6 X/ ] z# t) C
}$ }/ X4 K' V! d% T% a4 j( k: [
* F5 A y) X1 C) u& o' Z$ J; g//========================================================================
8 ^; P, I/ |# j% C: k2 z// 函数: void PrintString2(u8 *puts)
& z3 p( L) X! e! [/ A7 a, @3 C// 描述: 串口2发送字符串函数。; C' j# g, V! B8 G, F; r
// 参数: puts: 字符串指针.* w9 w# O2 `, v% X y
// 返回: none.
5 I0 i- \6 p. v// 版本: VER1.0
8 V2 E7 F$ B, N0 L7 e2 M; s$ a// 日期: 2014-11-28
1 C5 b, J1 j- b$ F3 A% ^# u+ W// 备注:
& h' C+ a5 j9 B+ l/ m//========================================================================
" ^/ z3 o+ C4 w- ]( Hvoid PrintString2(u8 *puts)
% i# C# _+ Z( U' _4 s% s' ~{
/ c5 Z+ a& x E; B for (; *puts != 0; puts++) //遇到停止符0结束! p' p- X0 C' Y' F. O; Z" p l( H
{
7 R6 B( K" P/ ^ S2BUF = *puts;4 R' r, k0 h3 @% w$ m& J9 L: f$ }
B_TX2_Busy = 1;, {) t, U5 H6 g$ y8 I
while(B_TX2_Busy);
1 ]0 J% Z! _' p: ^ }- a: V) N: L$ l2 ^& B, |/ o) L8 k
}
7 A' x+ U' P0 Z+ O
+ t% C8 f( p g0 l" l. @//======================================================================== O3 N2 C9 u& k0 C, ~
// 函数: SetTimer2Baudraye(u16 dat)
7 T B/ ^ P; Y8 H0 T/ A, A U& L// 描述: 设置Timer2做波特率发生器。8 K# l# O1 q0 M0 }' K& r+ }# U" t. Z
// 参数: dat: Timer2的重装值.
+ b3 O, ?' ~& X// 返回: none.
( k8 ?9 T3 |' }* k// 版本: VER1.0' Z3 m0 H$ I! j3 E; y# V
// 日期: 2014-11-286 A5 d$ q: J, U
// 备注: 6 x( J* f& V" n) h$ }
//========================================================================$ I3 f5 `$ {( F6 i- E
void SetTimer2Baudraye(u16 dat)+ ~8 n; F6 E- j
{
( H0 e. N- |& K, p AUXR &= ~(1<<4); //Timer stop
1 y, O6 ?" @) u) T& Y AUXR &= ~(1<<3); //Timer2 set As Timer
( ~& W( K- L( o& F! z' y: t6 s AUXR |= (1<<2); //Timer2 set as 1T mode
2 O5 ~+ Q* } z0 U4 S# [ TH2 = dat / 256;
" X9 M1 M6 \6 {( ^0 E TL2 = dat % 256;
" ]) U* o( {9 }. ]/ @ IE2 &= ~(1<<2); //禁止中断
" H9 O0 \' G5 l4 I AUXR |= (1<<4); //Timer run enable
" z8 @9 d6 X' S ~; S}
' t- f3 d2 [: z: E: L
h( q- S: s, W9 y) |1 U//========================================================================
n; s/ ~+ Y! j( g// 函数: void UART1_config(u8 brt); @1 ]5 [( j- \5 u% V' I% I. m1 K8 |
// 描述: UART1初始化函数。: i& V6 W! g D% z
// 参数: brt: 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
# `. O" J% ^7 [, ` i// 返回: none.8 {/ W; A$ O5 N
// 版本: VER1.0' o7 \' i& S5 t# M" u! C* j( k
// 日期: 2014-11-28 f0 c( w4 C' S3 R% c# {+ D" n( r
// 备注:
& N4 h1 z5 k1 v/ H$ V5 Q; \//========================================================================
* [8 m& F2 _" ^void UART1_config(u8 brt)
2 @* `( m" r" A{3 ~7 c; |# f0 i+ V X
/*********** 波特率使用定时器2 *****************/2 o! r* Q' \, k9 Q! w9 X9 u5 V7 `
if(brt == 2)
9 v' n' o1 t5 o& J# J3 H {
1 f# W3 T' s* S* o6 I AUXR |= 0x01; //S1 BRT Use Timer2;
6 ^- q/ M3 A& L( i% n, i8 n SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / Baudrate1);
9 s( y; p- E" V2 w) f }
& c5 x' t* e- n. h# _6 X6 U. i' U6 r
4 M2 p! A. |3 [# [ /*********** 波特率使用定时器1 *****************/
4 g0 Q0 D: ]+ R, i else
r2 t) \ \& M$ z( S {
2 R+ T* n$ g0 H/ p! g9 j9 G, Q1 |) ]4 G TR1 = 0;3 \- h! U4 h+ ~& ]. q E% Z( L
AUXR &= ~0x01; //S1 BRT Use Timer1;( w" G, U$ a" k2 S8 M) X K; s
AUXR |= (1<<6); //Timer1 set as 1T mode O+ i( m! J$ E/ B8 p
TMOD &= ~(1<<6); //Timer1 set As Timer
6 h) } n: w. W: E7 a! W T& M TMOD &= ~0x30; //Timer1_16bitAutoReload;
; H: ~, g$ R% _$ I! E TH1 = (u8)((65536UL - (MAIN_Fosc / 4) / Baudrate1) / 256);
7 z; ~, Z+ O0 ]% ]4 k5 w8 Z8 I TL1 = (u8)((65536UL - (MAIN_Fosc / 4) / Baudrate1) % 256);# i0 y$ m5 }$ u- v! _9 w# W- E
ET1 = 0; //禁止中断' B5 p9 m; o) Z, a8 d+ w
INT_CLKO &= ~0x02; //不输出时钟
3 }4 K: s5 Y# X7 p3 \ TR1 = 1;9 ? M) L% J. H$ i
}0 l _- Z3 \3 F8 l0 g$ x- y; i
/*************************************************/
- A1 M5 b0 Z6 O/ y4 d4 N
3 ]: W8 S! s4 Y SCON = (SCON & 0x3f) | 0x40; //UART1模式, 0x00: 同步移位输出, 0x40: 8位数据,可变波特率, 0x80: 9位数据,固定波特率, 0xc0: 9位数据,可变波特率
8 ?; g% Q/ B% \- a! x// PS = 1; //高优先级中断
, k, T% k! o0 d1 e A' C6 s ES = 1; //允许中断
/ q& }) p7 `$ d4 s& X6 h7 M) b REN = 1; //允许接收9 m2 F+ X5 A1 V* O# t9 f
P_SW1 &= 0x3f;
8 D& w' }5 B& L& R. [* v P_SW1 |= 0x80; //UART1 switch to, 0x00: P3.0 P3.1, 0x40: P3.6 P3.7, 0x80: P1.6 P1.7 (必须使用内部时钟), D+ x! h a0 W8 D- L. b" F
// PCON2 |= (1<<4); //内部短路RXD与TXD, 做中继, ENABLE,DISABLE% {% T, G1 t4 n* n3 E. b* T
8 E; n, [1 `3 m8 h: A2 i
B_TX1_Busy = 0;
" U8 N) {$ t- ?$ Y! n, e TX1_Cnt = 0;/ R. D0 a- M5 h. R
RX1_Cnt = 0;
7 C8 E# a7 Z& t; v a* v1 v}
3 {4 r' `5 i! {/ H2 k7 S: @+ [; z5 C" W& C" B
2 a1 u7 V: \. D0 `' ^7 K, [6 A4 z//========================================================================: Y& X8 I X0 e$ T2 p; L( S
// 函数: void UART2_config(u8 brt): ~. X% Q. D0 R) d9 |. C6 @
// 描述: UART2初始化函数。% p% {8 F* {+ D* k" _* l) q5 z2 x
// 参数: brt: 选择波特率, 2: 使用Timer2做波特率, 其它值: 无效.
0 B5 c! c8 q1 W& t5 C0 U- T// 返回: none.
0 o4 F z: G# f# h- s// 版本: VER1.0* K0 ?4 P* j) R C- A
// 日期: 2014-11-28
; N5 d; y& M1 n: p// 备注: 1 h! }) I! g% x
//========================================================================
( B2 i: g6 B. |void UART2_config(u8 brt) // 选择波特率, 2: 使用Timer2做波特率, 其它值: 无效./ y: M( }, I8 Z4 @8 A
{7 T1 l1 E! o8 y8 J
if(brt == 2)
, K* ^; B* O( B& z f! N* W4 Q/ x {( ?1 A7 [" ]) o' o
SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / Baudrate2);5 e3 P7 V; Z. l& l$ V; [
; X& K8 P" x Q
S2CON &= ~(1<<7); // 8位数据, 1位起始位, 1位停止位, 无校验
7 i+ J2 w" N% J r5 a IE2 |= 1; //允许中断
$ [. Q! Y8 o8 P2 W2 Q S2CON |= (1<<4); //允许接收9 L2 b# v1 Z% k5 g& K
P_SW2 &= ~0x01; C ?- M' I# {1 @# Q/ W5 y; ?
P_SW2 |= 1; //UART2 switch to: 0: P1.0 P1.1, 1: P4.6 P4.7
1 W2 t7 V. w, V `0 G' @) U7 m, j% j4 L& H2 d G% N2 L3 k1 J
B_TX2_Busy = 0;
% Z4 O0 ~6 K! V TX2_Cnt = 0;
& X) \' b! o) C5 @% V2 o RX2_Cnt = 0;
; l- Z: J* U. r }9 S% Q' g9 C: I1 ^/ G' c2 P
}9 V4 }/ s$ f6 m) G* e
# I! W3 ?, B# h9 S
& R. o, G( X* e+ b5 F" S8 [0 p//========================================================================* K0 r, P. Q' f* P7 L, ]
// 函数: void UART1_int (void) interrupt UART1_VECTOR
* D. n l2 p* F// 描述: UART1中断函数。
1 D) g4 s+ W% b9 N2 `// 参数: nine.! x3 u( C2 r) L2 [
// 返回: none.
f' Z* G; R2 Y$ z+ _// 版本: VER1.0
5 G% N1 Y& F1 Z' X* S// 日期: 2014-11-28
" X# L L8 z) b8 X5 F6 r// 备注: % n3 t& f9 H* D; L
//========================================================================: \- D7 |. s# V7 v4 h: j
void UART1_int (void) interrupt UART1_VECTOR
]# q$ T# E- S4 I5 A! x6 C/ |{; R6 E- l- K# v! _2 I; E* A
if(RI)' ?3 n k# B0 Z$ n v# y+ w1 q2 c
{" F7 g% V& l5 X" D) I
RI = 0;
- ]+ q. b# d' a9 d/ h' G RX1_Buffer[RX1_Cnt] = SBUF;
# Y3 e d! Y) C; z& P if(++RX1_Cnt >= UART1_BUF_LENGTH) RX1_Cnt = 0;
' K6 ]2 U* }& A }3 ^$ ~8 l6 S y, t
% L+ M* L2 B0 Q+ S H' L if(TI)
+ I1 r3 H0 \- [# f {
# A( l# u/ x+ W! ~' V+ y& \ TI = 0;
5 ^$ B0 ?( s- o0 H6 B B_TX1_Busy = 0;: N0 A- X6 T9 A# X+ d; l/ @) c
}' J4 w% t& |3 J) p
}
# L) \) U* L3 H/ x/ D3 }* e! i& C8 T0 k# W4 D# P' D/ g
//========================================================================
5 H1 V1 _6 }9 \! X: Q4 s// 函数: void UART2_int (void) interrupt UART2_VECTOR
7 r3 s. W7 V! G3 a$ J! [// 描述: UART2中断函数。9 n- l* |) @6 O
// 参数: nine.3 i# k/ C0 k) f* L/ _
// 返回: none.! n! I2 U, @7 f% W1 m4 |, I" w
// 版本: VER1.0" J" j2 w6 [0 K: t5 ]2 c
// 日期: 2014-11-28
/ ^" G2 d3 N8 M# O3 |// 备注:
% ^7 g- u) t+ z5 k. X' P/ y//========================================================================0 o& }* Y0 w# c/ x# r
void UART2_int (void) interrupt UART2_VECTOR+ G2 G0 j9 H4 G3 B4 k
{
: L3 {$ }8 k% R3 K: j6 x+ L. j if((S2CON & 1) != 0)& L( o0 p; q% J" v. `
{
, m. o$ b3 X% p" L S2CON &= ~1; //Clear Rx flag% [$ F, W9 |$ H0 i9 x
RX2_Buffer[RX2_Cnt] = S2BUF;4 V0 r5 b! k+ b; V7 f/ B
if(++RX2_Cnt >= UART2_BUF_LENGTH) RX2_Cnt = 0;
0 \3 O8 Q3 j8 O! H J' S }$ b& u5 w( v: B9 O- N R( s% c6 [
, j8 t. x4 A ^8 ?' g& t. Y# E' [: ?! O5 y8 m
…………限于本文篇幅 余下代码请下载附件…………
- V' |$ ^6 u( D4 W8 h8 O; n
" }7 _. W; j& V6 P/ F+ y* \
2 I; Y: v$ m) ]! v& C
+ g$ t' A+ O- J0 P, D4 y- d3 ~) J; n6 E7 m7 K$ f0 [
|
|