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

📄 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 ----------定义主机和从机的状态机-------------------------------------------
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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -