📄 demo.c
字号:
#include <absacc.h>
#include <reg51.h>
#define TIMES 28
#define CR_CAN XBYTE[0x7f00]
#define CMR_CAN XBYTE[0x7f01]
#define SR_CAN XBYTE[0x7f02]
#define IR_CAN XBYTE[0x7f03]
#define ACR_CAN XBYTE[0x7f04]
#define AMR_CAN XBYTE[0x7f05]
#define BTR0_CAN XBYTE[0x7f06]
#define BTR1_CAN XBYTE[0x7f07]
#define OCR_CAN XBYTE[0x7f08]
#define uchar unsigned char
#define ulong unsigned long
sbit G0 =P3^0;
sbit G1 =P3^1;
sbit G2 =P3^4;
sbit G3 =P3^5;
uchar dispbuf[4],senddata[8],recbuf[8],ID,showbit,N,KEY;
bit timeflag;
unsigned char code TAB[10]=
{0x3f,0x06,0x5B,0x4F,0x66, //0,1,2,3,4
0x6D,0x7D,0x07,0x7F,0x6F}; //5,6,7,8,9
void send(void);
void delay(unsigned int k);
unsigned char getkey();
main()
{
/*********initiate 89C51***********/
TMOD=0x11;
TCON=0x54;
IE=0x8f;
/*********** get the local ID ***********/
ID=P2;
ID=255-ID; //invert ID
ID=ID&0x0f;
dispbuf[0]=0;
dispbuf[1]=0;
dispbuf[2]=ID/10; //show the local ID first
dispbuf[3]=ID%10;
/********** initiate the SJA1000*********/
CR_CAN=1;
ACR_CAN=ID;
AMR_CAN=0x00;
BTR0_CAN=0x67;
BTR1_CAN=0x2f; //baudrate 10Kbps
OCR_CAN=0xDA; //output mode : push_pull
CR_CAN=0x62;
CMR_CAN=0x60;
/***********************************************/
while(1)
{
while(SR_CAN&0x80) CR_CAN=0x72; //clear bus_off
if(timeflag) //send a message every 2 second
{
timeflag=0;
if(ID!=0) send();
}
if(getkey()!=0x70) //show the key value
{
delay(5000);
dispbuf[2]=0;
dispbuf[3]=KEY;
}
}
}
void delay(unsigned int k)
{
for(;k>0;k--);
}
void send()
{
uchar i,sum;
uchar xdata *bufpt;
senddata[0]=ID; //local ID
sum=0;
for(i=1;i<6;i++)
{
if(senddata[i]>=255) senddata[i]=0;
senddata[i]++;
sum=sum+senddata[i];
}
senddata[7]=sum; //for parity check
bufpt=0x7f02;
if(((*bufpt)&0x04)==0x04)
{
bufpt=0x7f0A;
*bufpt++=0x00; //destination ID
*bufpt++=0x08; //message length 8 byte
for(i=0;i<8;i++) *bufpt++=senddata[i];
CMR_CAN=0x01; //transfer
}
}
unsigned char getkey()
{
unsigned char key;
key=P2;
key=key&0x70;
if(key==0x50) KEY=0;
if(key==0x60) KEY=1;
if(key==0x30) KEY=2;
return key;
}
/********* receive interrupt ***********/
void canint(void) interrupt 0
{
uchar xdata *message;
uchar i,j;
EA=0;
message=0x7f03;
j=*message; //IR
if(j&0x01) //if receive interrupt
{
message=0x7f16;
for(i=0;i<8;i++) recbuf[i]=*message++;
}
else
CMR_CAN=0x08;
dispbuf[2]=recbuf[0]/10;
dispbuf[3]=recbuf[0]%10; //show the message soure ID
CMR_CAN=0x04;
EA=1;
}
/********** show scan *********/
timer0() interrupt 1
{
TL0=0x00;
TH0=0xfa;
if(showbit>=4) showbit=0;
if(showbit==0)
{
G0=1;G1=0;G2=0;G3=0;
P1=TAB[dispbuf[showbit]]|0x80;
}
if(showbit==3)
{
G0=0;G1=1;G2=0;G3=0;
P1=TAB[dispbuf[showbit]];
}
if(showbit==2)
{
G0=0;G1=0;G2=1;G3=0;
P1=TAB[dispbuf[showbit]];
}
if(showbit==1)
{
G0=0;G1=0;G2=0;G3=1;
P1=TAB[dispbuf[showbit]];
}
showbit++;
}
timer1() interrupt 3
{
TL1=0;
TH1=0;
N++;
if(N>TIMES)
{
N=0;
timeflag=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -