单片机之串口通信

#include "reg52.h"
#include <string.h>

unsigned char idata RevBuffer[30];
bit CmdValid;	   

void iccardcode()
{	     
  	unsigned char cmd;			 	
	cmd = RevBuffer[0];//获取命令
	switch(cmd)
 	{
		case 1:        //判断命令
			P1=0XFB;
			break;			
		case 2:        //判断命令			        
			 P1=0XF7;
			 break;			
		case 3:        //判断命令
			P1=0XF0;			
			break;	
	}
}
/////////////////////////////////////////////////////////////////////
//系统初始化
/////////////////////////////////////////////////////////////////////
void InitializeSystem()
{
    P0 = 0xFF; 
	P1 = 0x7F; 
	P3 = 0xFF;
		
    PCON = 0x80;       //设置波特率加倍    此时波特率为19200bps          
    SCON = 0x70;                 
    TMOD = 0x20;       //定时器1作为波特率发生器;

	TH1   = 0xfd;	  // 11.0592M晶振 在波特率不加倍情况:9600pbs
			//	            波特率 加 倍情况:19200bps
	TL1   = TH1;
	TR1   = 1;        // 启动定时器T1   即波特率发生器

					  
	EA=1;			  //开总中断
 	ES = 1;    		  //开串口中断
	CmdValid=0; 	  //设置接收消息标记

}

/////////////////////////////////////////////////////////////////////
//用T2做延时子程序
/////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////
// 接收和发送中断
///////////////////////////////////////////////////////////////////////
void isr_UART(void) interrupt 4 using 1
{
    unsigned char len, i;
  	unsigned int j=0;
  	
  	/*********************************************
	 //把接收到的第一个字符作为数 据 的 长度len, //
	 //在短时间内再连续发送len个字节赋给RevBuffer //
	 //加入最后i的值等于len的值,说明接收数据正确 //
	 **********************************************/
	
	if(RI)
	{		
		len=SBUF;                
		RI=0;	
		for(i=0;i<len;i++)
		{
			while(!RI)
			{
				j++;
				if(j>1000)
				{
				    break;
				}
			}
			if(j<1000)
			{
				RevBuffer[i]=SBUF;
				RI=0;
				j=0;
			}
			else
			{
			    break;
			}
		}
		if(i==len)
		{
			CmdValid=1;
			P1=0X00;
		}
	}

}



  void main( )
{    

     InitializeSystem( );
    while (1)
    {	
 	    if (CmdValid)
	    {
		    CmdValid = 0;
		    if(RevBuffer[0]==0x11)	    //判断命令
		    {
		      P1=0XFE;
		    }
	    	else if(RevBuffer[0]==0x13) //判断命令
	    	{
    			
	    	  P1=0XFD;
	    	}
       		else
    		{
	            iccardcode();
  
    		}
	     }
	 }
}

猜你喜欢

转载自liuzongming.iteye.com/blog/1941130