📄 serial.c
字号:
//基于中断的串口驱动程序
//程序特点:
// 1.基于中断,可并发执行
// 2.参数可配置(收发缓冲区大小,最大字符串长度,TAB键移动距离)
//**********************************************************************************
//使用方法:(此范例自包含,独立于其他程序。)
// 先配制收发缓冲区大小等可变参数(在serial.h中的宏定义)
// 1.开头加入#include <reg51.h>语句,一定要有。
// 2.初始化串口 InitSerial();//本例中为20MHz晶体,300波特率,模式2初始化
// 3.初始化串口缓冲区 InitSerialBuffer();
// 4.使用显示字节,字,长字,字符,字符串,清屏函数。
//**********************************************************************************
//波特率计算公式:
// TH1=256-(2^SMOD/32*Fosc/12*1/Bound)
// 其中:SMOD=0,1;Fosc=晶体或晶振频率;Bound=波特率
//**********************************************************************************
#include <serial.h>
#include <at89x52.h>
unsigned char TxBuf[LenTxBuf],RxBuf[LenRxBuf]; //串口0收发缓冲区实体 receiveflag:接收中断标志
unsigned char receiveflag=0;
unsigned char *inTxBuf,*outTxBuf,*inRxBuf,*outRxBuf; //串口0收发缓冲区读写指针
bit TIflag=1;//Note:It must be 1.
bit RIflag=1;
void InitSerial()//串口初始化
{
TMOD=0x21; //方式1 T0 16 bit
TL1=0xFD;
TH1=0xFD; //9600 , 11.0592MHz
SCON=0x50;
PCON=0x80; //SM0.SM1=01:可变波特率 REN=1,允许串行接收位 SCON:串行接口控制寄存器
//PCON:首位是SMOD,SMOD=1,在串行接口方式1、2、3情况下,波特率提高一倍。复位时,SMOD=0(波特率不加倍).
TR1=1; //T1运行控制位
ES=1;
}
void InitSerialBuffer(void)//串口缓冲区初始化
{
inTxBuf=TxBuf;outTxBuf=TxBuf; //串口0缓冲区初始化 TxBuf[LenTxBuf],RxBuf[LenRxBuf];
inRxBuf=RxBuf;outRxBuf=RxBuf;
ES=1; //串行接口允许中断位
}
void serial(void) interrupt 4
{ //中断在汇编中实现,去掉interrupt 4{//串口中断服务子程序
unsigned char *t;
if(TI){ //TI发送中断标志
TI=0;
if(inTxBuf==outTxBuf)
{
TIflag=1;return; //TxBuf Empty
}
SBUF=*outTxBuf; outTxBuf++;
if(outTxBuf==TxBuf+LenTxBuf) outTxBuf=TxBuf;
}
if(RI){ //RI接收中断标志
RI=0;
t=inRxBuf;t++;
if(t==RxBuf+LenRxBuf) t=RxBuf;
if(t==outRxBuf) {RIflag=1;return;} //RxBuf Full
*inRxBuf=SBUF;
inRxBuf=t;
receiveflag=1;
}
}
/*
bit getbyte(unsigned char *ch)//从串口缓冲区读1字节数据
ES=1; ////串行接口允许中断位
*/
bit getbyte(unsigned char *ch) //从串口缓冲区读1字节数据
{
if(inRxBuf==outRxBuf) {ES=1;return 0;} //RxBuf Empty
*ch=*outRxBuf; outRxBuf++;
if(outRxBuf==RxBuf+LenRxBuf) outRxBuf=RxBuf;
//ES=1;
return 1;
}
bit putbytes(unsigned char *ch,unsigned char bytes)//串口发送数据
{
unsigned char *t;
unsigned char i;
for(i=0;i<bytes;i++)
{
t=inTxBuf; t++;
if(t==TxBuf+LenTxBuf) t=TxBuf;
if(t==outTxBuf)
{
/*ES=1;*/
return 0;
} //TxBuf Full
*inTxBuf=*ch; //要发送的数据均是存放在ch空间里的
inTxBuf=t;
ch++;
}
if(TIflag)
{
TIflag=0;
TI=1;
}
return 1;
}
unsigned char ReceivedBytes(void) //判断串口缓冲区是否为空,若为空返回0,否则返回缓冲区字节数
{
char len;
len=inRxBuf-outRxBuf;
if(len<0)
len+=LenRxBuf;
return len;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -