CAN总线实验
- 格式:docx
- 大小:76.08 KB
- 文档页数:4
实验三 CAN总线实验
一.实验目的
学习基于SJA1000的CAN总线标准帧通信,实现2个CAN通信节点之间的数据通信。
二、验设备及器件
计算机(带串口) 一台
单片机实验仪 一台
三、实验内容
编写一段程序,实现CAN节点的初始化,能够2节点之间的数据收发,用本节点的I/O控制另一个节点的LED灯。
四、实验步骤
图3、SJA1000及82C250接口电路
1、将2块CAN实验板的CAN总线的CANH、CANL同名连接,通过杜邦线从单片机实验板上将电源接给CAN实验板。
2、编写程序分别下载到各自的CAN实验板上,用杜邦线将JP的P2.0接地控制另一块板子的LED灯。
五、实验预习要求
阅读关于CAN和CAN器件SJA1000的基本资料,具备CAN和CAN相关器件的基本知识,学习指导书的参考程序。
//CAN通信参考程序
#include
#define uchar unsigned char
#define uint unsigned int
#define time0 -10000
sfr WDT = 0xE1;
sfr AUX = 0x8E;
#define Raddr 1 //本机地址ID高8位
#define Taddr 2 //目标地址ID高8位
#define CAN_PORT P0 //CAN数据口
//CAN2.0B的BasicCAN模式 (标准帧模式)
#define CAN_CR 0 //控制
#define CAN_CMR 1 //命令
#define CAN_SR 2 //状态
#define CAN_IR 3 //中断
#define CAN_ACR 4 //验收
#define CAN_AMR 5 //屏蔽
#define CAN_BTR0 6 //时序0
#define CAN_BTR1 7 //时序1
#define CAN_OCR 8 //输出
#define CAN_TXB 10 //发送缓冲
#define CAN_RXB 20 //接收缓冲
#define CAN_CDR 31 //分频
uchar pdata CAN[32] _at_(0); //定位CAN寄存器地址
sbit LED2 = P2^5;
sbit LED1 = P2^6;
sbit KEY = P2^0;
bit CANBUS,sta,LED,RUN;
uchar tim;
uchar idata TXB[10],RXB[10];
void delay(uint p)
{
while(p--);
}
void CAN_SEND() /*发送数据部分*/
{
uchar i,p;
p=CAN[CAN_SR];
if (p&0x04) {
p=CAN_TXB; /*p指向发送缓存首址*/
for(i=0;i<10;i++) CAN[p++]=TXB[i];
CAN[CAN_CMR]=0x01; /*请求发送*/
}
}
void CAN_INT() interrupt 0 using 1/*接收中断*/
{
uchar i,p;
p=CAN[CAN_IR];
if(p&0x01)
{
p=CAN_RXB;
for(i=0;i<10;i++)
{
RXB[i]=CAN[p++];
}
CAN[CAN_CMR]=0x04; /*释放接收缓存*/
CANBUS=1;
}
}
void CAN_INI() /*初始化部分*/
{
CAN[CAN_CR]=0x01;
CAN[CAN_ACR]=Raddr;
CAN[CAN_AMR]=Raddr;
CAN[CAN_BTR0]=0x07;
CAN[CAN_BTR1]=0xff;
CAN[CAN_OCR]=0x1A;
CAN[CAN_CR]=0x02;
}
void timer0() interrupt 1 using 3
{
TH0=time0>>8;TL0=time0;
if(tim<250) tim++;
}
void main()
{
AUX=2; WDT=0x34;
IE=0x83; IT0=1; TMOD=0x21; TH0=time0>>8; TL0=time0; TR0=1;
LED1=0;LED2=0;
delay(5000);
LED1=1;LED2=1;KEY=1;
CAN_INI();
CANBUS=0;
while(1)
{
WDT=0x34;
if(tim>10)
{
tim=0;
TXB[0]=Taddr;
TXB[1]=1;
if(!KEY) TXB[2]=0; else TXB[2]=1;
CAN_SEND();
}
if(CANBUS)
{
CANBUS=0;
LED1=!LED1;
if(RXB[2]==0) LED2=0; else LED2=1;
}
}
}