⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serial.c

📁 这个事51各个模块的驱动程序
💻 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 + -