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

📄 uart0.#1

📁 f330与mfrc522 通信 构成读卡器 上传源码和原理图。
💻 #1
字号:

//*********************************************************
// 项  目:  通用控制器-V1.0
// 文件名: 	Uart0.C
// 描  述:  串口0中断服务程序
//*********************************************************

//===============================================
#include "main.h"                    //全部头文件
#include "Uart0.h" 
#include "MFRC522.h"
//===============================================

//***********************************************
//变量定义
//***********************************************
UCHAR  bdata       BitFlag1;    //位寻址变量sbit   NewPack   = BitFlag1^0;  //串口新数据包标志sbit   Head_flag = BitFlag1^1;  //串口包头标志

UCHAR   bdata  DataFormat;      //读卡器数据输出格式
sbit   ReqMode   = BitFlag1^0;  //寻卡方式:0-非休眠卡,1-所有卡
sbit   keySelect = BitFlag1^0;  //密钥选择:0=KeyA,1=KeyB
sbit   OutFomart = BitFlag1^0;  //输出格式:1=读系列号,0=读数据块/
sbit   ReadMode  = BitFlag1^0;  //读卡方式:0=块,1=字节
sbit   AutoSend  = BitFlag1^0;  //自动发送:0=被动,1=自动

extern UCHAR xdata rx_buf[TX_PLOAD_WIDTH];  //
extern UCHAR xdata tx_buf[TX_PLOAD_WIDTH];
extern UCHAR   data SetxxBuf [4];

UCHAR  data   CardId;    //读卡器地址 
UCHAR  data   SioBurd;   //读卡器波特率
UCHAR  data   CardCs1;   //读卡器参数1

UCHAR  data   Sio_Lth; 
UCHAR  idata  Pack_len;                     //数据长度
UCHAR  idata  ComTBufHead, ComTBufTail;
UCHAR  idata  ComRBufHead, ComRBufTail;

UCHAR  xdata  ComTBuf[Com0TBuf_len] _at_ Com0TBuf_addr;  //00H
UCHAR  xdata  ComRBuf[Com0RBuf_len] _at_ Com0RBuf_addr;  //40H
//***********************************************
//函数开始
//===============================================
//初始化UART0
//===============================================
void Init_Com0(void)                 //初始化串口0
{
	ClearComRBuf();                  //清发送、接收缓冲区
	OpenCom0();                      //设置串口0
}
//-----------------------------------------------
//清发送、接收缓冲区
//-----------------------------------------------
void ClearComRBuf(void)              //
{
	unsigned char i;

	ComRBufHead=ComRBufTail=0;

	ComTBufHead=ComTBufTail=0;

	for (i=0;i<Com0TBuf_len;i++)

	   { ComTBuf[i]=0; }             //清发送缓冲区

	for (i=0;i<Com0RBuf_len;i++)

	   { ComRBuf[i]=0; }             //清接收缓冲区

}
/***********************************************
//打开UART0
/***********************************************/
void OpenCom0(void)    

{   //CKCON=T3H,T3L,T2H,T2L,T1,T0,SCA1,SCA0
    CKCON &= 0xF7;	//T1M=0,T1CLK=SYSCLK/12
	TMOD = 0x21;	//T1 方式2,重加载
	TH1 = TBUAD;    //MAIN.H定义:256-SYSCLK/12/BUAD=106
	TR1 =1;         //S0MD,-,MCE0,REN0,TB80,RB80,TI0,RI0                   
	SCON0 = 0x30;   //  0  0   1    1    0    0   0   0

	ComTBufHead=ComTBufTail=0;       //置发送缓冲头、尾指针=0
	ComRBufHead=ComRBufTail=0;       //置接收缓冲头、尾指针=0 
	ES0=1; 			                 //容许串口0中断   
}

/***********************************************
//UART0中断处理程序
//接收数据包格式:STX,长度,目地,源地,类型,命令.....ETX
//                AA  10   25   81    01    XX       BB
/***********************************************/

void CommISR(void) interrupt 4
{
	if (RI0==1)

	 { RS232_Rev();  }
	   
	//串口发送中断处理
	if (TI0==1)   

	 { RS232_Send();}
}
/***********************************************
//串口接收中断处理
/***********************************************/
void RS232_Rev(void)
{	
	unsigned char tmp; 
	    
	RI0=0;                             //接收数据 
    tmp  = SBUF0;
    ComRBuf[ComRBufTail]=tmp; 
    ComRBufTail++;         //存储指针+1

	   if (Head_flag == FALSE)
	       
		   { 
		     ComRBufTail = 0; 

			  if (tmp==0xAA)
		        {
	              ComRBufTail=1;    //发现AA包头,指针=01
		          Head_flag=TRUE;   //置包头标志
		        } 
             return;
		   }

        if (ComRBufTail == 2 && tmp != CardId)

		   { //地址不符合,禁止接收
		     ComRBufTail = 0;      
		     Head_flag   = FALSE;   //清包头标志
             return;
		   }
		    
         //AA包头,地址符合

	    if (ComRBufTail>=Com0RBuf_len)

		   {                     //包长异常
			 NewPack=0;
             Head_flag=0;
	         ComRBufTail=0;      //重新开始
             return;
		    }

	    if (tmp==0xBB && ComRBufTail==ComRBuf[2]+5)  //判包尾标志BB,
		  		   		    
              {   //已收包尾,且包长>6         
			    Pack_len=ComRBufTail;     //数据包长度
	    	    ComRBufTail=0;
                Head_flag=0;
                NewPack=1;
                Pack_Exec();               //数据包解析 				
              }
   	  }

/***********************************************
//串口发送中断处理
/***********************************************/ 
void RS232_Send(void)
  {	
	TI0=0;                //清发送中断
		 	
    if (ComTBufHead==Com0TBuf_len)
	   {	 
		 ComTBufHead=0;   //到最大长度指针归零
	   }
    if (ComTBufHead<Sio_Lth)        //
	   {	 
		 SBUF0=ComTBuf[ComTBufHead];  //未完发送下字节
		 ComTBufHead++;
	   }
	 else RW485 = 0; 	  
   }
/***********************************************
//接收数据包解析:
/***********************************************/
void Pack_Exec(void)
{
     unsigned char i,ptype,pcom; 

 if (NewPack)

    {	   
     pcom   = ComRBuf[3];    //包命令  

     switch (pcom)

	      {
		    case 0x80:          //设置ID

			   Card_Setxx(); 

			   break; 
            //-------------------
			case 0x81:          //设置波特率
			    
			   break; 
            //-------------------
            case 0x8E:          //设置读卡器输出方式
			   
			   break;
            //-------------------
            case 0x21:          //输出到P1口
			   
			   break;
            //-------------------
            case 0x22:       //
			   i=3; 
			   break;
            //-------------------
            default: 
			   i=0xff;       //
			   break;
		  }   
		 NewPack = 0;   
     }
	 
}
/***********************************************
//上位机设置读卡器波特率
/***********************************************/
void  Card_Setxx(void)
{
     unsigned char i;
	 i = 1;

	 SetxxBuf[0] = ComRBuf[4];
	 SetxxBuf[1] = ComRBuf[5];
	 SetxxBuf[2] = ComRBuf[6];
	 SetxxBuf[3] = ComRBuf[7];
     //
	 CardId     = SetxxBuf[0]; 
	 SioBurd    = SetxxBuf[1];
     DataFormat = SetxxBuf[2];
	 CardCs1    = SetxxBuf[3];
     //擦除FLASH
	 FLASH_PageErase (FLASH_TEMP);
     //设置写FLASH
     FLASH_Write (FLASH_TEMP, SetxxBuf, 4);
     //设置命令回答
     Cmd_Ack();
     
}
//===============================================
//读本地口状态:读口状态并生成数据包
//===============================================
void Cmd_Ack(void)
    {
	  ComTBuf[0] = ComRBuf[0];  //
	  ComTBuf[1] = ComRBuf[1]; 
      ComTBuf[2] = ComRBuf[2];
	  ComTBuf[3] = 0;           //'00'OK 
	  ComTBuf[4] = ComRBuf[4];
	  ComTBuf[5] = ComRBuf[5]; 
      ComTBuf[6] = ComRBuf[6];       //读P1口状态
	  ComTBuf[7] = ComRBuf[7];
	  ComTBuf[8] = ComRBuf[8]; 
	  //
	  RW485 = 1;     //使能发送
	  ComTBufHead=1;
	  Sio_Lth = 9;  
	  SBUF0   = ComTBuf[0];	 //启动串口发送  
	}
//********************************************

⌨️ 快捷键说明

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