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

📄 main.c

📁 can sja1000 从节点 已经通过调试
💻 C
字号:


/*================================================================================*=
 *文 件 名:main.c
 *描    述:CAN网络中的从节点程序,包括时钟同步信息接收函数,握手函数,
 			利用定时计数器T0中断,进行同步计数,中断信号来自主节点。
			每一次程序接收到主节点的同步信息时,中断一次,当中断次数到时,
			执行节点功能函数。
 *节点任务:点亮和熄灭LED灯
=*================================================================================*/
#include "reg52.h"
#include "can.h"


#define  MainID   (0xaa)
#define  MyID     (0xbb)
#define  SID2     (0xcc)
#define  SID3     (0xdd)
#define  SID4     (0xee)
#define  TimeOut  (50)			//同步节拍

sbit LED = P1^0;
								//JA1000 发送缓存区
tByte SendData[8] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
tByte RecvData[11];


void Sys_Iint();
void SendAsk(tByte const ID);
void GetMes(void);
void MyTask();

static unsigned char TimeTickCom;
static bit RecvTickTask;
static bit SendAskTask;
static bit SendMesTask;

void main()
{
 
	SJAInit(MyID);					//SJA初始化
	Sys_Iint();						//系统初始化
	while(1)
	{
		if(RecvTickTask)
		{
			GetMes();
			SendAsk(MyID);		//发送握手信号为我的ID
			TF0 = 1;			//T0中断,处理时钟同步
		}
		if(SendMesTask)
		{
			SendMesTask = 0;		//清除任务,保证不占用总线
			TimeTickCom = 0;		//清空同步计数器
			MyTask();				//节点功能
			RecvTickTask = 1;		//本节点任务完成,准备接受下一个同步信息
		}		
	}	
}

void Sys_Iint()
{
	ET0  = 1;
	EA   = 1;
	RecvTickTask = 1;				//多任务时用
}

void T0_ISR() interrupt 1 using 1
{
	if((TimeTickCom++) == TimeOut)	
	{
		SendMesTask = 1;			//同步时间到,发送数据
		RecvTickTask = 1;			//停止接受同步信息
		TF0 = 0;					//清除中断标志位	
	}
}

void SendAsk(tByte const ID)				//发送握手信号
{
	SendData[0] = ID;
	SJASendData(SendData,8,MainID,0xff,0x08);
}

void GetMes(void)
{
	while(SJARecvData(RecvData,4));	
}

void MyTask()
{
	LED = !LED;	
}

⌨️ 快捷键说明

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