📄 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 *OutRear,*OutFront,*InRear,*InFront; //收发缓冲区读写指针
bit SerialCanSend=1; //Note:It must be 1.
void SerialInit() reentrant//串口初始化
{
SCON = 0x50;
PCON = 0x80;
TMOD = TMOD & 0x0f;
TMOD = TMOD | 0x20;
TH1 = 0xff; // 晶振22.1184,波特率19200bps
TL1 = 0xff;
TR1 = 1;
ES = 1;
// EA = 1;
}
// 串口缓冲区初始化
void SerialBufferInit(void) reentrant
{
OutRear=SerialOutData;
OutFront=SerialOutData;
InRear=SerialInData;
InFront=SerialInData;
}
// 串口中断处理
void SerialInt(void) reentrant interrupt 4
{
uint8 *t;
if (TI)
{
TI=0;
if(OutRear==OutFront) {SerialCanSend=1;return;}//SerialOutData Empty
SBUF=*OutFront; OutFront++;
if(OutFront==SerialOutData+MAX_OUT_SIZE) OutFront=SerialOutData;
}
if (RI)
{
RI=0;
t=InRear;t++;
if(t==SerialInData+MAX_IN_SIZE) t=SerialInData;
if(t==InFront) return; //SerialInData Full
*InRear=SBUF;
InRear=t;
}
}
// 从串口缓冲区读1字节数据
uint8 SerialGetChar(uint8 *ch) reentrant
{
// ES=0;
if(InRear==InFront)
{
ES=1;
return 0; //SerialInData Empty
}
*ch=*InFront;
InFront++;
if(InFront==SerialInData+MAX_IN_SIZE)
InFront=SerialInData;
// ES=1;
return 1;
}
void SerialPrintChar(uint8 ch) reentrant //显示字符
{
uint8 *t;
//ES=0;
if(SerialCanSend)
{
SerialCanSend=0;
TI=1;
}
t=OutRear;t++;
if(t==SerialOutData+MAX_OUT_SIZE)
t=SerialOutData;
if(t==OutFront)
{/*ES=1;*/return;} //SerialOutData Full
*OutRear=ch;
OutRear=t;
//ES=1;
}
void PrintCh(uint8 ch) reentrant //内部使用,不建议用户看到。
{
if(ch>=0&&ch<=9) ch=ch+'0';
else ch=ch+'A'-10;
SerialPrintChar(ch);
}
void SerialPrintStr(uint8 *str) reentrant//显示字符串
{
EA=0;
while (*str)
{
SerialPrintChar(*str);
str++;
}
EA=1;
}
void SerialClear() reentrant //清屏
{
SerialPrintStr("\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个回车换行清屏幕。
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -