📄 serial.c
字号:
#include "Serial.h"
#include "STC89C51RC_RD_PLUS.H"
//串口中断服务程序,仅需做简单调用即可完成串口输入输出的处理
//出入均设有缓冲区,大小可任意设置。
//可供使用的函数名:
//char getbyte(void);从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。
//*************************************************************************
bit m_bSendEnd = 0;
#define ILEN 30 /* size of serial receiving buffer */
xdata unsigned char inbuf[ILEN];
xdata uchar xdata *inlast=inbuf; //最后由中断进入接收缓冲区的字节位置
xdata uchar xdata *getlast=inbuf; //最后取走的字节位置
bit inbufsign; //接收缓冲区非空标志 有=1
bit inbufful; //输入缓冲区满标志 满=1
//#define StateIO StateIO_3
//#define bSerialRSLed bSerialRSLed_3
//char bdata StateIO _at_ 0x20;
//sbit bSerialRSLed = StateIO^5;
//串口初始化 晶振为11.0592M 方式1 波特率300-57600
void InitCom(uchar BaudRate)
{
uchar THTL;
switch (BaudRate)
{
case 1: THTL = 64; break; //波特率300
case 2: THTL = 160; break; //600
case 3: THTL = 208; break; //1200
case 4: THTL = 232; break; //2400
case 5: THTL = 244; break; //4800
case 6: THTL = 250; break; //9600
case 7: THTL = 253; break; //19200
case 8: THTL = 255; break; //57600
default: THTL = 208;
}
SCON = 0x50; //串口方式1,允许接收
TMOD |= 0x20; //定时器1定时方式2
TCON |= 0x40; //设定时器1开始计数
TH1 = THTL;
TL1 = THTL;
PCON = 0x80; //波特率加倍控制,SMOD位
RI = 0; //清收发标志
TI = 0;
TR1 = 1; //启动定时器
ES = 1;
}
//串口发送
void Send(uchar sdata)
{
//bSerialRSLed = 1;
SBUF = sdata;
m_bSendEnd = 1;
while(m_bSendEnd){};
}
bit SerialCheck()
{
return inbufsign;
}
//从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。
uchar Getbyte (void)
{
char idata c ;
while (!inbufsign); //缓冲区空等待
ES=0;
c= *getlast; //取数据
getlast++; //最后取走的数据位置加一
inbufful=0; //输入缓冲区的满标志清零
if (getlast==inbuf+ILEN) getlast=inbuf; //地址到顶部回到底部
if (getlast==inlast) inbufsign=0; //地址相等置接收缓冲区空空标志,再取数前要检该标志
ES=1;
return (c); //取回数据
}
//****************************
void putinbuf(uchar c)
{
ES=0;
if(!inbufful)
{
*inlast= c; //放入数据
inlast++; //最后放入的位置加一
if (inlast==inbuf+ILEN) inlast=inbuf;//地址到顶部回到底部
if (inlast==getlast) inbufful=1; //接收缓冲区满置满标志
inbufsign=1;
}
ES=1;
}
xdata unsigned long IspReset = 0;
//串行中断程序
void int_s(void) interrupt 4 {
if (TI )
{
TI = m_bSendEnd = 0;
}
if (RI)
{
//bSerialRSLed = 1;
RI = 0;
//---ISP重启
if(SBUF == 0x12)
{
IspReset = 0;
}
IspReset += SBUF;
if(SBUF == 0x78&&IspReset == 0x114)
{
unsigned long j;
for(j=0;j<60000;j++);for(j=0;j<60000;j++);
ISP_CONTR = 0x60;
}
//-----------------------------------------------
if(!inbufful)
{
*inlast= SBUF; //放入数据
inlast++; //最后放入的位置加一
inbufsign=1;
if (inlast==inbuf+ILEN) inlast=inbuf;//地址到顶部回到底部
if (inlast==getlast) inbufful=1; //接收缓冲区满置满标志
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -