📄 uart.lst
字号:
C51 COMPILER V8.02 UART 01/14/2009 17:21:16 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE UART
OBJECT MODULE PLACED IN uart.OBJ
COMPILER INVOKED BY: d:\install\software\program\Keil\C51\BIN\C51.EXE uart.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2 #include <intrins.h>
3 #include <REGX52.h>
4 #include "uart.h"
5
6
7 static unsigned char idata uartbuf;
8 static unsigned char idata bufwptr, bufrptr;
9 unsigned char idata uartbuff[UARTBUFFLEN];
10
11 /* 波特率设置表(22.1184MHZ), 4800, 9600, 19200, 38400, 57600, 115200 */
12 //static unsigned char code BAUD[] = {0x70, 0xB8, 0xDC, 0xEE, 0xF4, 0xFA};
13 /* 波特率设置表(11.0592MHZ), 4800, 9600, 19200, 38400, 57600, 115200 */
14 static unsigned char code BAUD[] = {0xB8, 0xDC, 0xEE, 0xF7, 0xFA, 0xFD};
15
16 /*
17 * 初始化串口, 波特率57600
18 */
19 void UartInit(unsigned char baudrate)
20 {
21 1 ES = 0;
22 1 TR2 = 0;
23 1
24 1 bufwptr = 0; // 写指针
25 1 bufrptr = 0; // 读指针
26 1
27 1 PCON = 0x00; // 设置串口波特率, 时钟频率30MHZ
28 1 T2CON = 0x30; // 定时器2作为波特率发生器
29 1 SCON = 0x50; // 模式1
30 1 // n = 65536 - [fosc/baud*32]
31 1 // n = 65536 - 22118400/(57600*32) = 65536 - 12 = 65524 = 0xfff4
32 1 RCAP2H = 0xff;
33 1 RCAP2L = BAUD[baudrate]; // baud rate 57600
34 1 TH2 = 0xff;
35 1 TL2 = BAUD[baudrate];
36 1
37 1 IP = 0x10; // 串口中断优先级高
38 1 REN = 1;
39 1 TI = 0;
40 1 RI = 0;
41 1 TR2 = 1; // 启动定时器2
42 1 ES = 1; // 使能串口中断
43 1 }
44
45
46 void SendASC(unsigned char ASC)
47 {
48 1 bit es;
49 1 es=ES;
50 1 ES=0;//关闭中断
51 1 TI=0;
52 1 SBUF=ASC;
53 1 while(!TI);
54 1 TI=0;
55 1 ES=es;
C51 COMPILER V8.02 UART 01/14/2009 17:21:16 PAGE 2
56 1 }
57
58
59
60 /*
61 * 发送一个字节数据
62 */
63 void SendChar(unsigned char ch)
64 {
65 1 SBUF = ch;
66 1 while(TI == 0);
67 1 TI = 0;
68 1 }
69
70 /*
71 * 发送字符串
72 */
73 void SendString(char *str)
74 {
75 1 while(*str)
76 1 {
77 2 SendChar(*str);
78 2 str++;
79 2 }
80 1 }
81
82 /*
83 * 判断是否接收到数据,如果没有返回0,如果有,返回数据长度
84 */
85 unsigned char IsUartReceived(void)
86 {
87 1 unsigned char num;
88 1
89 1 EA = 0; // 关中断
90 1 if(bufwptr == bufrptr)
91 1 num = 0;
92 1 else if(bufwptr > bufrptr)
93 1 num = (bufwptr-bufrptr);
94 1 else // if(bufwptr < bufrptr)
95 1 num = (UARTBUFFLEN-bufwptr+bufrptr);
96 1 EA = 1;
97 1 return num;
98 1 }
99
100 /*
101 * 从缓冲区中读一个字节数据
102 * 返回剩下的字节数
103 */
104 unsigned char ReadChar(unsigned char idata *buf)
105 {
106 1 unsigned char ch, num;
107 1
108 1 EA = 0;
109 1 if(bufwptr == bufrptr)
110 1 {
111 2 *buf = 0;
112 2 num = 0;
113 2 }
114 1 else if(bufwptr > bufrptr)
115 1 {
116 2 ch = uartbuff[bufrptr];
117 2 *buf = ch;
C51 COMPILER V8.02 UART 01/14/2009 17:21:16 PAGE 3
118 2 bufrptr++;
119 2 num = (bufwptr-bufrptr);
120 2 }
121 1 else // if(bufwptr < bufrptr)
122 1 {
123 2 ch = uartbuff[bufrptr];
124 2 *buf = ch;
125 2 bufrptr++;
126 2 if(bufrptr == UARTBUFFLEN)
127 2 bufrptr = 0;
128 2 num = (UARTBUFFLEN-bufrptr+bufwptr);
129 2 }
130 1
131 1 EA = 1;
132 1 return num;
133 1 }
134
135
136 /*
137 * 串口中断接受
138 */
139 void UartInt(void) interrupt 4 using 1
140 {
141 1 if(RI)
142 1 {
143 2 ES = 0;
144 2 uartbuf = SBUF;
145 2 RI = 0; // 清中断标志
146 2
147 2 uartbuff[bufwptr] = uartbuf; // 数据写入缓冲区
148 2 if(bufwptr >= UARTBUFFLEN-1) // 循环缓冲指针
149 2 bufwptr = 0;
150 2 else
151 2 bufwptr++;
152 2 if(bufwptr == bufrptr) // 未读数据被覆盖,读指针更新到写指针的上一个单元
153 2 bufrptr = bufwptr + 1;
154 2
155 2 ES = 1;
156 2 }
157 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 266 ----
CONSTANT SIZE = 6 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = 35 ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -