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

📄 mcs51-rs232.c

📁 1,这是MCS51单片机串口通讯源程序,已经验证.
💻 C
字号:
#include <reg52.h>
#include <stdio.h>
#include <absacc.h>
#include <intrins.h>
#include <string.h>

#define uchar unsigned char 
#define uint unsigned int


//发送数据头固定字节
#define FIRST_DATA 10
#define SECOND_DATA 01
//发送数据格式
//长度+SECOND_DATA+FIRST_DATA+DATA+XOR
//收数据格式
//长度+FIRST_DATA+SECOND_DATA+DATA+XOR


bit rs232=0;//串口中断标志
unsigned char com_len=0;//串口接收数据长度
unsigned char rev_data[10];



//RS232通讯处理
void send(unsigned char *send_data,unsigned char length);
void rs232init(void);
unsigned char rs232_data_work(void);
void ExpInterruptInit(void);
void TimerAppMode(unsigned int delaytime);

//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//程序名:main()
//功能:  完成咪表整个工作流程
//输入:复位信号产生后接收中断向量并分别出各自所要作的工作
//输出:完成开关量所要求达到的功能
//说明:多复位到工作完成后,系统自动进入睡眠状态,低功耗工作
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
main(void)
{
	unsigned char i;
	rs232init();     ////    interrupts open
	ExpInterruptInit();
	rs232=0;  	
	TR1=1;	
 	ES =1;  	 	
	EA=1; 
	while(1)
	{   
		      
		if(rs232)//判断是否有数据接收
    		{	  
				    		
   			  	i=rs232_data_work();				
			  	rs232=0;	
			  		
		}		
		ES=1;
		TR1=1;
		EA=1;
	}
}
//==========================================================================================
//功能:外部中断初始化
//输入:无
//输出:无
//全局变量:
//=========================================================================================

void ExpInterruptInit(void)
{	
     	 EX1  = 1;           //外部中断1
       IT1=1;//如果被置成1:外部中断2为下降沿中断;置成0:低电平中断       
        
       EX0  = 1;           //外部中断0
       IT0=1;//如果被置成1:外部中断2为下降沿中断;置成0:低电平中断
       EA=1;
}
//==========================================================================================
//功能:串口初始化
//输入:无
//输出:无
//全局变量:Protocol_mode  串口设置选择
//=========================================================================================

void rs232init(void)
{	
        SCON=0x50;
        TMOD=0x21; 
  
      	//9600
   	    //PCON &= 0x7f; 	    
//		AUXR &= 0xbf;
        TH1=0xfd;//9600,p//b=2的smod次方*f/n*12*(256-th)11.0592Mhz
        TL1=0xfd;

	//19200
        //PCON |= 0x80;
        //TH1=0xFB;//19200,p//b=2的smod次方*f/n*12*(256-th)
        //TL1=0xFB;

        //32000
	//PCON |= 0x80;
	//TH1=0xFD;//32000,p//b=2的smod次方*f/(n*12*(256-th))
     //   TL1=0xFD;
        
        TR1=1;	
     	ES =1;  	 	
	EA=1;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`~
//按照协议接收数据
//输入:无
//输出:无
//返回:正确为1 ,错误为0
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`~
void rs232_int0() interrupt 4 using 3
{
    	unsigned char xdata i,temp;  
	unsigned int xdata dly;
	EA=0;
	rs232=1; /*rs232通讯状态*/      
  	
	dly=40000;//200ms
	while((RI!=1)&&(dly)) /*接收应答*/
	{
		dly=dly-1;
	}
	if(dly==0)
	{
		rs232=0;
		TR1=1;	
     	ES =1;  	 	
		EA=1;
		return;
	}
	RI=0; 
	com_len=SBUF;//接收长度
	rev_data[0]=com_len;    // LEN for receive data
              	
    	for(i=1;i<com_len;i++)
    	{
		dly=40000;//200ms
		while((RI!=1)&&(dly)) /*接收应答*/
		{
			dly=dly-1;
		}
		if(dly==0)
		{
			rs232=0;
			TR1=1;	
     		ES =1;  	 	
			EA=1;
			return;
		}
		RI=0;
	    	temp=SBUF;
        	rev_data[i]=temp;
    }    
    //temp=com_len-1;
    //for(i=0;i<temp; i++) all = all^Send_rece[i];//计算异或值
    //if(all != Send_rece[temp])  return 0;//数据报逻辑和检验,测试时屏蔽	
    //com_len=Rece_PC;
    //com_len=com_len-5;
    TR1=1;	
 	ES =1;  	 	
	EA=1;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`~
//数据回送到PC端
//输入:数据长度
///输出:无
//返回:无 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`~
void send(unsigned char *send_data,unsigned char length)
{
    unsigned char  i,all;	
    all=0;	
    rs232init();
	EA=0;
    //长度
    i=length+4;
	SBUF=length+4;	   
        while(TI==0);
				TI=0;	   
    		all=all^i;//计算校验值
	//固定代码1
	i=SECOND_DATA;
	SBUF=SECOND_DATA;	   
        while(TI==0);
				TI=0;	   
    		all=all^i;//计算校验值
	//固定代码2
	i=FIRST_DATA;
	SBUF=SECOND_DATA;	   
        while(TI==0);
				TI=0;	   
    		all=all^i;//计算校验值
    //数据
    for(i=0;i<length-1;i++)
    {            
        SBUF=send_data[i];	   
        while(TI==0);
				TI=0;	   
    		all=all^send_data[i];//计算校验值
    }
   
    SBUF=all;//发送校验值	
    while(TI==0);
    TI=0;    	 	
	EA=1;    
}
////////////////////////////////////////////////////////////////////////////////
//! \fn void TimerAppMode(unsigned int delaytime) 
//! \brief Sets many kind delay time application
//! \fntype Function
//! \param[in] delaytime -delay many time
//! \param[in] no
//! \param[in] no
//! \param[out] no
//! \param[out] no
//! \retval SUCCESS No error
////////////////////////////////////////////////////////////////////////////////
void TimerAppMode(unsigned int delaytime)
{
    unsigned int i,j;
		for(i=0;i<delaytime;i++)
		{
			for(j=0;j<200;j++);
		}

}	
////////////////////////////////////////////////////////////////////////////////
//! \fn void TimerAppMode(unsigned int delaytime) 
//! \brief Sets many kind delay time application
//! \fntype Function
//! \param[in] delaytime -delay many time
//! \param[in] no
//! \param[in] no
//! \param[out] no
//! \param[out] no
//! \retval SUCCESS No error
////////////////////////////////////////////////////////////////////////////////
unsigned char rs232_data_work(void)
{
      
      unsigned char i,test[10],led_num;
	   	for(i=0;i<10;i++) test[i]=i*2;  
	  
	  	switch(rev_data[3])
	  	{
	  		case 0: 				
					break;			
		    case 4: 
					send(test,10);
					break;

        case 5: 
				//send(test,10);
				for(led_num=0;led_num<5;led_num++)
				{
					    P0=0X55;
	        		TimerAppMode(500);
	        		P0=0XAA;
	        		TimerAppMode(500);
	        		P0=0XFF;
	        		TimerAppMode(500);
				}
				break;
		}
		return 0;
}	

⌨️ 快捷键说明

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