📄 can1.c
字号:
#include "reg51.h"
#include "absacc.h"
#include "stdio.h"
#define uchar unsigned char
#define SJA_BaseAdr 0X7f00 //定义SJA1000的基址
#define CAN_MODE XBYTE[SJA_BaseAdr+0X00]
#define CAN_CMD XBYTE[SJA_BaseAdr+0X01]
#define CAN_SR XBYTE[SJA_BaseAdr+0X02]
#define CAN_IR XBYTE[SJA_BaseAdr+0X03]
#define CAN_IER XBYTE[SJA_BaseAdr+0X04]
#define CAN_BTR0 XBYTE[SJA_BaseAdr+0X06] //05保留
#define CAN_BTR1 XBYTE[SJA_BaseAdr+0X07]
#define CAN_OCR XBYTE[SJA_BaseAdr+0X08]
#define CAN_TEST XBYTE[SJA_BaseAdr+0X09]
#define CAN_ALC XBYTE[SJA_BaseAdr+0X0b] //0a保留
#define CAN_ECC XBYTE[SJA_BaseAdr+0X0c]
#define CAN_EMLR XBYTE[SJA_BaseAdr+0X0d]
#define CAN_RXERR XBYTE[SJA_BaseAdr+0X0e]
#define CAN_TXERR XBYTE[SJA_BaseAdr+0X0f]
//发送缓冲区寄存器定义-----在复位模式下
#define CAN_ACR0 XBYTE[SJA_BaseAdr+0X10]
#define CAN_ACR1 XBYTE[SJA_BaseAdr+0X11]
#define CAN_ACR2 XBYTE[SJA_BaseAdr+0X12]
#define CAN_ACR3 XBYTE[SJA_BaseAdr+0X13]
#define CAN_AMR0 XBYTE[SJA_BaseAdr+0X14]
#define CAN_AMR1 XBYTE[SJA_BaseAdr+0X15]
#define CAN_AMR2 XBYTE[SJA_BaseAdr+0X16]
#define CAN_AMR3 XBYTE[SJA_BaseAdr+0X17]
#define CAN_TxBuffer0 XBYTE[SJA_BaseAdr+0X10]
#define CAN_TxBuffer1 XBYTE[SJA_BaseAdr+0X11]
#define CAN_TxBuffer2 XBYTE[SJA_BaseAdr+0X12]
#define CAN_TxBuffer3 XBYTE[SJA_BaseAdr+0X13]
#define CAN_TxBuffer4 XBYTE[SJA_BaseAdr+0X14]
#define CAN_TxBuffer5 XBYTE[SJA_BaseAdr+0X15]
#define CAN_TxBuffer6 XBYTE[SJA_BaseAdr+0X16]
#define CAN_TxBuffer7 XBYTE[SJA_BaseAdr+0X17]
#define CAN_TxBuffer8 XBYTE[SJA_BaseAdr+0X18]
#define CAN_TxBuffer9 XBYTE[SJA_BaseAdr+0X19]
#define CAN_TxBuffer10 XBYTE[SJA_BaseAdr+0X1a]
#define CAN_TxBuffer11 XBYTE[SJA_BaseAdr+0X1b]
#define CAN_TxBuffer12 XBYTE[SJA_BaseAdr+0X1c]
#define CAN_RxBuffer0 XBYTE[SJA_BaseAdr+0X10]
#define CAN_RxBuffer1 XBYTE[SJA_BaseAdr+0X11]
#define CAN_RxBuffer2 XBYTE[SJA_BaseAdr+0X12]
#define CAN_RxBuffer3 XBYTE[SJA_BaseAdr+0X13]
#define CAN_RxBuffer4 XBYTE[SJA_BaseAdr+0X14]
#define CAN_RxBuffer5 XBYTE[SJA_BaseAdr+0X15]
#define CAN_RxBuffer6 XBYTE[SJA_BaseAdr+0X16]
#define CAN_RxBuffer7 XBYTE[SJA_BaseAdr+0X17]
#define CAN_RxBuffer8 XBYTE[SJA_BaseAdr+0X18]
#define CAN_RxBuffer9 XBYTE[SJA_BaseAdr+0X19]
#define CAN_RxBuffer10 XBYTE[SJA_BaseAdr+0X1a]
#define CAN_RxBuffer11 XBYTE[SJA_BaseAdr+0X1b]
#define CAN_RxBuffer12 XBYTE[SJA_BaseAdr+0X1c]
#define CAN_TxBufferR0 XBYTE[SJA_BaseAdr+0X60]
#define CAN_TxBufferR5 XBYTE[SJA_BaseAdr+0X65]
#define CAN_RBSA XBYTE[SJA_BaseAdr+0X1e]
#define CAN_CDR XBYTE[SJA_BaseAdr+0X1f]
unsigned char data send_data[13]={0x88,0xa0,0xa0,0xa0,0x80,0x01,0x02,
0x03,0x04,0xf0,0xff,0xfe,0xfd};
unsigned char data rcv_data[13];
void send_dataaa(void);
void can_init(void);
void rec_data(void);
sbit CAN_RET=P1^0;
sbit BELL=P3^5;
sbit k3=P3^4;
//***************************//
void Delay_ms(unsigned char k) //长软件延时
{
unsigned char n,m;
for(n=0;n<=k;n++)
for(m=0;m<=200;m++);
}
void can_init(void)
{
uchar ai;
ai = CAN_IR;
CAN_BTR0=0x43;
CAN_BTR1=0x1c;
do
{
CAN_MODE=CAN_MODE|0x09;
}while((CAN_MODE&0x09)==0x00); //复位模式
CAN_CDR=0xc8; //时钟分频寄存器,选择PeliCAN模式??88
CAN_IER=0xff; //中断使能寄存器
ai = CAN_IR;
CAN_ACR0=0xaa; //验收寄存器
CAN_ACR1=0x55;
CAN_ACR2=0xaa;
CAN_ACR3=0x55;
CAN_AMR0=0xff; //屏蔽寄存器
CAN_AMR1=0xff;
CAN_AMR2=0xff;
CAN_AMR3=0xff;
CAN_BTR0=0x40; //
CAN_BTR1=0x14; //20k
CAN_OCR=0x1a; //输出控制寄存器决定输出的不同模式??aa
CAN_RBSA=0x00; //RX 缓冲器起始地址寄存器
CAN_TXERR= 0x00; //发送错误接收器设置为0清除
ai=CAN_ECC; //清除错误代码捕捉寄存器,通过读清除
CAN_CMD=0x0c; /*清除数据溢出和释放接收缓冲器*/
/*
do
{
CAN_MODE=0x00;
}while((CAN_MODE&0x01)!=0x00);
*/
do
{
CAN_MODE=0x08;
}while((CAN_MODE&0x08)!=0x08); //???0x00
}
void send_dataaa(void)
{
do{;} //判断是否正在接收,正在接收则等待??TBS,TCS
while((CAN_SR&0x10)==0x10);
do{;}
while((CAN_SR&0x08)!=0x08); //判断上次发送是否完成,未完成则等待
do
{;}
while((CAN_SR&0x04)!=0x04); //判断发送缓冲区是否锁定,锁定则等待
CAN_TxBuffer0=send_data[0];
CAN_TxBuffer1=send_data[1];
CAN_TxBuffer2=send_data[2];
CAN_TxBuffer3=send_data[3];
CAN_TxBuffer4=send_data[4];
CAN_TxBuffer5=send_data[5];
CAN_TxBuffer6=send_data[6];
CAN_TxBuffer7=send_data[7];
CAN_TxBuffer8=send_data[8];
CAN_TxBuffer9=send_data[9];
CAN_TxBuffer10=send_data[10];
CAN_TxBuffer11=send_data[11];
CAN_TxBuffer12=send_data[12];
CAN_CMD=0x01;
}
//***********************************//
void rec_data(void)
{
rcv_data[0]=CAN_RxBuffer0;
rcv_data[1]=CAN_RxBuffer1;
rcv_data[2]=CAN_RxBuffer2;
rcv_data[3]=CAN_RxBuffer3;
rcv_data[4]=CAN_RxBuffer4;
rcv_data[5]=CAN_RxBuffer5;
rcv_data[6]=CAN_RxBuffer6;
rcv_data[7]=CAN_RxBuffer7;
rcv_data[8]=CAN_RxBuffer8;
rcv_data[9]=CAN_RxBuffer9;
rcv_data[10]=CAN_RxBuffer10;
rcv_data[11]=CAN_RxBuffer11;
rcv_data[12]=CAN_RxBuffer12;
}
//******************************************//
main()
{ //unsigned char i;
Delay_ms(100);
CAN_RET=0; //SJA1000复位
Delay_ms(100);
CAN_RET=1;
Delay_ms(100);
can_init();
while(1)
{
BELL=1; //关闭蜂鸣器
k3=1;
if(k3==0)
{
Delay_ms(100); //按键去抖经典值20毫秒
}
if(k3==0) //真的有按键按下
{
send_dataaa();
Delay_ms(10); //必要的小延时
// BELL=0;
Delay_ms(100);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -