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

📄 serial.c

📁 UCOSII在C8051F单片机上的移植
💻 C
字号:
/*
*********************************************************************************************************
*                                               uC/OS-II
*                                               实时内核
*
*                        (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL
*                                               版权所有
*
*                                            8051处理器代码
*                                           KEIL C51大模式编译
*
* 文件名 : SERIAL.C
* 功能:基于中断的串口驱动及显示程序
*********************************************************************************************************
*/

//**********************************************************************************
//波特率计算公式:
//        TH1=256-(2^SMOD/32*Fosc/12*1/Baud)
//    其中:SMOD=0,1;Fosc=晶体或晶振频率;Bound=波特率
//    本例中,SMOD=0;Fosc=22.1184*10E6;Bound=19200bps,所以TH1=0xFD
//Baud rate(@22.1184Mhz)
//300(52);1200(D5);2400(EA);4800(F5);9600(FB);19200(FD);38400(FF);
//**********************************************************************************

#ifndef  OS_MASTER_FILE
#include "includes.h"
#endif

#include <serial.h>

unsigned char TxBuf[LenTxBuf],RxBuf[LenRxBuf];	//收发缓冲区
unsigned int inTxBuf,outTxBuf,inRxBuf,outRxBuf;	//收发缓冲区读写指针
bit TIflag=1;

void InitSerial() reentrant	//串口初始化
{
	TMOD=TMOD&0x0F;
	TMOD=TMOD|0x20;
	TH1=0xFD;	//19200bps@22.1184MHz
	SCON0=0x50;PCON=0x00;
	TR1=1;
}

void InitSerialBuffer(void) reentrant//串口缓冲区初始化
{
	inTxBuf=outTxBuf=0;
	inRxBuf=outRxBuf=0;
	ES0=1;
}

void serial(void) reentrant
{    //注:中断服务程序在汇编中实现
	if(TI0){
		TI0=0;
		if(inTxBuf==outTxBuf){
			TIflag=1;
			return;
		}	//TxBuf已空
		SBUF0=TxBuf[outTxBuf]; outTxBuf=(outTxBuf+1)%LenTxBuf;
	}
	if(RI0){
		RI0=0;
		inRxBuf=(inRxBuf+1)%LenTxBuf;
		if(inRxBuf==outRxBuf)
			return;	//RxBuf已满
		RxBuf[inRxBuf]=SBUF0;
	}
}

void PrintChar(unsigned char ch) reentrant//显示字符
{
	if(TIflag){		
		TIflag=0;
		TI0=1;
	}
	inTxBuf=(inTxBuf+1)%LenTxBuf;
	if(inTxBuf==outTxBuf)
		return;	//TxBuf已满
	TxBuf[inTxBuf]=ch;
}

void PrintStr(unsigned char *str) reentrant//显示字符串
{
	int i;
	unsigned char ch;
	
	OS_ENTER_CRITICAL();
	for(i=0;i<MaxLenStr;i++){
		ch=*(str+i);
		if(ch=='\0')
			break;
		else if(ch=='\n'){
			PrintChar('\n');
			PrintChar('\r');
		} 
		else
			PrintChar(ch);
	}
	OS_EXIT_CRITICAL();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -