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 + -
显示快捷键?