📄 soft_rs232.lst
字号:
223 {
224 1 TCON_ENABLE_TIMER = 0; //停止定时器
225 1 rs_f_TI_enable = 1; //允许发送
226 1 rs_f_RI_enable = 0; //禁止接收
227 1
228 1 rs_shift_count = 0; //清移位计数器
229 1 rs_f_TI = 1; //发送一个字符完毕标志
230 1 TCON_ENABLE_TIMER = 1; //启动定时器
231 1 }
232
233 void soft_rs232_interrupt( void )
234 {
235 1 /************************ 接收 ****************************/
236 1 if (rs_f_RI_enable == 1)
237 1 {
238 2 if (rs_shift_count == 0) //移位计数器==0, 表示检测到起始位的起点
239 2 {
240 3 if ( rs_RXD == 1 )
241 3 {
C51 COMPILER V7.50 SOFT_RS232 08/22/2006 15:15:24 PAGE 5
242 4 soft_receive_enable (); //起始位错, 从新开始
243 4 }
244 3 else
245 3 {
246 4 //下次中断在数据位或停止位中的某时刻发生
247 4 rs_timerL += rs_FULL_BIT_L + 0x10;
248 4 rs_timerH = rs_FULL_BIT_H;
249 4 rs_shift_count++;
250 4 rs_BUF = 0; //清移位缓冲变量
251 4 }
252 3 }
253 2 else
254 2 {
255 3 rs_timerL += rs_FULL_BIT_L; //下次中断在数据位或停止位中发生
256 3 rs_timerH = rs_FULL_BIT_H;
257 3
258 3 rs_shift_count++; //2--9:数据位 10:停止位
259 3
260 3 if ( rs_shift_count == 9)
261 3 {
262 4 rs_BUF = rs_BUF >> 1; //接收第8位
263 4 rs_BUF_bit7 = rs_RXD;
264 4 // if( ReceivePoint < rs_RECEIVE_MAX)
265 4 // { //保存收到的字节
266 4 rs232buffer[ReceivePoint++] = rs_BUF;
267 4 // }
268 4 // else
269 4 // {
270 4 // rs_f_RI_enable = 0; //缓冲区满, 禁止接收
271 4 // }
272 4 }
273 3 else
274 3 {
275 4 if (rs_shift_count < 9 ) //收到的是数据位 1 -- 7
276 4 {
277 5 rs_BUF = rs_BUF >> 1;
278 5 rs_BUF_bit7 = rs_RXD;
279 5 }
280 4 else
281 4 { //收到停止位,继续检测 PC 机发出的下一个起始位
282 5 soft_receive_init();
283 5 }
284 4 }
285 3 }
286 2 TCON_TFx = 0; //清定时器中断标志
287 2 }
288 1 else
289 1 {
290 2 /************************ 发送 ****************************/
291 2 if (rs_f_TI_enable == 1)
292 2 {
293 3 rs_timerL += rs_FULL_BIT_L;//下次中断在数据位的末尾时刻
294 3 rs_timerH = rs_FULL_BIT_H;
295 3
296 3 rs_shift_count--; //0:停止位末尾时刻到
297 3 //1:发送停止位
298 3 //2--9:发送数据位
299 3 if (rs_shift_count > 9) //错误状态
300 3 {
301 4 rs_shift_count = 9;
302 4 rs_BUF = 0xFF;
303 4 }
C51 COMPILER V7.50 SOFT_RS232 08/22/2006 15:15:24 PAGE 6
304 3
305 3 if (rs_shift_count > 1) //2--9:发送数据位
306 3 {
307 4 ACC = rs_BUF;
308 4 ACC = ACC >> 1;
309 4 rs_TXD = CY;
310 4 rs_BUF = ACC;
311 4 }
312 3 else
313 3 {
314 4 if (rs_shift_count == 0) //0:停止位末尾时刻到
315 4 {
316 5 rs_TXD = 1;
317 5 rs_f_TI = 1; //已发送完毕一个字节
318 5 }
319 4 else
320 4 {
321 5 rs_TXD = 1; //1:发送停止位
322 5 }
323 4 }
324 3 }
325 2 }
326 1 }
327
328 //由收转到发时,要先调用 soft_send_enable ()
329 void rs_send_byte(INT8U SendByte) //发送一个字节
330 {
331 1 while ( rs_f_TI == 0); //等待发送完毕前一个字节
332 1 rs_TXD = 1;
333 1 rs_timerL = rs_START_BIT_L; //下次中断在起始位的末尾时刻
334 1 rs_timerH = rs_START_BIT_H;
335 1 rs_BUF = SendByte;
336 1 rs_shift_count = 10;
337 1 rs_TXD = 0; //发送起始位
338 1 rs_f_TI = 0; //清已发送完毕一个字节的标志
339 1 }
340
341 void initiate_MCU (void) //系统初始化
342 {
343 1 soft_rs232_init(); //串口初始化
344 1 EA = 1; //开中断
345 1 }
346
347 void delay (INT16U useconds)
348 {
349 1 for(;useconds>0;useconds--);
350 1 }
351
352 void send(uint8_t *temp,char j)
353 {
354 1 char i=0;
355 1 for (i=0;i<=j-1;i++) //按发送数据的长度来发送数据
356 1 {
357 2 ACC=*(temp+i);
358 2 SBUF=ACC; //发送数据
359 2 while(TI==0); //发送数据完毕时,TI会自动置高
360 2 TI=0; //发送数据完毕,将TI清零,准备下一次发送
361 2 }
362 1 }
363
364
365 GsmSend(char * CmdTmp)
C51 COMPILER V7.50 SOFT_RS232 08/22/2006 15:15:24 PAGE 7
366 {
367 1 char i;
368 1 for(i=0;i<strlen(CmdTmp);i++)
369 1 send(&CmdTmp[i],1);
370 1 }
371
372 void initial()
373 {
374 1 PCON= PCON & 0X7F;
375 1 TR1=0;
376 1 TMOD=TMOD | 0x20; //定时器1为自动装入方式 模式2、自动再装入8位计数器
377 1 ET1 = 0;
378 1 SCON=0x40; //串行口工作方式1:10位URAT,数据传输率可变
379 1 TH1=0xFD;
380 1 TL1=0xFD;
381 1 //设置数据格式
382 1 //低位在前
383 1 SM0=0;
384 1 SM1=1;
385 1 RI=0;
386 1 TI=0;
387 1 REN=1;
388 1 ES=1;
389 1 TR1=1;
390 1 }
391
392
393
394 void main (void)
395 {
396 1 //首先发送 128 个字节 00H--7FH, 然后等待 PC 机发送的数据。当收到 128
397 1 //个字节后,立刻将收到的 128 个数据回发送给 PC 机,然后继续等待下一个
398 1 //数据块。
399 1
400 1 word i;
401 1 initial();
402 1 // initiate_MCU(); //系统初始化:定时器模式1、
403 1
404 1 while(1)
405 1 {/*
406 2 soft_send_enable (); //允许发送,禁止接收
407 2 rs_send_byte('P');
408 2 while ( rs_f_TI == 0) ; // 等待最后一个字节发送完毕
409 2
410 2 soft_receive_enable (); //启动并开始接收,禁止发送
411 2 for(i=0;i<4000;i++)
412 2 {
413 2 if (rs_BUF==0x0D) break ;
414 2 delay(10);
415 2 }
416 2 rs_f_RI_enable = 0;
417 2 ReceivePoint = 0;
418 2 if(i>=4000)
419 2 {
420 2 rs232buffer[0]='\0';
421 2 strcpy(rs232buffer,"ERROR!");
422 2 }
423 2 */
424 2 rs232buffer[0]='\0';
425 2 strcat(rs232buffer,"ERROR!");
426 2 rs232buffer[sizeof(rs232buffer)]='\0';
427 2 EA=0;
C51 COMPILER V7.50 SOFT_RS232 08/22/2006 15:15:24 PAGE 8
428 2 GsmSend(rs232buffer);
429 2 EA=1;
430 2 delay(60000);
431 2
432 2 }
433 1 }
*** WARNING C280 IN LINE 400 OF SOFT_RS232.C: 'i': unreferenced local variable
434
435
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 505 ----
CONSTANT SIZE = 7 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 5 9
IDATA SIZE = 32 ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -