📄 test_big.c
字号:
#include <absacc.h>
#include <reg51.h>
#define TIMES 28
#define CR_CAN XBYTE[0x3f00]
#define CMR_CAN XBYTE[0x3f01]
#define SR_CAN XBYTE[0x3f02]
#define IR_CAN XBYTE[0x3f03]
#define ACR_CAN XBYTE[0x3f04]
#define AMR_CAN XBYTE[0x3f05]
#define BTR0_CAN XBYTE[0x3f06]
#define BTR1_CAN XBYTE[0x3f07]
#define OCR_CAN XBYTE[0x3f08]
#define P8279_CR XBYTE[0x5fff]
#define P8279_D XBYTE[0x5eff]
#define uchar unsigned char
unsigned char code TAB[31]=
{0xF3,0x60,0xB5,0xF4,0x66, //0,1,2,3,4
0xD6,0xD7,0x70,0xF7,0xF6}; //5,6,7,8,9
sbit WDOG=P3^4;
bit recflag,timeflag,changeflag;
unsigned char dispnum[8],N;
unsigned char getkey();
void delay(unsigned int k);
void init_8279();
void transfer(unsigned char i);
uchar sum,ID;
unsigned char trans[8];
unsigned char recbuf[8];
unsigned char showmask[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char CURRENT_1,CURRENT_2,SENSOR_ERROR,FLOAT_ERROR,STATUS_WORD;
main()
{
unsigned char i,j,k;
unsigned char add;
uchar xdata *bufpt;
/***** get the local ID*******/
ID=P1;
ID=255-ID;
ID=ID&0x3f;
/*****init sja1000****/
CR_CAN=1; //reset
ACR_CAN=ID; //local ID
AMR_CAN=0x00; //no mask
BTR0_CAN=0x67;
BTR1_CAN=0x2F; //baudrate 10Kbps
OCR_CAN=0xDA; //output mode : push-pull
CR_CAN=0x72; //enable overrun/receive interrupt
CMR_CAN=0x60; //no use
/*****init 51*****/
TMOD=0x10;
TR1=1; //timmer1 mode 1 and enabled
IT1=1; //int1 edge trigger mode
EX1=1; //int 1 enabled
ET1=1; //timer 1 interrupt enabled
EA=1;
init_8279();
dispnum[6]=ID/10;
dispnum[7]=ID%10;
for(i=0;i<8;i++)
P8279_D=TAB[dispnum[i]]; //show the local ID first
while(1)
{
WDOG=!WDOG;
if(P16) //8279 key interrupt
{
add=getkey();
dispnum[6]=add/10;
dispnum[7]=add%10; //show the key number
}
/****** receive *******/
if(recflag)
{
recflag=0;
}
/****** transfer*******/
if(timeflag) //every 2 seconds transfer a message
{
timeflag=0; //clear timeflag bit
bufpt=0x3f02; //test the SR
if(((*bufpt)&0x04)==0x04) //if TBF accessable
{
bufpt=0x3f0A;
bufpt[0]=0x00; //destination ID
bufpt[1]=0x08; //message length
bufpt[2]=ID; //local ID
bufpt[3]=CURRENT_1;
bufpt[4]=CURRENT_2;
bufpt[5]=SENSOR_ERROR;
bufpt[6]=FLOAT_ERROR;
bufpt[7]=STATUS_WORD;
sum=ID+CURRENT_1+CURRENT_2+SENSOR_ERROR+FLOAT_ERROR+STATUS_WORD;
bufpt[9]=sum; //for parity check
CMR_CAN=0x01; //transfer
}
}
if(changeflag) //change the information after transfer
{
changeflag=0;
CURRENT_1++;
CURRENT_2++;
SENSOR_ERROR++;
FLOAT_ERROR++;
STATUS_WORD++;
}
}
}
unsigned char getkey() //get key
{
unsigned char key;
while(!P16) WDOG=!WDOG;
key=P8279_D&0x3f;
if(key>=7) key=key-2;
if(key<6) key=5-key;
return(key);
}
void delay(unsigned int k)
{
for(;k>0;k--) ;
}
void init_8279()
{
P8279_CR=0xD0; //clear display RAM
while(P8279_D&0x80)
WDOG=!WDOG; //wait for clear over
P8279_CR=0x00; //8 bit left input
P8279_CR=0x2A; //fscl=clock/10
P8279_CR=0x90; //auto add 1 when write RAM
P8279_CR=0xA0;
}
/******* receive interrupt********/
void canint(void) interrupt 2
{
uchar xdata *message;
uchar i;
message=0x3f03; //IR
i=*message;
if(i&0x08) CMR_CAN=0x08; //clear overrun
if(i&0x01)
{
message=0x3f16; //RBF
for(i=0;i<8;i++)
{
recbuf[i]=*message++;
}
recflag=1;
CMR_CAN=0x04; //release RBF
}
}
void timer(void) interrupt 3
{
TL1=0x00;
TH1=0x00;
N++;
if(N>TIMES) //transfer interval set
{
timeflag=1;
N=0;
changeflag=1;
}
if(SR_CAN&0x80) CR_CAN=0x72; //if bus off reset to operating mode
WDOG=!WDOG;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -