📄 serial.lst
字号:
C51 COMPILER V6.23a SERIAL 04/15/2002 18:18:04 PAGE 1
C51 COMPILER V6.23a, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN Serial.OBJ
COMPILER INVOKED BY: C:\keil\C51\BIN\c51.exe Serial.c DB OE
stmt level source
1 //串口中断服务程序,仅需做简单调用即可完成串口输入输出的处理
2 //出入均设有缓冲区,大小可任意设置。
3 //*************************************************************************
4 #include "TestSerial.h"
5
6 #define BAUDRATE0 115200 // 用户定义的UART0 波特率
7
8 #define DB_SENDMAXSIZE 0xf0
9 #define DB_RECMAXSIZE 0xf0
10
11 bit CommRecDataOverflowFlag,FlagRecComm,SendItComm;
12 extern unsigned char Count1ms;
13 unsigned char CommSendBufferHead, CommSendBufferTail;
14 unsigned char xdata CommSendBuffer[DB_SENDMAXSIZE];
15 unsigned char CommRecBufferHead, CommRecBufferTail;
16 unsigned char xdata CommRecBuffer[DB_RECMAXSIZE];
17 unsigned char RecDataLen=3;
18
19 void ClearCommRecBuffer(void)
20 {
21 1 CommRecBufferHead=CommRecBufferTail=0;
22 1 FlagRecComm=0;
23 1 }
24
25 void OpenComm(void)
26 {
27 1 PCON |= 0x80; // SMOD=1 (HW_UART uses Timer 1 overflow with no divide down).
28 1 TMOD = 0x20; // Configure Timer 1 for use by UART0
29 1 CKCON |= 0x10; // Timer 1 derived from SYSCLK
30 1
31 1 RCAP2H=(65536-(SYSCLK/BAUDRATE0/32))/256;
32 1 RCAP2L=(65536-(SYSCLK/BAUDRATE0/32))%256;
33 1 TH2=RCAP2H;TL2=RCAP2L;
34 1 CT2=0; //T2:timer mode
35 1 TR2=1;
36 1 TCLK=1;RCLK=1; //说明:52,对于SIO0,可选择T1(TCLK=0,RCLK=0)或T2(TCLK=1,RCLK=1)作为波特率发生器
37 1 // SIO1只能用T1作为波特率发生器
38 1 //baud=OSC/(32*(65536-[RCAP2H,RCAP2L])
39 1 CommSendBufferHead=CommSendBufferTail=0; // set the head and tail to the base of the ring buffer
40 1 CommRecBufferHead=CommRecBufferTail=0;
41 1 FlagRecComm=0;
42 1 RI0=0; // Clear HW_UART receive and transmit
43 1 TI0=0; // complete indicators.
44 1 SCON0 = 0x50; // Configure UART0 for mode 1, receiver enabled.
45 1 ES0=1; // allow the serial interrupt
46 1 SendItComm=1;
47 1 }
48 void SendCommChar(char ch)
49 {
50 1 CommSendBuffer[CommSendBufferTail]=ch;
51 1 CommSendBufferTail++;
52 1 if (CommSendBufferTail==DB_SENDMAXSIZE)
53 1 {
54 2 CommSendBufferTail=0;
55 2 }
C51 COMPILER V6.23a SERIAL 04/15/2002 18:18:04 PAGE 2
56 1 if (SendItComm)
57 1 {
58 2 TB80=1;SBUF0=CommSendBuffer[CommSendBufferHead];
59 2 }
60 1 return ;
61 1 }
62
63 void SendCommString(unsigned char *base)
64 {
65 1 unsigned char i=0;
66 1 if (base[0]==0) return;
67 1 for (;;)
68 1 {
69 2 if (base[i]==0) break;
70 2 CommSendBuffer[CommSendBufferTail]=base[i];
71 2 CommSendBufferTail++;
72 2 if (CommSendBufferTail==DB_SENDMAXSIZE)
73 2 {
74 3 CommSendBufferTail=0;
75 3 }
76 2 i++;
77 2 }
78 1 if (SendItComm)
79 1 {
80 2 SBUF0=CommSendBuffer[CommSendBufferHead];
81 2 }
82 1 }
83
84 void SendCommBuffer(unsigned char *base, unsigned char size)
85 {
86 1 unsigned char i=0;
87 1 if (!size) { return; }
88 1 while (i<size)
89 1 {
90 2 CommSendBuffer[CommSendBufferTail]=base[i];
91 2 i++;
92 2 CommSendBufferTail++;
93 2 if (CommSendBufferTail==DB_SENDMAXSIZE)
94 2 {
95 3 CommSendBufferTail=0;
96 3 }
97 2 }
98 1 if (SendItComm)
99 1 {
100 2 SBUF0=CommSendBuffer[CommSendBufferHead];
101 2 }
102 1 }
103
104 void CommISR(void) interrupt 4
105 {
106 1 if (_testbit_(TI0))
107 1 {
108 2 TI0=0;
109 2 CommSendBufferHead++;
110 2 if (CommSendBufferHead==DB_SENDMAXSIZE)
111 2 {
112 3 CommSendBufferHead=0;
113 3 }
114 2 if (CommSendBufferHead!=CommSendBufferTail)
115 2 {
116 3 SBUF0=CommSendBuffer[CommSendBufferHead]; // send the next byte
117 3 SendItComm=0;
C51 COMPILER V6.23a SERIAL 04/15/2002 18:18:04 PAGE 3
118 3 }
119 2 else
120 2 {
121 3 SendItComm=1;
122 3 }
123 2 }
124 1 if (_testbit_(RI0))
125 1 {
126 2 RI0=0;
127 2 if (CommRecBufferTail==CommRecBufferHead)
128 2 {
129 3 CommRecDataOverflowFlag=1; //接收缓冲区溢出
130 3 }
131 2 CommRecBuffer[CommRecBufferTail]=SBUF0; //receive data
132 2 CommRecBufferTail++;
133 2 if (CommRecBufferTail==DB_RECMAXSIZE)
134 2 {
135 3 CommRecBufferTail=0;
136 3 }
137 2 FlagRecComm=1;
138 2 }
139 1 }
140
141 //从接收缓冲区读数据 ,无数据返回0,有数据返回1
142 bit GetCommChar(unsigned char idata *ch)
143 {
144 1 if (CommRecBufferTail==CommRecBufferHead) return 0;
145 1 *ch=CommRecBuffer[CommRecBufferHead];
146 1 CommRecBufferHead++;
147 1 if (CommRecBufferHead==DB_RECMAXSIZE)
148 1 {
149 2 CommRecBufferHead=0;
150 2 }
151 1 if (CommRecBufferTail==CommRecBufferHead) FlagRecComm=0;
152 1 return 1;
153 1 }
154
155 //在T(0-255)毫秒内从接收缓冲区读数据 ,无数据返回0,有数据返回1
156 bit GetCommCharWait(unsigned char idata *ch,unsigned char T) //T ms
157 {
158 1 Count1ms=T;*ch=0;
159 1 while (Count1ms)
160 1 {
161 2 if (CommRecBufferTail!=CommRecBufferHead) break;
162 2 }
163 1 if (Count1ms==0) return 0;
164 1 *ch=CommRecBuffer[CommRecBufferHead];
165 1 CommRecBufferHead++;
166 1 if (CommRecBufferHead==DB_RECMAXSIZE)
167 1 {
168 2 CommRecBufferHead=0;
169 2 }
170 1 return 1;
171 1 }
172
173
174
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 440 ----
CONSTANT SIZE = ---- ----
C51 COMPILER V6.23a SERIAL 04/15/2002 18:18:04 PAGE 4
XDATA SIZE = 480 ----
PDATA SIZE = ---- ----
DATA SIZE = 5 6
IDATA SIZE = ---- ----
BIT SIZE = 3 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -