📄 uart0.lst
字号:
C51 COMPILER V7.05 UART0 08/18/2007 20:00:10 PAGE 1
C51 COMPILER V7.05, COMPILATION OF MODULE UART0
OBJECT MODULE PLACED IN uart0.OBJ
COMPILER INVOKED BY: C:\SiLabs\MCU\IDEfiles\C51\BIN\C51.exe uart0.c DB OE
stmt level source
*** WARNING C500 IN LINE 1 OF UART0.C: MISSING DEVICE (SECURITY KEY NOT FOUND)
1
2 //----------------------------------------------------------------
3 // C8051F020实验核心模块测试程序
4 // uart0通信实验
5 //
6 // 实现功能:通过交叉开关,将UART0配置到P00,P01引脚上,实现:
7 // 1.通过计算机向模块发送命令控制底板上的LED灯
8 // 2.串口通信协议是基于字符的,可使用超级终端进行调试。支持BACKSPACE
9 // 键,但是不支持其它功能键和方向键。
10 //
11 // 实验条件:
12 // 1.底板上JP1的1,2,4,6设置为ON状态
13 //
14 //
15 // 说明:
16 // 本模块中配套的测试程序都是以消息驱动的.
17 //---------------------------------------------------------------
18 // 修改记录
19 // 版本 时间 人员 内容
20 // 1.0 2007/4/30 scj 建立文件,实现基本功能
21 // 1.1 2007/6/4 scj 根据V122底板修改
22 //
23 //---------------------------------------------------------------
24 // 串口命令:
25 // 1.setled=2,on: 点亮LED2
26 // 2.setled=2,off:关闭LED2
27 //---------------------------------------------------------------
28
29 #include "F020.h"
30 #include <string.h>
31 #include <ctype.h>
32
33
34 //--------------------------------------------
35 // 数据类型定义
36 //--------------------------------------------
37
38 // 基本数据类型
39 typedef unsigned char BYTE; // 8位无符号数
40 typedef unsigned int WORD; // 16位无符号数
41 typedef unsigned long DWORD; // 32位无符号数
42
43 // 结构体
44 typedef struct
45 {
46 BYTE base; // DIDA次数
47 BYTE second; // 秒
48 BYTE minute; // 分
49
50 }S_TIME;
51
52
53 //--------------------------------------------
54 // 引脚定义
C51 COMPILER V7.05 UART0 08/18/2007 20:00:10 PAGE 2
55 //--------------------------------------------
56 #define P_LED2 P31
57
58
59 //--------------------------------------------
60 // 宏定义
61 //--------------------------------------------
62
63 // 系统消息定义
64 #define SECD_SIGNAL 0x01
65 #define MINU_SIGNAL 0x02
66 #define UART0RECV_SIGNAL 0x04
67
68
69 // 常量定义
70
71 //定时器0定时,使用SYSCLK/12作为时钟源
72 //定时计算方法,TH0:TL0= 65536-t*SYSCLK/12
73 //定时25ms,TH0:TL0=0x4C 00
74 #define TMR0H 0x4C
75 #define TMR0L 0x00
76
77 #define TICKS_PER_SEC 40
78
79 #define RECVBUF_LEN 20
80
81 //--------------------------------------------
82 // 函数声明
83 //--------------------------------------------
84 void CommandProc(char *pRecvString);
85 void SendString(char *pSendString);
86
87 //--------------------------------------------
88 // 全局变量定义
89 // 全局变量以g_开头
90 // 位变量: g_b
91 // 无符号字节变量: g_c
92 // 无符号双字节变量: g_w
93 // 无符号4字节变量: g_dw
94 // 有符号数在类型前加s,比如char型位g_sc
95 // 结构体为g_s后为大写
96 //--------------------------------------------
97 data BYTE g_cMainSignal; // 主消息变量
98
99 data S_TIME g_sTime; // 主时钟
100
101 data BYTE g_cRecvPointer; // 接收指针
102 data BYTE g_cRecvLength; // 接收数据长度
103 idata BYTE g_cRecvBuffer[RECVBUF_LEN]; // 接收缓冲区
104
105 //-----------------------------------------------
106 // 初始化函数
107 //
108 //-----------------------------------------------
109 void Timer_Init()
110 {
111 1
112 1 PCON = 0;
113 1
114 1 //.......................................
115 1 // 设置定时器的时钟信号
116 1 // - T4M T2M T1M T0M - - -
C51 COMPILER V7.05 UART0 08/18/2007 20:00:10 PAGE 3
117 1 // 0 1 0 1 0 0 0 0
118 1 // 1:使用SYSCLK;0:使用SYSCLK/12
119 1 // 定时器0,1,2,4均使用SYSCLK
120 1 //.......................................
121 1 CKCON = 0x70;
122 1
123 1
124 1 //......................................
125 1 // 定时0工作在16位定时器模式
126 1 // 定时器1工作在8位重载模式
127 1 //......................................
128 1
129 1 TMOD = 0x21;
130 1
131 1 //....................................
132 1 // T0作为系统节拍时钟
133 1 // 定时计算方法= 65536-t*SYSCLK
134 1 //.....................................
135 1 TH0 = TMR0H;
136 1 TL0 = TMR0L;
137 1
138 1 //.......................................
139 1 // T1作为串口0时钟
140 1 // 串口0波特率=SYSCLK/32*(256-TMR1LOAD)
141 1 // T1波特率=9600
142 1 //.......................................
143 1
144 1 TH1 = 0xB8;
145 1 TL1 = 0xB8;
146 1
147 1 TCON = 0x00;
148 1
149 1
150 1 //..................................................
151 1 // T2 and T3 not used
152 1 //..................................................
153 1 RCAP2H = 0x00; // Timer 2 Capture Register High Byte
154 1 RCAP2L = 0x00; // Timer 2 Capture Register Low Byte
155 1 TH2 = 0x00; // Timer 2 High Byte
156 1 TL2 = 0x00; // Timer 2 Low Byte
157 1 T2CON = 0x00; // Timer 2 Control Register
158 1
159 1 TMR3RLL = 0x00; // Timer 3 Reload Register Low Byte
160 1 TMR3RLH = 0x00; // Timer 3 Reload Register High Byte
161 1 TMR3H = 0x00; // Timer 3 High Byte
162 1 TMR3L = 0x00; // Timer 3 Low Byte
163 1 TMR3CN = 0x00; // Timer 3 Control Register
164 1
165 1 //.....................................................
166 1 // T4 作为串口1波特率发生器
167 1 // T4波特率=SYSCLK/32*(65536-RCAP4H:RCAP4L)
168 1 // T4波特率=9600
169 1 //.....................................................
170 1 RCAP4H = 0xFF; // Timer 4 Capture Register High Byte
171 1 RCAP4L = 0xDC; // Timer 4 Capture Register Low Byte
172 1 TH4 = 0xFF; // Timer 4 High Byte
173 1 TL4 = 0xDC; // Timer 4 Low Byte
174 1 T4CON = 0x30; // Timer 4 Control Register
175 1
176 1
177 1 }
178
C51 COMPILER V7.05 UART0 08/18/2007 20:00:10 PAGE 4
179 //...........................................................
180 // 功能:UART0初始化
181 // 输入参数:无
182 // 输出参数:无
183 // 注意:1.应该首先使用交叉开关为UART0分配相应的引脚
184 // 2.初始化定时器1作为波特率发生器
185 //..........................................................
186 void UART0_Init()
187 {
188 1
189 1 SCON0 = 0x50; // 8位波特率异步通信模式
190 1
191 1 REN0 = 1; // 使能UART0接收
192 1 TR1 = 1; // 启动定时器1
193 1 }
194
195 //......................................................
196 // 功能:配置交叉开关和端口方向
197 // 输入参数:无
198 // 输出参数:无
199 // 注意:该函数使能交叉开关
200 // TX0,RX0被分配到P00,P01
201 //.....................................................
202
203 void Port_IO_Init()
204 {
205 1 // P0.0 - TX0 (UART0), Open-Drain, Digital
206 1 // P0.1 - RX0 (UART0), Open-Drain, Digital
207 1 // P0.2 - SCK (SPI0), Open-Drain, Digital
208 1 // P0.3 - MISO (SPI0), Open-Drain, Digital
209 1 // P0.4 - MOSI (SPI0), Open-Drain, Digital
210 1 // P0.5 - NSS (SPI0), Open-Drain, Digital
211 1 // P0.6 - SDA (SMBus), Open-Drain, Digital
212 1 // P0.7 - SCL (SMBus), Open-Drain, Digital
213 1
214 1 // P1.0 - Skipped, Open-Drain, Analog
215 1 // P1.1 - Skipped, Open-Drain, Analog
216 1 // P1.2 - Skipped, Open-Drain, Analog
217 1 // P1.3 - Skipped, Open-Drain, Analog
218 1 // P1.4 - Skipped, Open-Drain, Analog
219 1 // P1.5 - Skipped, Open-Drain, Analog
220 1 // P1.6 - Skipped, Open-Drain, Analog
221 1 // P1.7 - Skipped, Open-Drain, Analog
222 1
223 1 // P2.0 - TX1 (UART1), Open-Drain, Digital
224 1 // P2.1 - RX1 (UART1), Open-Drain, Digital
225 1 // P2.2 - INT0 (Tmr0), Open-Drain, Digital
226 1 // P2.3 - INT1 (Tmr1), Open-Drain, Digital
227 1 // P2.4 - Unassigned, Open-Drain, Digital
228 1 // P2.5 - Unassigned, Open-Drain, Digital
229 1 // P2.6 - Unassigned, Open-Drain, Digital
230 1 // P2.7 - Unassigned, Open-Drain, Digital
231 1
232 1 // P3.0 - Unassigned, Open-Drain, Digital
233 1 // P3.1 - Unassigned, Push-Pull, Digital
234 1 // P3.2 - Unassigned, Open-Drain, Digital
235 1 // P3.3 - Unassigned, Open-Drain, Digital
236 1 // P3.4 - Unassigned, Open-Drain, Digital
237 1 // P3.5 - Unassigned, Open-Drain, Digital
238 1 // P3.6 - Unassigned, Open-Drain, Digital
239 1 // P3.7 - Unassigned, Open-Drain, Digital
240 1
C51 COMPILER V7.05 UART0 08/18/2007 20:00:10 PAGE 5
241 1 P1MDIN = 0x00;
242 1 P3MDOUT = 0x02;
243 1 XBR0 = 0x07;
244 1 XBR1 = 0x14;
245 1 XBR2 = 0x44;
246 1
247 1
248 1
249 1 }
250
251 void Oscillator_Init()
252 {
253 1 int i = 0;
254 1 OSCXCN = 0x67;
255 1 for (i = 0; i < 3000; i++); // Wait 1ms for initialization
256 1 while ((OSCXCN & 0x80) == 0);
257 1 OSCICN = 0x08;
258 1 }
259
260 void Interrupts_Init()
261 {
262 1 //..................................
263 1 // 初始化中断
264 1 // EA IEGF0 ET2 ES0 ET1 EX1 ET0 EX0
265 1 //..................................
266 1 IE = 0;
267 1
268 1 ET0 = 1; // 打开定时器0中断
269 1
270 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -