📄 rs232.c
字号:
#include <config.h>
#define IN_UART
#define RECEBUFFER_COUNT 8
#define SENDBUFFER_COUNT 16
unsigned char idata rs232_recedata=0x00; //从接收缓冲中取得的数据
unsigned char idata rs232_recerece=0x00; // 发送位置的标志
unsigned char idata rs232_recesend=0x00; // 已经处理的位置标志
unsigned char idata rs232_recebytes=0x00; // 缓冲区还存在的字节数
#if XDATA_USING
unsigned char xdata rs232_recebuff[RECEBUFFER_COUNT];
#else
unsigned char idata rs232_recebuff[RECEBUFFER_COUNT];
#endif
unsigned char idata rs232_sendrece=0x00; // 发送位置的标志
unsigned char idata rs232_sendsend=0x00; // 已经处理的位置标志
unsigned char idata rs232_sendbytes=0x00; // 缓冲区还存在的字节数
#if XDATA_USING
unsigned char xdata rs232_sendbuff[SENDBUFFER_COUNT];
#else
unsigned char idata rs232_sendbuff[SENDBUFFER_COUNT];
#endif
void rs232_initialize(void)
{ AUXR &=0x3f; //设定定时器0,1为普通的12时钟速度 T0x12=0,T1x12=0
SCON = 0x50;
PCON = 0x80;
TMOD &=0x0f;
TMOD |=0x20;
// TH1 = 0xf8; /* 11.0592MHz晶振, 38400bps */
// TL1 = 0xf8; /* 11.0592MHz晶振, 38400bps */
TH1 = 0xfe; /* 22.1184MHz晶振, 57600bps */
TL1 = 0xfe; /* 22.1184MHz晶振, 57600bps */
// TH1 = 0xfc; /* 22.1184MHz晶振, 57600bps */
// TL1 = 0xfc; /* 22.1184MHz晶振, 57600bps */
// TH1 = 0xfa; /* 22.1184MHz晶振, 38400bps */
// TL1 = 0xfa; /* 22.1184MHz晶振, 38400bps */
// TH1 = 0xf4; /* 22.1184MHz晶振, 19200bps */
// TL1 = 0xf4; /* 22.1184MHz晶振, 19200bps */
// TH1 = 0xe8; /* 22.1184MHz晶振, 9600bps */
// TL1 = 0xe8; /* 22.1184MHz晶振, 9600bps */
TF1 = 0X00; // 定时器1的溢出标志
TR1 = 0x01;
TI = 0x00;
RI = 0x00;
ET1 = 0x01; // 定时器1的中断使能
ES = 0x01; // 开放串口
// PS = 0x01; // 将串口的优先级设定为最高
}
// rs232 sendbuffer 的自动处理和安排
void rs232_senddata(unsigned char ch)
{
#if RS232_USING
if(rs232_sendbytes==0x00) //如果缓冲区已经发送完毕,则要启动发送
{rs232_sendbytes++;
SBUF=ch;
}
else // 如果缓冲区还有其他数据等待发送
{if(rs232_sendrece>=SENDBUFFER_COUNT)
rs232_sendrece=0x00;
rs232_sendbuff[rs232_sendrece]=ch;
rs232_sendbytes++;
rs232_sendrece++;
}
#endif
}
#if RS232_USING
#if RS232GET_USING
bit rs232_getdata(void)
{
bit returan_val=0x00;
if(rs232_recebytes==0x00)
returan_val=0; // 如果没有数据则反馈为空
else
{rs232_recedata=rs232_recebuff[rs232_recesend];
rs232_recesend++;
if(rs232_recesend>=RECEBUFFER_COUNT)
rs232_recesend=0x00;
if(rs232_recebytes>0x00)
rs232_recebytes--;
returan_val=0x01;
}
return returan_val;
}
#endif
#endif
// 串行的中断处理程序
void rs232r_isr(void) interrupt 4
{
#if RS232_USING
if(TI!=0x00)
{ TI = 0x00;
TB8 =0x00;
if(rs232_sendbytes>0x00) //本次发送完毕的处理
rs232_sendbytes--;
if(rs232_sendbytes>0x00) //如果还需要发送
{if(rs232_sendsend>=SENDBUFFER_COUNT)
rs232_sendsend=0x00;
SBUF=rs232_sendbuff[rs232_sendsend];
rs232_sendsend++;
}
else //全部归位,以防止错误一直发生
{rs232_sendsend=0x00;
rs232_sendrece=0x00;
}
}
if(RI!=0x00)
{ RI = 0x00; //清除接收标志
RB8 =0x00;
if(rs232_recerece>=RECEBUFFER_COUNT)
rs232_recerece=0x00;
rs232_recebuff[rs232_recerece++] = SBUF;
rs232_recebytes++;
}
#else
TI = 0x00;
RI = 0x00; //清除接收标志
RB8 =0x00;
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -