#include<REG52.H> //单片机头文件 #include<SJA1000_nnyt.H> //SJA存储器定义头文件 #include<SJA1000_nnyt.C> //SJA子程序文件 /*************************函数声明*******************************************/ void Init_T0(void); //初始化单片机T0 void Sja_1000_Init(void); //初始化SJA //******************************************************************* bit flag_sec; //发送命令标志 unsigned char data send_data[10],rcv_data[10];//发送和接收数组 unsigned char sec_data,second; //定时器记数变量,发送数据变量 unsigned char data Tmod_data; //定时器T0工作方式变量 unsigned char bdata flag_init; //中断寄存器数据保存变量 sbit rcv_flag=flag_init^0; //接收中断标志 sbit err_flag=flag_init^2; //错误中断标志 sbit P2_0=P2^0; sbit P3_4=P3^4; sbit LED=P3^5; //指示灯
//*********************************************************** void ex0_int(void) interrupt 0 using 1 //外部中断0 { SJA_BCANAdr=REG_INTERRUPT; //指针指向中断寄存器 flag_init=*SJA_BCANAdr; //保持中断寄存器值 } //*********************************************************** void T0_int(void) interrupt 1 using 2 //定时器T0中断服务子程序 { TR0=0; //关闭定时器T0 sec_data--; //秒计时变量减一 if(sec_data==0) //2.25秒时间到了吗? { sec_data=0x50; //重新赋值 TH0=0x80; TL0=0x60; flag_sec=1; //设置标志位 second++; //发送的数据加一 } TR0=1; //启动定时器T0 } //************************************************************ void Init_T0(void) //初始化定时器0 { Tmod_data=TMOD; Tmod_data&=0xf0; Tmod_data|=0x01; TMOD=Tmod_data; //定时器T0工作方式设置 TH0=0x80; TL0=0x60; //定时器T0初值设置 TR0=1; //开放定时器T0 sec_data=0x20; //记数值设置 second=0x00; //发送数据初始化清零 } //*********************************************************** void Sja_1000_Init(void) { BCAN_ENTER_RETMODEL(); //进入复位 BCAN_SET_BANDRATE(0x0b); //800K BCAN_SET_OBJECT(0xaa,0xff); //设置地址ID:557 BCAN_SET_OUTCLK(0xaa,0x48); //设置输出方式,禁止COLOCKOUT输出 BCAN_QUIT_RETMODEL(); //退出复位模式 SJA_BCANAdr=REG_CONTROL; //地址指针指向控制寄存器 *SJA_BCANAdr|=0x1E; //开放错误接收发送中断 }
//******************************************************************* void main(void) { P2_0=0; //SJA1000退出硬件复位模式 Sja_1000_Init(); //initialize Sja100 Init_T0(); //initialize T0 PX0=1; //外部中断0高优先级 IT0=1; //开放T0中断 EX0=1; //外部中断0开放 ET0=1; //开放外部中断0 EA=1; //开放全局中断 P3_4=0; //点亮指示灯 flag_init=0x00; //变量清零
while(1) { if(rcv_flag) //if there is receive interrupt { rcv_flag=0; //接收标志位清零 BCAN_DATA_RECEIVE(rcv_data); //接收数据 BCAN_CMD_PRG(0x04); //释放接收缓冲区 } if(flag_sec) { flag_sec=0; //发送位清零 send_data[0]=0xAA; //发送数据到ID为550的节点 send_data[1]=0x08; //发送数据帧,8个字节长度 send_data[2]=0x05; //第一个字节内容为数据05H send_data[3]=second; //第二个字节内容为变量值 BCAN_DATA_WRITE(send_data); //发送数据 BCAN_CMD_PRG(0x01); //置位发送请求位 LED=~LED; } if(err_flag) //错误中断 { err_flag=0; //错误标志位清零 Sja_1000_Init(); //初始化SJA } } }
CAN开发板使用说明
1、 实验板分为主节点和从节点;CAN通讯波特率设置为800K;最高可设置为1M,用户根据自己的需要进行设置. 2、 从节点每隔2.25秒钟向主节点发送一组8个字节的数据,数据格式为:05H i 00H 00H 00H 00H 00H 00H ;其中变量I的范围是00H~FFH,他随着每发送一次数据而累加递增1;从节点指示灯1表示实验板工作正常,指示灯2以0.44Hz的频率闪烁,表示发送数据正常. 3、 主节点的ID为550,每当收到从节点发送的数据后,主节点便以9.6K波特率把收到的数据通过232串口发送给计算机,计算机上安装的用户界面(串口调试助手),可以实时显示接收到的数据,此数据用户可以存储于计算机上;主节点指示灯1表示实验板工作正常,指示灯2以1Hz的频率闪烁(如果是调用c语言程序,则以0.44Hz频率闪烁),表示接收和串口发送数据正常. 4、 单片机为AT89c51,适用于实验板(电源没有隔离); 主控单片机为ADuC812,适用于工程应用(电源隔离):ADuC812通过自带的12位精度的A/D采集传感器信号后,将采集结果通过can总线传输到“主控节点”,主控节点将数据通过串口传输给计算机;指示灯显示状态;可以通过串口给主控节点发送指令,来完成对某一节点的控制;通过串口下载程序到单片机ADuC812(详见ADuC812用户手册),可以不用编程器; 5、 串口调试助手的页面设置详见下图所示:
用户严格按照上图所示进行设置; 6、使用CAN开发板的用户请务必注意以下事项: A、开发板的供电电压为12V,插头处有+12V和GND标志; B、SJA1000的地址为0X7E00; C、注意P2_0=0;以便使SJA1000退出复位状态; D、主节点的地址为550,通讯波特率为800K; E、RS232串口三根线说明:白色线为地线;红色线为发送线;黑色线为接收线; 感谢您选用CAN开发板!真诚的希望您在短时间内掌握CAN的基本知识,如有任何问题请发至nnyt@tom.com,我将尽快给您答复;
本人同时提供can实验开发板给初学者 1 CAN控制器为SJA1000,驱动器为TJA1050,电源隔离; 2 提供详尽的源程序,可根据用户需求编写程序 联系我:13671387011(短信联系,QQ详谈) QQ: 531706356 |