📄 lin_main.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 + -