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