?? buf_rs232.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 + -