📄 rs232.c
字号:
#include <config.h>
#define IN_UART
#define RECEBUFFER_COUNT 8
#define SENDBUFFER_COUNT 36
unsigned char idata rs232_recedata=0x00; //从接收缓冲中取得的数据
unsigned char idata rs232_recerece=0x00; // 发送位置的标志
unsigned char idata rs232_recesend=0x00; // 已经处理的位置标志
unsigned char idata rs232_recebytes=0x00; // 缓冲区还存在的字节数
unsigned char idata rs232_recebuff[RECEBUFFER_COUNT];
unsigned char idata rs232_sendrece=0x00; // 发送位置的标志
unsigned char idata rs232_sendsend=0x00; // 已经处理的位置标志
unsigned char idata rs232_sendbytes=0x00; // 缓冲区还存在的字节数
unsigned char idata rs232_sendbuff[SENDBUFFER_COUNT];
void rs232_initialize(void)
{
AUXR &=0x3f; //设定定时器0,1为普通的12时钟速度 T0x12=0,T1x12=0
SCON = 0x50;
PCON = 0x80;
TMOD &=0x0f;
TMOD |=0x20;
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_sendbytes==0x00) //如果缓冲区已经发送完毕,则要启动发送
{rs232_sendbytes++;
SBUF=ch;
}
else // 如果缓冲区还有其他数据等待发送
{if(rs232_sendrece>=SENDBUFFER_COUNT)
rs232_sendrece=0x00;
rs232_sendbuff[rs232_sendrece]=ch;
rs232_sendbytes++;
rs232_sendrece++;
}
}
unsigned char rs232_getdata(unsigned char access_mode) //取得receive buffer时需要查询是否有串行数据
{unsigned char idata return_value = 0;
if(access_mode == 0x00) // 查询receive buffer缓冲区中有多少个数据
return_value= rs232_recebytes; //返回缓冲区剩余数据的个数
else if(access_mode == 0x01) // 读取数据并将数据清除
{if(rs232_recebytes!=0x00) // 如果系统中有接收的串行数据
{return_value=rs232_recebuff[rs232_recesend];
rs232_recebuff[rs232_recesend]=0x00;
rs232_recesend++;
if(rs232_recesend>=RECEBUFFER_COUNT) //如果越界,则跳转
rs232_recesend=0x00;
rs232_recebytes--;
}
else
return_value = 0x00; //如果系统出错了,则返回0X00;
}
return return_value;
}
// 串行的中断处理程序
void rs232r_isr(void) interrupt 4
{
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++;
}
}
if(RI!=0x00)
{ RI = 0x00; //清除接收标志
RB8 =0x00;
if(rs232_recerece>=RECEBUFFER_COUNT)
rs232_recerece=0x00;
rs232_recebuff[rs232_recerece++] = SBUF;
rs232_recebytes++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -