📄 can.c
字号:
///////// canA 接收和发送调试程序 CANB 有问题*////////////
#include <absacc.h>
#include <reg51.h>
#define TIMES 28
#define CR_ACAN XBYTE[0xfe00] //控制寄存器
#define CMR_ACAN XBYTE[0xfe01] //命令寄存器
#define SR_ACAN XBYTE[0xfe02] //状态寄存器
#define IR_ACAN XBYTE[0xfe03] //中断寄存器
#define ACR_ACAN XBYTE[0xfe04] //验收代码寄存器
#define AMR_ACAN XBYTE[0xfe05] //验收屏蔽寄存器
#define BTR0_ACAN XBYTE[0xfe06] //总线定时寄存器0
#define BTR1_ACAN XBYTE[0xfe07] //总线定时寄存器1
#define OCR_ACAN XBYTE[0xfe08] //输出控制寄存器
#define P8279_CR ((unsigned char xdata *)0xdfff)
#define P8279_D ((unsigned char xdata *)0xd7ff)
unsigned char code TAB[20]=
{
0xF3,0x60,0xB5,0xF4,0x66, //0,1,2,3,4
0xD6,0xD7,0x70,0xF7,0xF6, //5,6,7,8,9
0x00,0x04,0x93,0xE5,0x97, // ,-,C,D,E
0x17,0x20,0x73,0x40,0x00, //F, ,P,-
};
unsigned char temp[4]={0,0,0,0},light;
sbit P10=P1^0;
sbit 8279RST=P1^1;
sbit P13=P1^3;
sbit P15=P1^5;
sbit EOC=P1^2;
sbit P20=P2^0;
sbit P22=P2^2;
sbit P13=P1^3;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P32=P3^2;
bit sendok;
unsigned char i,j;
unsigned char xdata *bufpt;
void init_8279()
{
P8279_CR[0]=0xD0;
while(P8279_CR[0]&0x80);
P8279_CR[0]=0x01;
P8279_CR[0]=0x2A;
P8279_CR[0]=0x80;
P8279_CR[0]=0xA0;
}
void init_ACAN()
{
CR_ACAN=0x01;
ACR_ACAN=0x01;
AMR_ACAN=0x00;
BTR0_ACAN=0x67;
BTR1_ACAN=0x2f; //波特率 10Kbps
OCR_ACAN=0xDA; //正常输出模式,推挽式
CR_ACAN=0x62; //接收中断使能
CMR_ACAN=0x60; //SJA1000正常工作模式
IT1=1;
}
/*
void ACANsend()
{
if(SR_ACAN&0x80) CR_ACAN=0x72;
P10=1;
bufpt=0xfe02; //状态寄存器地址
if(((*bufpt)&0x04)==0x04) //检查SJA上次是否发送完毕
{
bufpt=0xfe0A; //写入SJA的发送缓存
*bufpt++=0x01; //destination ID 最高级别
*bufpt++=0x04;
for(i=0;i<4;i++) *bufpt++=i;
CMR_ACAN=0x01; //发送
}
P12=0;
}
*/
main()
{ //unsigned int k;
P15=0;
TMOD=0x01;
EA=1;
ET0=1;
TH0=1000/256; //载入计数初值,每1ms定时器中断一次
TL0=1000%256;
TR0=1;
P16=0; //8279RST=0
P10=0;
light=0;
init_8279();
P10=1; //CAN RESET
init_ACAN();
P8279_CR[0]=0x80;
P8279_D[0]=TAB[0];
P8279_CR[0]=0x81;
P8279_D[0]=TAB[0];
P8279_CR[0]=0x82;
P8279_D[0]=TAB[0];
P8279_CR[0]=0x83;
P8279_D[0]=TAB[0];
IE=0x87;
for(i=0;i<10;i++);
//ACANsend(); //发送数据(0,1,2,3)
while(1==1);
}
void ACANint(void) interrupt 0 using 1
{
unsigned char xdata *message;
unsigned char i,j;
EA=0;
message=0xfe03;
j=*message; // 查询IR寄存器
P10=~P10;
if(j&0x01) // 如果有数据则接收
{
message=0xfe16;
for(i=0;i<4;i++)
{
temp[i]=*message++;
P8279_CR[0]=0x80+i;
P8279_D[0]=TAB[temp[i]];
}
light=1; //收到数据
}
else
CMR_ACAN=0x08; //否则清除数据接收缓冲区
CMR_ACAN=0x04; //释放数据接收缓冲区
EA=1;
P12=0;
}
void flash() interrupt 1 using 1
{
j++;
if(j>=5)
{
j=0;
P13=!P13;
}
TH0=1000/256; //载入计数初值,每1ms定时器中断一次
TL0=1000%256;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -