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