main.c
来自「模拟串口通讯程序」· C语言 代码 · 共 300 行
C
300 行
#include<stdio.h>
#include<reg932.h>
#include<define.h>
#include <Intrins.h>
void main()
{
InitMCU();
EA=0;
EX0=1;//-----使能外部中断0
ES=1;
SendEndFg=1;
serialfg=1;
infrfg=0;
InfraredBufDptr=0;
SeriesBufDptr=0;
ClrDataBuf();
// ClrDataInBuf();
// ClrDataOutBuf();
EA=1; //打开总中断
while(1)
{
if(serialfg) //----------------------------模拟串口中断接收数据后置位
{
serialfg=0;
EA=0;
EX0=0; //----------------------------关串口中断
ES=0;
infsend(); //----------------------------模拟串口发送
ClrDataBuf();
EA=1;
ES=1;
EX0=1; //----------------------------开串口中断
SeriesBufDptr=0;
// ClrDataBuf(); //----------------------------清空缓存
}
else
{
if(infrfg) //----------------------------红外串口接收数据后置位
{
infrfg=0;
EA=0;
EX0=0;
ES=0; //----------------------------关模拟串口外部中断
serialsend(); //----------------------------模拟串口发送
ClrDataBuf();
EA=1;
ES=1;
EX0=1;
InfraredBufDptr=0;
// ClrDataBuf(); //----------------------------清空缓
}
else
{
DelayTwo(10);
}
}
WDT();
}
}
//---模拟串口
void INT_INT0(void) interrupt 0
{
unsigned char data i,j,k,InData;
bit DataRch;
EX0=0;
j=0;
DataRch=0;
InData=0;
i=0;
DelayOne(20);
while(i<10)
{
if(i<=8)
{
if(i==0)
{
_nop_();
}
else
{
InData>>=1;
if(SRXD==1)
{
InData|=0x80;
j++;
if(j==2)
{
j=0;
}
}
}
}
else
{
if(i==9)
{
DataRch=SRXD;
}
}
DelayOne(82);//--->11.0592M
i++;
}
if(j==1)
{
if(DataRch)
{
k=1;
}
else
{
k=0;
}
}
else
{
if(DataRch)
{
k=0;
}
else
{
k=1;
}
}
if(SendEndFg)//----------------------------------------------------------上次数据是否发送完毕?
{
//k=1;
if(k)
{
// ComInceptTime=2;//------------------------------------------------如果两秒内没有接收结束自动中断接收并清除已经接收的数据
// InDataFg=1;
if(SeriesBufDptr<DataLend)
{
if(SeriesBufDptr==0)//--------------------------------------数据缓冲区地址指针是否为零
{
if(InData==0x68)//----------------------------------------数据保存到缓冲区---缓冲区的第一个数据是否等于0x68
{
DataBuf[SeriesBufDptr]=InData;
SeriesBufDptr++;//----------------------------------缓冲区地址累加
}
else
{
SeriesBufDptr=0;//----------------------------------缓冲区地址归零
}
}
else
{
if(SeriesBufDptr==7)//----------------------------------缓冲区指针是否等于7
{
if(InData==0x68)//------------------------------------缓冲区已接收的第8位是否等于0x68
{
DataBuf[7]=InData;//----------------------------数据保存到缓冲区
SeriesBufDptr++;//------------------------------缓冲区地址累加
}
else
{
SeriesBufDptr=0;//------------------------------缓冲区地址归零
}
}
else
{
DataBuf[SeriesBufDptr]=InData;//------------------数据保存到缓冲区
SeriesBufDptr++;//----------------------------------缓冲区地址累加
}
}
}
else
{
SeriesBufDptr=0;//------------------------------------------缓冲区地址归零
}
}
if(DataBuf[DataBuf[9]+11]==0x16)//----------------------------是否完成一帧数据的接收?结束符是否等于0x16
{
// SerSendFg=0;//------------------------------------------------非串口状态
// InfSendFg=1;//------------------------------------------------红外状态
serialfg=1;//-----------------------------------------------启动命令解析使能位
SeriesBufDptr=0;//------------------------------------------缓冲区地址归零
SendEndFg=0;//------------------------------------------------已发送完毕位归零
}
EX0=1;//----------------------------------------------------------使能接收
}
else
{
EX0=0;//----------------------------------------------------------禁止接收
}
}
void INT_SERIAL(void) interrupt 4 //-----------------红外串口
{
unsigned char i,c;
bit j,k;
ES=0; //-----------------------------------------------关闭红外串口接收中断
RI=0; //-----------------------------------------------红外串口接收数据
j=0;
k=0;
c=SBUF;
for(i=0;i<8;i++)
{
if(c&0x01)
{
j=~j;
}
c>>=1;
}
if(j)
{
if(RB8)
{
k=1;
}
else
{
k=0;
}
}
else
{
if(RB8)
{
k=0;
}
else
{
k=1;
}
}
if(SendEndFg)
{
if(k)
{
if(InfraredBufDptr<DataLend)
{
if(InfraredBufDptr==0)//----------------------------------------数据缓冲区地址指针是否为零
{
if(SBUF==0x68)//------------------------------------------数据保存到缓冲区---缓冲区的第一个数据是否等于0x68
{
DataBuf[InfraredBufDptr]=SBUF;
InfraredBufDptr++;//------------------------------------缓冲区地址累加
}
else
{
InfraredBufDptr=0;
}
}
else
{
if(InfraredBufDptr==7)//------------------------------------数据缓冲区地址指针是否为零
{
if(SBUF==0x68)//--------------------------------------数据保存到缓冲区---缓冲区的第一个数据是否等于0x68
{
DataBuf[InfraredBufDptr]=SBUF;
InfraredBufDptr++;//--------------------------------缓冲区地址累加
}
else
{
InfraredBufDptr=0;
}
}
else
{
DataBuf[InfraredBufDptr]=SBUF;
InfraredBufDptr++;//------------------------------------缓冲区地址累加
}
}
}
else
{
InfraredBufDptr=0;
}
}
if(DataBuf[DataBuf[9]+11]==0x16)
{
infrfg=1;
InfraredBufDptr=0;
SendEndFg=0;
}
ES=1;//---------------------------------------------------------------使能接收
}
else
{
ES=0;//---------------------------------------------------------------禁止接收
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?