⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 buf_rs232.c

📁 51常用子程序-4.0M.zip
💻 C
字号:
#include <reg51.h>
#define uchar unsigned char
uchar xdata r_buf[32];
uchar xdata t_buf[32];
uchar r_in,r_out,t_in,t_out;   /*定义发送、接收“指针”*/
bit r_full,t_empty,t_done;     /*定义接收区满,发送区空,发送完成标志*/
code uchar m[]={"this is a test program\r\n"};
serial()interrupt 4 using 1
{if(RI&&~r_full)               /*是接收中断且接收缓冲区未满*/
    {r_buf[r_in]=SBUF;        /*接收*/
     RI=0;                    /*淸标志*/
     r_in=++r_in&0x1f;        /*下标+1*/
     if(r_in==r_out)r_full=1; /*判断是否要置r_full标志*/
     }
 else if (RI&&~t_empty)       /*是发送中断且发送缓冲区未空*/
         {SBUF=t_buf[t_out];  /*接收*/
          TI=0;               /*淸标志*/
          t_out=++t_out&0x1f; /*下标+1*/
          if(t_out==t_in)t_empty=1;/*判断是否要置t_empty标志*/
          }
 else if (TI)                 /*是发送中断且发送缓冲区已空*/
         {TI=0;t_done=1;}     /*置t_done标志*/
 }
void loadmsg(uchar code *msg)
{while((*msg!=0)&&((((t_in+1)^t_out)&0x1f)!=0))
      {t_buf[t_in]=*msg;
       msg++;
       t_in=++t_in&0x1f;
       if(t_done)
         {TI=1;
          t_empty=t_done=0;
          }
       }
 }
void process(uchar ch){return;}
void processmsg(void)
{while(((r_out+1)^r_in)!=0)
      {process(r_buf[r_out]);
       r_out=++r_out&0x1f;
       }
}
main()
{TMOD=0x20;TH1=0xfd;TR1=1;SCON=0x50;IE=0x90;
 t_empty=t_done=1;     /*初始化为“发送完成“*/
 r_full=0;       /*允许接收*/
 r_out=t_in=t_out=0;   /*接收发送区边界*/
 r_in=1;       /*接收“指针”为0*/
 for(;;){
         loadmsg(&m);
         processmsg();
         }
}
         
 
  
            

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -