CAN现场总线.rar
源代码在线查看: 01-双验收滤波(节点二).c
// 00-双验收滤波(节点二).c
//
// akuei2上 20-10-09
#include "reg52.h"
#include "sja1000.h"
#include "can.h"
#define uchar unsigned char
//i0脚定义
sbit SJACS=P2^0;
sbit SJARST=P2^3;
//数码管码,与位选码
unsigned char code Led_Code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
unsigned char code Led_Select[]={0xef,0xdf,0xbf,0x7f};
//接收代码变量,接收屏蔽变量,发送缓冲变量,接收缓冲变量,发送数据,接收数据,点击变量
uchar ACR[4],AMR[4],TXD_Buffer[13],RXD_Buffer[13],TXD_Data,RXD_Data,Click;
//函数声明
void Display(void);
//1毫秒延迟函数
void Delay_1ms(int x)
{
int j;
for(;x>0;x--)
for(j=125;j>0;j--);
}
//50微秒延迟函数
void Delay_50us(int t)
{
uchar j;
t--;
for(;t>0;t--)
for(j=19;j>0;j--);
}
//变量初始化
void Init_Data(void)
{
int i;
ACR[0]=ACR[2]='C'; //源节点地址为 C1xx
ACR[1]=ACR[3]='2';
AMR[0]=AMR[2]=0x00; //全部标示符屏蔽
AMR[1]=AMR[3]=0x00;
TXD_Buffer[0]=0x88; //EFF格式,数据长度8 的 TX帧信息
TXD_Buffer[1]='C'; //目的标示符为CAN1
TXD_Buffer[2]='1';
TXD_Buffer[3]='x';
TXD_Buffer[4]='x';
TXD_Buffer[5]=TXD_Data; //发送数据
TXD_Buffer[6]=0x00;
TXD_Buffer[7]=0x00;
TXD_Buffer[8]=0x00;
TXD_Buffer[9]=0x00;
TXD_Buffer[10]=0x00;
TXD_Buffer[11]=0x00;
TXD_Buffer[12]=0x00;
for(i=0;i {
RXD_Buffer[i]=0x00;
}
TXD_Data=0x00; //发送数据初始化
RXD_Data=0x00; //接收数据初始化
}
//CPU初始化
void Init_CPU(void)
{
SJACS=1; // 使片选无效
SJARST=1; // 硬件复位无效
IT0=1; // 外部中断0为电平触发方式
IT1=0; // 外部中断1为跳电沿触发方式
EX0=1; // 外部中断0使能
EX1=1; // 外部中断1使能
EA=1; // 全局中断使能
}
//主函数
void main(void)
{
Init_Data();
Init_CPU();
Init_CAN();
while(1)
{
Display();
}
}
//数码管显示函数
void Display(void)
{
int Digit[4],i;
Digit[3]=TXD_Data/10; //第一个数码管显示发送源十位
Digit[2]=TXD_Data%10; //第二个数码管显示发送源个位
Digit[1]=RXD_Data/10; //第三个数码管显示接收源十位
Digit[0]=RXD_Data%10; //第四个数码管显示接受原个位
for(i=0;i {
P0=Led_Code[Digit[3-i]]; //送数码管码
P2=Led_Select[i]; //送位选码
Delay_50us(20); //延迟1微秒
}
}
//外部中断0函数-点击中断
void Ir_EX0(void) interrupt 0
{
Delay_1ms(10); //软件消抖
EA=0; //关闭全局使能
EX0=0; //外部中断0使无效
Click++;
if(Click>=100) Click=0;
TXD_Data=Click; //发送数据赋值
TXD_Buffer[5]=TXD_Data;
CAN_TXD(); //调用发送函数
EX0=1; //外部中断0使能
EA=1; //全局中断使能
}
//外部中断1函数-RXFIFO饱和中断
void Ir_EX1(void) interrupt 2
{
EA=0; //关闭全局使能
EX1=0; //外部中断1使无效
CAN_RXD(); //调用接收函数
RXD_Data=RXD_Buffer[5]; //接收数据变量赋值
EX1=1; //外部中断1使能
EA=1; //全局中断使能
}