📄 serial.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 + -