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

📄 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 *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 + -