⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 can.c

📁 单片机的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 + -