1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
#include<reg51.h>
/* 串口2只能选定时器2作为波特率发生器 */
//注意串口2:RXD2~P1^0,TXD2~P1^1
//根据芯片手册说明,在单片机1T模式下(不12分频)串口在模式0(8位USART)波特率 = Sysclk/(65536-[T2H,T2L])/4
//这个宏定义就是根据波特率来就算定时器应该设定的初值
#define Baud_Rate(baud) (65536 - 11059200/4/baud)
//定义寄存器
sfr AUXR = 0x8e; //辅助寄存器
sfr T2H = 0xD6; //定时器2的高八位寄存器
sfr T2L = 0xD7; //定时器2的低八位寄存器
sfr S2CON = 0x9a; //USART2控制寄存器
sfr S2BUF = 0x9b; //USART2数据寄存器
void usart2_Init(unsigned int baud){
/*
S2CON:(只介绍和这里相关的)
最高位:模式选择位,0为模式0(默认),1为模式1
第五位:允许串行口接受位
最低位(S2RI):接收中断请求标志位
第二位(S2TI):发送中断请求标志位
*/
S2CON=0x10;
T2L = (unsigned char)(Baud_Rate(baud));
T2H = (unsigned char)(Baud_Rate(baud)>>8);
//开启定时器2 AUXR第五位是定时器2的开启位,第三位就是选择(当为1时)1T模式/12T模式
//这里选择的是1T模式(不12分频),如果要用12T模式,模特率就要在后面的式子再除以12
AUXR |= 0x14;
}
void main(){
//定义变量
unsigned char dat;
//初始化
usart2_Init(9600);
while(1){
//S2CON最低位是接收标志位
if(S2CON&0x01){
S2CON&=0xfe; //清除接收标志位
dat = S2BUF;
S2BUF = dat;
while((S2CON&0x02)==0); //等待发送完毕
S2CON&=0xfd; //清除发送标志位
}
}
}
|