lin_main.c

来自「这是本人根据LIN总线的协议自己写的一个主机和从机的程序」· C语言 代码 · 共 133 行

C
133
字号
#include "INCLUDE.H"
//#include <reg52.h>
//#include "LIN_HARDWARE.C"
//#include "LIN_LLC.C"
//#include "LIN_MANAGE.C"
//#include "LIN_API.C"
/* Private typedef ----------定义主机和从机的状态机-------------------------------------------
typedef enum
{
  Idle,
  send_break,
//  VerifyBreak,
  send_synch,
//  VerifSynch,
  send_ID,
} LIN_MASTER_state;							 */

typedef enum
{
  Init,
  send_data,
  rece_data
} LIN_SLAVE_state;									  

LIN_SLAVE_state  LIN_SLAVE = Init; 

typedef enum
{
  task1,
  task2,
  task3
} TASK_schedule_state;	


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

//定义是否可以执行从机程序
bit lin_en=0;
bit task_en=0;

uchar i;
void LIN_Init()
{
	task_en=1;
}

void main()
{
	LIN_Init();
	while(1)
	{	//任务调度
		if(task_en)
		{
			delay_ms(100);
			switch(TASK_schedule)
			{
				case task1:
					ID=SLAVE1_ID;
					LIN_SLAVE = rece_data; 
					TASK_schedule=task2;
					lin_en=1;
					break;
	
				case task2:
					ID=SLAVE2_ID;
					LIN_SLAVE = send_data; 
					TASK_schedule=task3;
					lin_en=1;
					break;
	
				case task3:
					ID=SLAVE3_ID;
					LIN_SLAVE = send_data; 
					TASK_schedule=task1;
					lin_en=1;
					break;
	
			}
			task_en=0;		
		}


		if(lin_en)
		{
			SendSynchBreak();		 //主机任务
			SendSynch();
			SendID(ID);
			num=JudgeLength(ID);

			switch(LIN_SLAVE)  		 //从机任务
			{   
				case Init:
					LIN_SLAVE = Init;
					break; 
			   			   
		        case send_data:	 //发送数据									
			  		SendData(send_datas,num);
					check_sum=checksum(send_datas,num);
					SendChecksum(check_sum);
					LIN_SLAVE = Init; 
					lin_en=0;	
					task_en=1;
					break;
		
		        case  rece_data: //接收数据
					overtime_flag=0;
					SetTime(5000);
					ReceiveData(rece_datas,num);
					check_sum=ReceChecksum();					
					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;
					}
					lin_en=0;	
					task_en=1;						 										
					ET0=0;
					time_n=0;		 
			 	    break;  	
		    }				
		}	
	}
}

⌨️ 快捷键说明

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