|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#include "reg51.h"# L. `) V2 O) W3 t8 s! E
#include "intrins.h": M% h5 P P9 }
$ D* U, o" r. Y- L3 }, W
typedef unsigned char BYTE;
S5 D; H2 w, h% v2 m9 P/ b4 a9 t typedef unsigned int WORD;7 f: G, J4 h6 I/ n9 b
! h& v* a2 A9 k0 d #define FOSC 11059200L //系统频率
/ J+ c4 ?$ s5 @+ ? e4 z4 p+ m' S#define BAUD 9600 //串口波特率
8 y$ F7 q/ S( S8 @ R% N/ p
/ r3 O! N6 k6 q) e# |: U# \#define NONE_PARITY 0 //无校验1 h, e) _0 p5 d
#define ODD_PARITY 1 //奇校验6 ^4 [; o2 \; J/ ]
#define EVEN_PARITY 2 //偶校验
U6 l" b, u; U* N; E$ P#define MARK_PARITY 3 //标记校验) w! ~0 ?" F9 T( i: @$ ~# ` F
#define SPACE_PARITY 4 //空白校验
( o+ Y5 d' c' e5 c4 ^ A. A
) @) Y- r. w" t; i#define PARITYBIT EVEN_PARITY //定义校验位
4 Q7 \0 }1 P, b/ i r0 Q5 e# L3 ~; q N5 N$ J* Z+ N) _
sfr AUXR = 0x8e; //辅助寄存器* G+ ?! ` A$ A+ `
sfr S2CON = 0x9a; //UART2 控制寄存器8 H/ y! w* V3 ~6 N' R7 P
sfr S2BUF = 0x9b; //UART2 数据寄存器
8 o N8 }+ a/ v. E/ Osfr T2H = 0xd6; //定时器2高8位
4 m9 q. _2 E( L+ s& _sfr T2L = 0xd7; //定时器2低8位/ f5 t5 K2 y. O- k
sfr IE2 = 0xaf; //中断控制寄存器2
+ d, U! E8 L7 ~9 v3 y5 ^0 |( D0 m$ T2 ~% E0 T+ I
#define S2RI 0x01 //S2CON.0 w* K6 Y, \' a( @
#define S2ti 0x02 //S2CON.1
* ^* C; S! {5 V+ a) r #define S2RB8 0x04 //S2CON.2) u, H j3 W q. Q4 `$ q
#define S2TB8 0x08 //S2CON.3
9 q3 k t7 K% n5 [1 [: c5 Y. }" Y8 a3 e7 n! W; R R
sfr P_SW2 = 0xBA; //外设功能切换寄存器2
; ^' k! i1 @, j+ y5 z #define S2_S0 0x01 //P_SW2.0' l P" l) L. m6 x
. J# s( p J: q bit busy;
O6 t# W( C# Q" c3 R! \0 o+ b& S! S BYTE BUFFER[10];
" C. D* f2 A) p( n) A/ X0 A+ x int i;
: d: V. @* k$ t) R+ o4 e' }2 o void SendData(BYTE dat);
8 v1 p! Z( {% j( s$ c void SendString(char *s);* k$ m+ p( H0 x! t% o0 o0 q
" z/ E3 p7 D% Q3 T
void main()
# V0 _& Q# z, X2 {. r/ ^# \. i {. g; A' p- }& O* z/ k! l
P_SW2 &= ~S2_S0; //S2_S0=0 (P1.0/RxD2, P1.1/TxD2)2 r1 N& Y. S1 w& |
// P_SW2 |= S2_S0; //S2_S0=1 (P4.6/RxD2_2, P4.7/TxD2_2)
# Y* z+ q5 G- _0 A( q3 f P7 {/ I: X( w% B* J( y
#IF (PARITYBIT == NONE_PARITY)
z0 W7 c! D+ m( p! A S2CON = 0x50; //8位可变波特率
# l- w7 I. P8 L#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
' j. ~- J3 g [ U9 H5 K3 J0 j3 { S2CON = 0xda; //9位可变波特率,校验位初始为1% I5 [3 h: A( F1 V$ n
#elif (PARITYBIT == SPACE_PARITY)
( [( u4 w. w+ y0 v S2CON = 0xd2; //9位可变波特率,校验位初始为0
3 T" s) R" X5 j8 w& o #endif
: t0 i* \% P1 c4 O
7 [/ H7 z+ `. I2 M, V T2L = (65536 - (FOSC/4/BAUD)); //设置波特率重装值& z0 Z! |1 t5 t- v; I" y
T2H = (65536 - (FOSC/4/BAUD))>>8;
I* u2 `6 P' u3 ]- \3 L AUXR = 0x14; //T2为1T模式, 并启动定时器2: w& R7 w# W% p( N: i
IE2 = 0x01; //使能串口2中断
) `0 ~* r: U3 Z7 e EA = 1;
+ Q$ O0 v1 t' Y& Y& e
& `& ^7 L; b- k( }* E //SendString("stc15F2K60S2\r\nUart2 Test !\r\n");, C, W2 X7 I; Y C: M
while(1);2 h2 O$ K2 \- w; S8 d8 I
}
# W/ U( C8 U ?1 C5 J. p; Z# f
3 \! \' I7 z9 O) S1 L: z/ X0 y /*----------------------------. F/ M% d& {1 Y6 e
UART2 中断服务程序3 p$ y( f) k0 |0 M5 J( J. _( ~
-----------------------------*/
' E2 Q% n. b" r0 q/ Q- \void Uart2() interrupt 8 using 1& y1 }# K, |$ u: w; Z
{/ p$ W; O+ q# A$ q' S
if (S2CON & S2RI)
+ a7 E, K0 C( q2 r5 c7 I* o {7 B( ?! i5 G. L
S2CON &= ~S2RI; //清除S2RI位% I+ S' y0 h* N
BUFFER = S2BUF;
& r. b8 R8 n% y, O; t, ?2 g i++;
: R: v7 G. v/ A r# g }2 {+ S' J- O! p x) _+ H: C q, g
if (S2CON & S2TI)) z! T1 H: x* X& f0 w% P# M
{
0 m& I( U( r) v2 \" @; [' D9 f S2CON &= ~S2TI; //清除S2TI位
( I1 S7 I3 ]2 ~& c% ^- P- G8 O: N& U busy = 0; //清忙标志/ M) F0 u) F. D+ E
}
# ?& [' G. Q7 N" h! Z }
# n( y6 u) L+ Z" S. z9 W- l; h2 x3 g* {" b
/*----------------------------7 R! j' o2 o* B7 E/ X* U: {
发送串口数据
7 _, B# M4 k0 ^+ ^6 T0 [; g----------------------------*/
, |6 S6 M O: t, R) Y6 _void SendData(BYTE dat)7 T1 C- }" A5 Y1 {0 n. @1 Q; U
{
6 [% g8 j/ {+ f7 ]9 k2 ^2 o while (busy); //等待前面的数据发送完成$ e K; B* z4 x$ c0 u
ACC = dat; //获取校验位P (PSW.0)3 I7 x$ M* w* d2 f
if (P) //根据P来设置校验位4 L$ z4 J1 X) M
{
) e& F/ o# [4 K6 j, p; G #if (PARITYBIT == ODD_PARITY)' C4 v& U. G: j
S2CON &= ~S2TB8; //设置校验位为0
7 p+ Y& L5 \3 u6 k #elif (PARITYBIT == EVEN_PARITY)
( h: G0 X8 ?' `6 B* w/ K3 g( b S2CON |= S2TB8; //设置校验位为13 B) J. m f* D, c
#endif
- |% U( d" B3 i6 M$ T4 } }* t( d9 U5 Q% n( N9 e" a
else
$ Q7 p8 z! Z% m {
+ G% T: I6 F% r* D7 p! _. C #if (PARITYBIT == ODD_PARITY)
1 O* a4 g. [3 \0 G" n$ ^4 O: | S2CON |= S2TB8; //设置校验位为1
$ [/ O/ F) l; Z+ b% @9 z& c+ ^ #elif (PARITYBIT == EVEN_PARITY)
- d0 m( H% q) E7 I S2CON &= ~S2TB8; //设置校验位为0( E" V/ ?! `) c
#endif, k$ E: ~3 T3 `( k( Z
}
4 F5 g( r) M' q" G# T/ Z busy = 1;3 I4 z- }: z8 w! T1 s8 z' v+ i
S2BUF = ACC; //写数据到UART2数据寄存器; ?+ G& b4 G3 T$ n' M3 n* `/ W
}
9 l8 v5 z8 S; ^
# H- T# X6 \/ c# G /*----------------------------8 l% T9 o/ R7 s2 W+ E
发送字符串5 f; x) M! O$ w% ^1 B
----------------------------*/0 q& s: ]8 \8 g# u
void SendString(char *s); A" T) f: E- A8 ?) [
{
4 K: d: U5 [2 w& e. @ while (*s) //检测字符串结束标志
, ^8 ^$ e; \: [6 ^ {5 g7 i8 R- i% d ?; o$ b
SendData(*s++); //发送当前字符
+ F; N1 K( \' y( r+ D% t ] }' Y3 [: e4 s$ y4 K
}
" ]0 U- F g+ P6 ], x |
|