|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#include "reg51.h"
9 ?7 [& ^. q& ^/ i- s% l2 Q5 Q; ]5 N #include "intrins.h"
. k9 ~1 V# G$ n9 E5 z0 K$ A* ? w
typedef unsigned char BYTE;
1 x7 }* k! H9 q) t4 U9 e' d typedef unsigned int WORD;& J; A N1 M4 F2 F
" S: l: a( M5 p0 |+ x% a3 m. M
#define FOSC 11059200L //系统频率/ J& M! D! w9 a( t; R( L2 z* e
#define BAUD 9600 //串口波特率" u) a0 B! n, _) Y
0 F9 v' q% A/ I; d* S#define NONE_PARITY 0 //无校验+ w- U; c! H! Y# N! H
#define ODD_PARITY 1 //奇校验
; E2 p1 _/ e# E# n2 r#define EVEN_PARITY 2 //偶校验
( X0 X" t+ c+ t! ?& g Y( i# G#define MARK_PARITY 3 //标记校验$ G, E- l* Y. Q1 y. S
#define SPACE_PARITY 4 //空白校验
L; ~1 V3 P. b: t3 H6 r. x0 |8 n: J- m o4 n
#define PARITYBIT EVEN_PARITY //定义校验位
1 }! |4 d( s' Y# m& [( a/ ~4 r
sfr AUXR = 0x8e; //辅助寄存器. Z4 F% ]. _; ~; j: \" M8 I7 g1 i; z
sfr S2CON = 0x9a; //UART2 控制寄存器$ x# f1 G" q5 R$ ^, q
sfr S2BUF = 0x9b; //UART2 数据寄存器
: @2 ]2 `+ u) o5 @1 Usfr T2H = 0xd6; //定时器2高8位! }4 U' i; C$ r
sfr T2L = 0xd7; //定时器2低8位& a6 {5 K8 G# r
sfr IE2 = 0xaf; //中断控制寄存器2
: @' l3 _+ {$ `$ `4 t" F8 ~# U5 C: x9 `' T. g# x8 h5 `
#define S2RI 0x01 //S2CON.0
! C0 A! k8 l0 ]" ]( q1 @: k #define S2ti 0x02 //S2CON.1
7 G0 z$ h- Z$ T; }8 D* T! g #define S2RB8 0x04 //S2CON.2
3 V, X2 b6 g# D. c #define S2TB8 0x08 //S2CON.3
- v( s! o' h! o' p# X( T; H* g; X- V0 A( \) A' P
sfr P_SW2 = 0xBA; //外设功能切换寄存器2; r7 I* h' m1 O5 X& A5 Y, x- p5 ~
#define S2_S0 0x01 //P_SW2.0. q% r: u! W/ Y/ F* m5 ]
|, e+ T! }, e! |+ K
bit busy;
% `4 G1 |! ^5 ^4 Q; z, \: d6 I BYTE BUFFER[10];
7 i' w0 a; J/ H. g* Y5 D int i;
9 S4 E! s$ y9 l4 C void SendData(BYTE dat);) l- ~. }/ Y6 z& b" l
void SendString(char *s);
: V9 }1 O, H+ H& D4 ] ]
$ ~2 Q) q+ L, F void main()
! I2 Y4 ^9 H- c5 f( i/ ? {% p( Z$ v' Y6 l8 t X
P_SW2 &= ~S2_S0; //S2_S0=0 (P1.0/RxD2, P1.1/TxD2)6 ~; E1 L* p2 d& i
// P_SW2 |= S2_S0; //S2_S0=1 (P4.6/RxD2_2, P4.7/TxD2_2)
) p+ a3 b5 O M# R, u
/ r2 N! c x# S4 e6 k8 U2 R- r4 Z #IF (PARITYBIT == NONE_PARITY)1 h- V# j3 Q, s% b1 {* `
S2CON = 0x50; //8位可变波特率0 s& `6 P' ^, m& e2 x9 u
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)' f: n Y7 a. F
S2CON = 0xda; //9位可变波特率,校验位初始为10 X* q% Y& S3 G/ y2 V
#elif (PARITYBIT == SPACE_PARITY)
2 L$ h' w2 F9 t- ]# w5 z) S S2CON = 0xd2; //9位可变波特率,校验位初始为0
9 z( F. E; B) t; [, c) V. l+ q( j' |9 | #endif* o8 h) S3 L$ ] S# L$ t* I8 P6 v( l
3 A5 H3 J( s- }# |0 h T2L = (65536 - (FOSC/4/BAUD)); //设置波特率重装值: v* F. g) |4 n. i2 i3 u
T2H = (65536 - (FOSC/4/BAUD))>>8;. ~1 u* ~- q$ B# O- Y$ z( k
AUXR = 0x14; //T2为1T模式, 并启动定时器21 T+ ^- ?' j4 H3 j
IE2 = 0x01; //使能串口2中断9 W$ f* |. l; `: R
EA = 1;( `& ?# o" ?' S1 S' I0 o! v
0 r/ P9 F. a3 n; r+ ?2 d8 \3 H //SendString("stc15F2K60S2\r\nUart2 Test !\r\n");
# p9 s) Z. ~7 _+ |! r+ h) @, _ while(1);( P8 g/ @, k3 H( [1 n8 J- c
}
2 ^! {3 y) X/ }! F" M( Y8 `
" Q& r% Y# H9 T6 a# ^ /*----------------------------$ I; X- b9 h: u! s
UART2 中断服务程序1 ], ]' K# c' W, \$ t. t
-----------------------------*/
+ a$ m; P) w5 X) H, n8 kvoid Uart2() interrupt 8 using 1
, _( h8 \* U, b2 M {
7 p6 e6 v: i7 s3 n if (S2CON & S2RI)
! _$ {8 g& B6 ]9 W1 f- R {' X& f0 [2 U- v" X$ n$ O: ^
S2CON &= ~S2RI; //清除S2RI位
, |, A7 k0 j3 m6 q! d' }. c. q BUFFER = S2BUF;
# f% [! `0 r) c; A$ A- v i++;7 n) D0 T* U! ^
} T& W4 o6 K' j% v* R( d
if (S2CON & S2TI)
) ^ B+ @) t8 e1 B+ } {8 V1 I) ^. s( q! o" ?
S2CON &= ~S2TI; //清除S2TI位
. n u, n3 P5 M& n) g; v9 d& W busy = 0; //清忙标志
: Q4 `- q0 }* G; Q2 }) I }: q5 ?$ O! Y0 x
}
* E+ D! W- `( o0 g2 c ~7 [" S$ X! b6 E0 K/ E6 r
/*----------------------------+ @. [0 V6 {- S
发送串口数据, K* i6 G) n! I5 A( ]$ T* ?8 z
----------------------------*/5 Q8 k4 n( U0 C7 Y, O' J" @
void SendData(BYTE dat)7 ]1 R4 \0 v( o2 ]
{, d( J: {" ?9 V B
while (busy); //等待前面的数据发送完成3 e' S* \& u( G l( L! A
ACC = dat; //获取校验位P (PSW.0)
( J) t: N% I* p- [ if (P) //根据P来设置校验位9 k. g+ x" ~1 r1 G: T$ f- e
{
/ F- p5 G* `- a #if (PARITYBIT == ODD_PARITY)
* w& v9 |2 Y4 f, C S2CON &= ~S2TB8; //设置校验位为0
% a4 X' w/ E5 u' D #elif (PARITYBIT == EVEN_PARITY)
4 K% D% I+ F0 Q2 z z# D: Z( w& j5 c6 d S2CON |= S2TB8; //设置校验位为1
3 j1 O1 m) {7 B/ t #endif' Z ?/ Y2 U" P, {/ t. K" ~3 Y2 a
}
1 r3 B$ }. b7 C else
8 R: |* J9 @. V) h {: q) V" f7 {/ c; X& b
#if (PARITYBIT == ODD_PARITY)6 o9 w7 @' F. s% P
S2CON |= S2TB8; //设置校验位为1; \% n1 p. ~" c, J0 K; m
#elif (PARITYBIT == EVEN_PARITY)1 s7 @+ o0 A/ d+ `* z% `4 f
S2CON &= ~S2TB8; //设置校验位为0 B- x7 c0 c2 k9 L
#endif
9 H; ~, B* j3 ?! S }
0 O1 X" y# F% u0 ~. b4 N* M* Y& |2 y* `* y busy = 1;
7 p( `' X. ]% J |7 |( j S2BUF = ACC; //写数据到UART2数据寄存器
9 m/ f4 f$ w( c A! K* v0 c}$ d B' } |" b7 ?9 n; i
2 e. o) ?8 W6 j* Q x# [
/*----------------------------
9 N2 R) ?% P8 x发送字符串1 y; f( o& M! a; G
----------------------------*/
w( _7 ^, @2 T1 o: u }void SendString(char *s)2 n- V0 K2 p( @6 P4 E
{0 o: g8 N' b( W1 t' A; i9 P
while (*s) //检测字符串结束标志
2 m0 W0 H) b% v6 \2 U6 D* s4 c2 { {' f; a7 B2 P1 i* w! [! C- ?( p ^
SendData(*s++); //发送当前字符
& p- {! R/ M& Z3 k4 A. Y) Y }
% P3 i$ H2 i8 L0 Q0 O3 ? }
7 T+ f9 y% [; H |
|