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

📄 lin_main.c

📁 这是本人根据LIN总线的协议自己写的一个主机和从机的程序
💻 C
字号:
#include "INCLUDE.H"
//#include <reg52.h>
//#include "LIN_HARDWARE.C"
//#include "LIN_LLC.C"
//#include "LIN_MANAGE.C"
//#include "LIN_API.C"
/* Private typedef ----------定义主机和从机的状态机-------------------------------------------------*/
/* Private typedef ------------从机状态机-----------------------------------------------			  */

typedef enum   //LIN主节点接收状态	   
{
   rece_break,
   rece_synch,
   rece_ID,
   rece_data,// 等待数据态   
   send_data
} LIN_SLAVE_state;	

LIN_SLAVE_state  LIN_SLAVE = rece_break; 	//LIN总线接收初始化		
/***************************************************************************/

typedef enum
{
  task1,
  task2,
  task3
} TASK_schedule_state;	


TASK_schedule_state TASK_schedule=task1;
/*******************************************************************************/

//定义是否可以执行从机程序
bit slave_en=1;
bit task_en=1;
uchar i,SBUF_temp;
sbit p11=P1^1;

void LIN_Init()
{
	ET0=1;
	P1=0xff;
}

void main()
{
	LIN_Init();
	while (1)//while语句用来循环发送报文
   {	
		if(task_en) 
		{
			p11=~p11;
			task_en=0;
			slave_en=1;
		}   
		
		if(slave_en)
		{
	   		switch (LIN_SLAVE)
	        {
    		      case rece_break: //查询的方式去检查数据帧
					  while(1)
					  {	
//					  		SetTime(5000);		  //当需要在一段时间都没有接收到同步间隔信号时跳出这一次的等待
							if(ReceSynchBreak())
							{
								LIN_SLAVE = rece_synch;
								break;
							}
								
							else
							{
//								overtime_flag=0;
//								time_n=0;
//								TR0=0;
//								ET0=0;
								LIN_SLAVE = rece_break;
//								task_en=1;
								break;							
							}

					  }
//					  P2=0x00;  	  	  
					  LIN_SLAVE = rece_synch;
					  P2=0x03; 
				      break;

				  case	rece_synch:
				  		 if(ReceSynch()) LIN_SLAVE = rece_ID;
						 else LIN_SLAVE = rece_break;
						 break;	
						    				  
			      case rece_ID:	  	  
					    if(ReceID()==ID)
					    {
							LIN_SLAVE = send_data;//定义此从机是收还是发
							num=JudgeLength(ID);
//							P2=0x07;	
						}//判断是否是自己的ID
				
						else  LIN_SLAVE = rece_break;// WaitHeader				
						break;
			 				 										
			       case  rece_data: //接收数据
						overtime_flag=0;
						SetTime(5000);
						ReceiveData(rece_datas,num);
						check_sum=ReceChecksum();
						LIN_SLAVE=rece_break;						
						error_flag=JudgeChecksum(rece_datas,num);
						if(overtime_flag&error_flag)
						{
							ErrorCounter+=8;
						    UartSend(0x01);
							error_flag=0;
							overtime_flag=0;
							if(ErrorCounter>=64);
						}
						else 
						{
							ErrorCounter-=1;
						}					
						
						TR0=0;
						ET0=0;
						time_n=0;
						task_en=1;		 
				 	    break;  
				  
				  case send_data:
				  		SendData(send_datas,num);
						check_sum=checksum(send_datas,num);
						SendChecksum(check_sum);
						LIN_SLAVE = rece_break; 
						task_en=1;
						break;
	   	      } 		
		}
    		
  } 	
}

⌨️ 快捷键说明

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