📄 sio.c
字号:
#include <reg51.h>
#include <string.h>
#include "sio.h"
#define TBUF_SIZE 256 // 这两行不要修改
#define RBUF_SIZE 256
static xdata unsigned char tbuf [TBUF_SIZE];
static xdata unsigned char rbuf [RBUF_SIZE];
static xdata unsigned char t_in = 0;
static xdata unsigned char t_out = 0;
static xdata unsigned char t_disabled = 0;
static xdata unsigned char r_in = 0;
static xdata unsigned char r_out = 0;
/******************************* 中断处理函数 ***************************
* 功能:完成数据得的接收合发送
************************************************************************/
static void com_isr (void) interrupt 4 using 2 { //
if (RI != 0) { // 接收
RI = 0;
if ((r_in + 1) != r_out)
rbuf [r_in++] = SBUF;
}
if (TI != 0) { // 发送
TI = 0;
if (t_in != t_out)
SBUF = tbuf [t_out++];
else
t_disabled = 1;
}
}
/***************************** 串行口初始化函数 **************************
* 功能:初始化单片机的串行口
*************************************************************************/
void com_initialize (void) {
com_baudrate (1200); // 利用定时器T1作为波特率发生器
EA = 0; // 关中断
t_in = 0; // 清除接收和发送缓冲区
t_out = 0;
t_disabled = 1;
r_in = 0;
r_out = 0;
SM0 = 0; SM1 = 1; // 串行口方式1
REN = 1; // 允许接收
TI = 0; // 清除发送中断标志
RI = 0; // 清除接收中断标志
ES = 1; // 允许串行口中断
PS = 0; // 设置串行口中断为低优先级
EA = 1; // 开中断
}
/**************************** 波特率发生器函数 ***************************
* 功能:利用定时器T1产生由参数baudrate指定的波特率
*************************************************************************/
void com_baudrate (unsigned baudrate) {
EA = 0; // 关中断
TI = 0; // 清除发送中断标志
t_in = 0; // 清除发送缓冲区
t_out = 0;
t_disabled = 1; // 禁止发送
TR1 = 0; // 停止定时器T1
ET1 = 0; // 禁止T1中断
PCON |= 0x80; // 波特率加倍
TMOD &= ~0xF0; // 设置T1工作于方式2
TMOD |= 0x20;
TH1 = (unsigned char) (256 - (XTAL / (16L * 12L * baudrate)));
TR1 = 1; // 启动T1
EA = 1; // 开中断
}
/************************** 串行口字符输出函数 ***************************
* 功能:从串行口输出一个字符c
**************************************************************************/
char com_putchar (unsigned char c) {
if ((TBUF_SIZE - com_tbuflen ()) <= 2)
return (-1); // 如果发送缓冲区满则返回 -1
EA = 0; // 关中断
tbuf [t_in++] = c; // 将数据加入到发送缓冲区并开中断
if (t_disabled) {
t_disabled = 0;
TI = 1;
}
EA = 1;
return (0); // 串行口输出正确,返回0
}
/************************* 串行口字符输入函数 ****************************
* 功能:从串行口输入一个字符
**************************************************************************/
int com_getchar (void) {
int c;
if (com_rbuflen () == 0)
return (-1); // 如果接收缓冲区长度为0(未收到字符),返回 -1
EA = 0;
c = rbuf [r_out++];
EA = 1;
return (c); // 串行口输入正确,返回输入的字符
}
/************************* 计算接收缓冲区长度 ****************************
* 功能:计算接收缓冲区长度并返回给主调函数
**************************************************************************/
unsigned char com_rbuflen (void) {
return (r_in - r_out);
}
/************************* 计算发送缓冲区长度 ****************************
* 功能:计算发送缓冲区长度并返回给主调函数
**************************************************************************/
unsigned char com_tbuflen (void) {
return (t_in - t_out);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -