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

📄 uart1.c

📁 f330与mfrc522 通信 构成读卡器 上传源码和原理图。
💻 C
字号:
//*********************************************************
// 项  目:  通用控制器-V1.0
// 文件名: 	Uart1.C
// 描  述:  串口1中断服务程序
//*********************************************************

//===============================================
#include <All.h>                     //全部头文件
//===============================================

//***********************************************
//变量定义
//***********************************************

extern bit   Len_ok;                  //收到包长标志
extern bit   Com_ok;                  //收到命令标志
extern bit   Head_ok;                 //发现包头标志
extern bit   Com1_busy;               //串口1 忙

UINT   idata Data_len;                //数据长度

UINT   idata TX1_CNT,TX1_BUF;         //串口1发长度
UINT   idata RX1_CNT,RX1_BUF;         //串口1收长度

UCHAR  xdata Com1TBuf[Com1TBuf_len] _at_ Com1TBuf_addr;
UCHAR  xdata Com1RBuf[Com1RBuf_len] _at_ Com1RBuf_addr; 


//***********************************************
//函数开始
//***********************************************

//------------------------------------------------------
//初始化UART1
//------------------------------------------------------
void init_com1(void)                 //初始化串口1
{
	ClearCom1RBuf();                 //清发送、接收缓冲区
	OpenCom1();                      //设置串口1
}
//-----------------------------------------------

void ClearCom1RBuf(void)             //清发送、接收缓冲区
{
	unsigned int  i;
    unsigned int  j;                 //接收缓冲很大

    TX1_CNT=TX1_BUF=0;               //清发长度
	RX1_CNT=RX1_BUF=0;               //清收长度

	for (i=0;i<Com1TBuf_len;i++)
	   { Com1TBuf[i]=0; }            //清发送缓冲区
	for (j=0;j<Com1RBuf_len;j++)
	   { Com1RBuf[j]=0; }            //清接收缓冲区
}

//-----------------------------------------------
void OpenCom1(void)                  //初始化UART1
{
	T4CON  = 0x00;
    RCAP4L = 0xdc;//0xfd;//0xfa;//0xdc;//   //115200//57600//9600bps
    RCAP4H = 0xff;
    T4CON |= 0x34;                   //启动Timer4

    TX1_CNT=0;                       //清发长度
	RX1_CNT=0;                       //清收长度
	Com1_busy=0;                     //置串口闲

	EIE2  |= 0x40;                   //允许串口1中断
	SCON1  = 0x50;                   //串口1方式1,允许接收,清接断标志

}

//--------------------------------------------------------------------

void Comm1ISR(void) interrupt 20     //UART1中断处理程序
{
	bit TI1,RI1;
	unsigned char temp1;
	unsigned char temp2;
    

    temp1 = SCON1&0x01;
    RI1   = temp1^0;                 //串口1收中断标志
    temp1 = SCON1;
    temp2 = (temp1>>1)&0x01;
    TI1   = temp2^0;                 //串口1发中断标志

//****************************************************
	if (_testbit_(TI1))
	  {
          SCON1 &= 0xFD;                         //清发中断标志
 
          if (TX1_CNT)                           //非0发下字节
		       {
                 SBUF1=Com1TBuf[TX1_BUF];        //发一个字节
                 TX1_BUF++;                      //指针+1
                 TX1_CNT--;                      //长度-1
		       }
          else
		       {
		         TX1_BUF=0;                      //复位发指针
				 Com1_busy=0;                    //串口1 空闲
               }
	  }
//****************************************************
	if (_testbit_(RI1))
	  {	 
           SCON1 &= 0xFE;                        //清收中断标志
		   Com1RBuf[RX1_BUF]=SBUF1;              //接收数据
//-------------------------------------          
           if (  (SBUF1==0x14) &&                //本字节为14
		         (Com1RBuf[RX1_BUF-1]==0xff) &&  //上字节为FF
			     (!Len_ok)  )                    //没收到长度
				 {
                 RX1_BUF=1;
                 Head_ok=TRUE;                   //发现包头
				 }

           if (  (RX1_BUF==3)&&(Head_ok)  )
		         {
                 Len_ok=TRUE;                    //收到长度了
                 Data_len=Com1RBuf[2]*0x100+
				                Com1RBuf[3];     //保存长度
			     }

           RX1_BUF++;                            //存储指针+1

           if (RX1_BUF>=Com1RBuf_len)            //包长异常
		         {
		            Com_ok=0; 
                    RX1_BUF=0;
                    Len_ok=0;
					Head_ok=0;                   //重新开始
			     }

           if (  (Len_ok) &&  
		         (RX1_BUF==(Data_len+7))  )      //长度到了

		      {
				 if (SBUF1==3)                   //ETX校验
//               && (Com1RBuf[7]==1)             //RID校验
				    {
		            Com_ok=1;                    //包有效
                    RX1_BUF=0;                   //恢复指针
                    Len_ok=0;
					Head_ok=0;
                    Com1RBuf[0]=0xff;            //补充包头
					Com1RBuf[1]=0x14;
					Com1RBuf[2]=0x00;
					}
                 else
				    {
		            Com_ok=0;                    //包无效
                    RX1_BUF=0;                   //恢复指针
                    Len_ok=0;
					Head_ok=0;
					}
			  }
   	   }
}












⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -