📄 serial.c
字号:
// Serial.c
// 基于中断的串口驱动及显示程序
//**********************************************************************************
// 程序特点:
// 1.基于中断,可并发执行
// 2.参数可配置(收发缓冲区大小,最大字符串长度,TAB键移动距离)
//**********************************************************************************
// 使用方法:(此范例自包含,独立于其他程序。)
// 先配制收发缓冲区大小等可变参数(在serial.h中的宏定义)
// 1.开头加入#include <reg51.h>语句,一定要有。
// 2.初始化串口 InitSerial();
// 3.初始化串口缓冲区 InitSerialBuffer();
// 4.使用显示字节,字,长字,字符,字符串,清屏函数。
//
//**********************************************************************************
// 波特率计算公式:
// TH1=256-(2^SMOD/32*Fosc/12*1/Bound)
// 其中:SMOD=0,1;Fosc=晶体或晶振频率;Bound=波特率
// 几个经典值
//
//
//**********************************************************************************
//书写风格:
// 3.多个单词(2个及以上),每个单词首字母大写。(有时变量名第一个单词首字母小写)
// 4.采用内缩风格,每次缩进8个空格。
//**********************************************************************************
//建议:
// 你完全可以把该子程序当作函数库使用,以便减少重复劳动,提高代码质量。
//**********************************************************************************
#include "config.h"
uint8 SerialOutData[MAX_OUT_SIZE]; //收发缓冲区实体
uint8 SerialInData[MAX_IN_SIZE];
uint8 InRear, InFront, OutRear, OutFront; //收发缓冲区读写指针
uint8 SerialCanSend = 1; //Note:It must be 1.
void SerialInit() reentrant//串口初始化
{
SCON = 0x50;
// PCON |= 0x80; // baud x 2
TMOD = TMOD & 0x0f;
TMOD = TMOD | 0x20;
TH1 = 0xfd; // 晶振22.1184,波特率19200bps
TL1 = 0xfd;
TR1 = 1;
ES = 1;
// EA = 1;
}
// 串口缓冲区初始化
void SerialBufferInit(void) reentrant
{
InRear = 0;
InFront = 0;
OutRear = 0;
OutFront = 0;
}
// 从串口缓冲区读1字节数据
uint8 SerialGetChar(uint8 *InData) reentrant
{
// ES=0;
if(InRear == InFront) //SerialInData Empty
{
ES=1;
return 0;
}
if(InRear == InFront)
return 0;
*InData = SerialInData[InRear];
InRear = (InRear + 1) % MAX_IN_SIZE;
// ES=1;
return 1;
}
void SerialSendChar (uint8 OutData) reentrant //显示字符
{
EA = 0;
if (SerialCanSend)
{
SerialCanSend = 0;
SBUF = OutData;
}
else
{
if ((OutFront + 1) % MAX_OUT_SIZE == OutRear) //SerialOutData Full
{
return;
}
OutFront = (OutFront + 1) % MAX_OUT_SIZE;
SerialOutData[OutFront] = OutData;
}
EA = 1;
}
// 显示字符串
void SerialSendStr(uint8 *Str) reentrant
{
while (*Str)
{
SerialSendChar(*Str);
Str++;
}
}
void SerialClear () reentrant //清屏
{
SerialSendStr("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");//25个回车换行清屏幕。
}
// 串口中断处理
void SerialInt(void) reentrant interrupt 4
{
if (TI)
{
TI=0;
if(OutRear == OutFront) //SerialOutData Empty
{
SerialCanSend = 1;
return;
}
else
{
SBUF = SerialOutData[OutRear];
OutRear = (OutRear + 1) % MAX_OUT_SIZE;
}
}
if (RI)
{
RI = 0;
if (InRear == (InFront + 1) % MAX_IN_SIZE) return; //SerialInData Full
InRear = (InFront + 1) % MAX_IN_SIZE;
SerialInData[InFront] = SBUF;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -