📄 serial.lst
字号:
C51 COMPILER V8.02 SERIAL 09/21/2006 20:16:31 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN serial.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE serial.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //波特率计算公式:
2 // TH1=256-(2^SMOD/32*Fosc/12*1/Bound)
3 // 其中:SMOD=0,1;Fosc=晶体或晶振频率;Bound=波特率
4 // 本例中,SMOD=0;Fosc=20*10E6;Bound=300,所以TH1=0x52。
5 //Baud rate(20Mhz)
6 //300(52);1200(D5);2400(EA);4800(F5);9600(FB);19200(FD);38400(FF);
7 //应用举例:(可在KEIL仿真环境下运行)
8 //源程序文件:serial.h/serial.c/main.c
9 //main.c内容:
10
11 #include <general.h>
12
13 sbit P10=P1^0;
14 unsigned char xdata TxBuf[LenTxBuf],RxBuf[LenRxBuf];//收发缓冲区实体
15 unsigned char xdata *inTxBuf,*outTxBuf, *inRxBuf,*outRxBuf;//收发缓冲区读写指针
16 //inRxBuf指向收的收,outRxBuf指向收缓冲区的读。
17
18 bit TIflag=1;//Note:It must be 1.
19 unsigned char xdata bRxFull; //标志收缓冲区是否溢出
20 unsigned char xdata bFullSend; //收缓冲区是否溢出是否已发送满命令
21 unsigned char xdata bEptSend; //收缓冲区空时是否已发空命令
22 void InitSerial()//串口初始化
23 {
24 1 TMOD=TMOD&0x0F;
25 1 TMOD=TMOD|0x20;
26 1 TL1=0xF7,TH1=0xF7;//19200 , 32MHz
27 1 SCON=0x50;PCON=0x80;
28 1 TR1=1;
29 1 }
30
31 void InitSerialBuffer(void)//串口缓冲区初始化
32 {
33 1 inTxBuf = TxBuf;
34 1 outTxBuf = TxBuf;
35 1 inRxBuf = RxBuf;
36 1 outRxBuf = RxBuf;
37 1 bRxFull = FALSE; //收缓冲区非满
38 1 bFullSend = FALSE;
39 1 bEptSend = TRUE;
40 1 EA=1;
41 1 ES=1;
42 1 }
43
44 /************************************************/
45 void serial(void) interrupt 4
46 {//串口中断服务子程序
47 1 unsigned char *t;
48 1
49 1 if(TI)
50 1 {
51 2 TI=0;
52 2 if(inTxBuf==outTxBuf)
53 2 {
54 3 TIflag=1;
55 3 }//TxBuf Empty
C51 COMPILER V8.02 SERIAL 09/21/2006 20:16:31 PAGE 2
56 2 else
57 2 {
58 3 SBUF=*outTxBuf; outTxBuf++;
59 3 if(outTxBuf==TxBuf+LenTxBuf)
60 3 outTxBuf=TxBuf;
61 3 }
62 2 }
63 1 if(RI)
64 1 {
65 2 //这里,缓冲区的读写方式跟8019as的ram区一样,是循环读,而且也用了
66 2 //两个指针,一个用来收,一个用来读
67 2 RI=0;
68 2 t=inRxBuf;
69 2 t++; //保留指针位置
70 2 if(t==RxBuf+LenRxBuf)
71 2 t=RxBuf; //如果到缓冲区末尾,则返回缓冲区头
72 2 if(t!=outRxBuf)
73 2 {
74 3 //如果相等,说明缓冲区满了,RxBuf Full
75 3 *inRxBuf=SBUF;
76 3 inRxBuf=t;
77 3 }
78 2 else
79 2 {
80 3 bEptSend = FALSE; //在满了之后,需等待发送空信号
81 3 bFullSend =FALSE;
82 3 bRxFull = TRUE; //收缓冲区满
83 3 }
84 2 }
85 1 }
86 //------------------------------------------------------------------------
87 //函数功能://从串口缓冲区读1字节数据,并对缓冲区状态进行检查。如果满了,则
88 // 发送缓冲区满信号,如果为空,则发送缓冲区为空信号。
89 //
90 //入参:发送区指针,TCP包的长度(包括头部)
91 //
92 //
93 //
94 //
95 //作者:
96 //
97 //注意:
98 //
99 //
100 //注释: Mingtree
101 //日期: 2004-11-10
102 //修改: 2005-12-01 为了实现接收串口的数据,对缓冲区溢出情况进行处理
103
104 //------------------------------------------------------------------------
105 bit Mygetch(unsigned char xdata *ch)
106 {
107 1 ES = 0;
108 1 //接收缓冲区满,则发送full信号
109 1 if(bRxFull && !bFullSend)
110 1 {
111 2 bFullSend = TRUE;
112 2 PrintStr("full");
113 2 }
114 1 if(inRxBuf == outRxBuf)
115 1 {
116 2 //为空
117 2 ES = 1;
C51 COMPILER V8.02 SERIAL 09/21/2006 20:16:31 PAGE 3
118 2 bRxFull = FALSE;
119 2 if(!bEptSend)
120 2 {
121 3 bEptSend = TRUE;
122 3 PrintStr("empty");
123 3 }
124 2 return 0;
125 2 } //RxBuf Empty
126 1 *ch=*outRxBuf;
127 1 outRxBuf++; //数据被读走,读指针加1
128 1 if(outRxBuf == RxBuf+LenRxBuf)
129 1 {
130 2 outRxBuf = RxBuf; //如果读指针到缓冲区尾部,则返回到头部
131 2 }
132 1 ES = 1;
133 1 return 1;
134 1 }
135
136 void PrintChar(unsigned char ch)//显示字符
137 {
138 1 unsigned char *t;
139 1
140 1 ES = 0;
141 1 if(TIflag)
142 1 {
143 2 TIflag = 0;
144 2 TI = 1;
145 2 }
146 1 t = inTxBuf;t++;
147 1 if(t == TxBuf+LenTxBuf) t = TxBuf;
148 1 if(t == outTxBuf)
149 1 {
150 2 ES = 1;
151 2 return;
152 2 }//TxBuf Full
153 1 *inTxBuf = ch;
154 1 inTxBuf = t;
155 1 ES=1;
156 1 }
157
158 void PrintCh(unsigned char ch)//内部使用,不建议用户看到。
159 {
160 1 if(ch>=0&&ch<=9) ch=ch+'0';
161 1 else if(ch>=10&&ch<=15) ch=ch+'A'-10;
162 1 PrintChar(ch);
163 1 }
164
165 void PrintByte(unsigned char Byte)//以十六进制格式显示1个字节数据
166 {
167 1 unsigned char c;
168 1 c=Byte;
169 1 c=c>>4;PrintCh(c);
170 1 c=Byte;c=c&0x0F;PrintCh(c);
171 1 }
172
173 void PrintWord(unsigned int Word)//以十六进制格式显示1个字数据
174 {
175 1 PrintByte(Word>>8);
176 1 PrintByte(Word&0xFF);
177 1 }
178
179 void PrintLong(unsigned long LongWord)//以十六进制格式显示1个长字数据
C51 COMPILER V8.02 SERIAL 09/21/2006 20:16:31 PAGE 4
180 {
181 1 PrintWord(LongWord>>16);
182 1 PrintWord(LongWord&0xFFFF);
183 1 }
184
185 void PrintStr(unsigned char *str)//显示字符串
186 {
187 1 int i;
188 1 unsigned char j;
189 1 unsigned char ch;
190 1 for(i=0;i<MaxLenStr;i++){
191 2 ch=*(str+i);
192 2 if(ch=='\0') break;
193 2 else if(ch=='\n'){PrintChar(10);PrintChar(13);}
194 2 else if(ch=='\t'){
195 3 for(j=0;j<TABNum;j++)
196 3 PrintChar(' ');
197 3 }
198 2 else PrintChar(ch);
199 2 }
200 1 }
201
202 void PrintRec(unsigned char xdata *str)//显示字符串
203 {
204 1 int i;
205 1 unsigned char ch;
206 1 for(i=0;i<MaxLenStr;i++){
207 2 ch=*(str+i);
208 2 if(ch=='\0') break;
209 2 else PrintChar(ch);
210 2 }
211 1 }
212 void Mystrlwr(unsigned char xdata *str)//将字符串全部转换成小写格式
213 {
214 1 int i;
215 1 unsigned char ch;
216 1 for(i=0;1;i++){
217 2 ch=*(str+i);
218 2 if(ch=='\0') break;
219 2 else if(ch>='A'&&ch<='Z') *(str+i)=ch-'A'+'a';
220 2 }
221 1 }
222
223 //------------------------------------------------------------------------
224 //函数功能:把收到的命令进行数字和字母的分离,之间用空格隔开
225 //
226 //入参: 接收命令缓冲区指针ComBuf,分离后缓冲区指针WordTable
227 //
228 //返回值: 分离成功1,失败0
229 //
230 //作者: Mingtree
231 //
232 //注释: Mingtree
233 //日期: 2004-09-29
234 //------------------------------------------------------------------------
235 bit GetWord(unsigned char xdata * ComBuf,WORDTABLE xdata * WordTable)
236 {
237 1 unsigned char i=0; /*ComBuf String pointer*/
238 1 unsigned char j;
239 1 //对命令包进行调整,去掉数据类型字段和有效数据长度字段
240 1 for(i = 0 ; i < CMDLEN ; i++)
241 1 ComBuf[i] = ComBuf[i+2];
C51 COMPILER V8.02 SERIAL 09/21/2006 20:16:31 PAGE 5
242 1 //找到空格的位置
243 1 i = 0;
244 1 while(i<MaxLenComBuf)
245 1 {
246 2 if(ComBuf[i]==32)
247 2 break;
248 2 i++;
249 2 }
250 1 if(i!=0)
251 1 {
252 2 //进行分离
253 2 //取得命令
254 2 for(j=0;j<i;j++)
255 2 WordTable->wt[0].Str[j]=ComBuf[j];
256 2 WordTable->wt[0].Length=i;
257 2 WordTable->wt[0].Str[j]='\0';
258 2 //取得数字
259 2 j++;
260 2 for(i=0;i<MaxCmd-WordTable->wt[0].Length;i++)
261 2 {
262 3 WordTable->wt[1].Str[i]=ComBuf[j];
263 3 j++;
264 3 }
265 2 WordTable->wt[1].Length=i;
266 2 WordTable->wt[1].Str[i]='\0';
267 2 return 1;
268 2 }
269 1 else
270 1 return 0;
271 1
272 1 }
273
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1091 ----
CONSTANT SIZE = 11 ----
XDATA SIZE = 763 ----
PDATA SIZE = ---- ----
DATA SIZE = 11 24
IDATA SIZE = ---- ----
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 + -