⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serial.c

📁 实现485、232信号到can信号的转换。根据需要调整即可。
💻 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 + -