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

📄 sja1000.c

📁 CAN控制器的C源码
💻 C
字号:
/*这是一个自发收程序,采用at89s51+sja1000,分离晶体,at89s51晶体11.0592
sja1000外部晶体为12M,通过串口进行监控
******************************************************

以下为头文件定义
copyright by alloy

******************************************************
*/
#define SJA_REG_BaseADD 0x7800

#define REG_MODE    XBYTE[SJA_REG_BaseADD + 0x00]
#define REG_CMD        XBYTE[SJA_REG_BaseADD + 0x01]
#define REG_SR        XBYTE[SJA_REG_BaseADD + 0x02]
#define REG_IR        XBYTE[SJA_REG_BaseADD + 0x03]
#define REG_IR_ABLE    XBYTE[SJA_REG_BaseADD + 0x04]
#define REG_BTR0    XBYTE[SJA_REG_BaseADD + 0x06]    //05保留
#define REG_BTR1    XBYTE[SJA_REG_BaseADD + 0x07]
#define REG_OCR        XBYTE[SJA_REG_BaseADD + 0x08]
#define REG_TEST    XBYTE[SJA_REG_BaseADD + 0x09]
#define REG_ALC        XBYTE[SJA_REG_BaseADD + 0x0b]    //0a保留
#define REG_ECC        XBYTE[SJA_REG_BaseADD + 0x0c]
#define REG_EMLR    XBYTE[SJA_REG_BaseADD + 0x0d]
#define REG_RXERR    XBYTE[SJA_REG_BaseADD + 0x0e]
#define REG_TXERR    XBYTE[SJA_REG_BaseADD + 0x0f]

#define REG_ACR0    XBYTE[SJA_REG_BaseADD + 0x10]
#define REG_ACR1    XBYTE[SJA_REG_BaseADD + 0x11]
#define REG_ACR2    XBYTE[SJA_REG_BaseADD + 0x12]
#define REG_ACR3    XBYTE[SJA_REG_BaseADD + 0x13]
#define REG_AMR0    XBYTE[SJA_REG_BaseADD + 0x14]
#define REG_AMR1    XBYTE[SJA_REG_BaseADD + 0x15]
#define REG_AMR2    XBYTE[SJA_REG_BaseADD + 0x16]
#define REG_AMR3    XBYTE[SJA_REG_BaseADD + 0x17]

#define REG_RxBuffer0    XBYTE[SJA_REG_BaseADD + 0x10]
#define REG_RxBuffer1    XBYTE[SJA_REG_BaseADD + 0x11]
#define REG_RxBuffer2    XBYTE[SJA_REG_BaseADD + 0x12]
#define REG_RxBuffer3    XBYTE[SJA_REG_BaseADD + 0x13]
#define REG_RxBuffer4    XBYTE[SJA_REG_BaseADD + 0x14]

#define REG_TxBuffer0    XBYTE[SJA_REG_BaseADD + 0x10]
#define REG_TxBuffer1    XBYTE[SJA_REG_BaseADD + 0x11]
#define REG_TxBuffer2    XBYTE[SJA_REG_BaseADD + 0x12]
#define REG_TxBuffer3    XBYTE[SJA_REG_BaseADD + 0x13]
#define REG_TxBuffer4    XBYTE[SJA_REG_BaseADD + 0x14]

#define REG_DataBuffer1 XBYTE[SJA_REG_BaseADD + 0x15]
#define REG_DataBuffer2 XBYTE[SJA_REG_BaseADD + 0x16]
#define REG_DataBuffer3 XBYTE[SJA_REG_BaseADD + 0x17]
#define REG_DataBuffer4 XBYTE[SJA_REG_BaseADD + 0x18]
#define REG_DataBuffer5 XBYTE[SJA_REG_BaseADD + 0x19]
#define    REG_DataBuffer6 XBYTE[SJA_REG_BaseADD + 0x1a]
#define REG_DataBuffer7 XBYTE[SJA_REG_BaseADD + 0x1b]
#define REG_DataBuffer8 XBYTE[SJA_REG_BaseADD + 0x1c]


#define REG_RBSA    XBYTE[SJA_REG_BaseADD + 0x1e]
#define REG_CDR        XBYTE[SJA_REG_BaseADD + 0x1f]
#define REG_Receive_Counter    XBYTE[SJA_REG_BaseADD + 0x1d]

#define    OK        1
#define    Fail    0
#define ON        1
#define OFF        0
#define True    1
#define False    0

sbit SJARst = P2 ^ 6;                                //复位控制
sbit LED0 = P1 ^ 0;
sbit LED1 = P1 ^ 1;
sbit Key0 = P1 ^ 2;
sbit Key1 = P1 ^ 3;
sbit Key2 = P1 ^ 4;
sbit Key3 = P1 ^ 5;

bit step_flg;
bit Tx_flg;
bit Rx_flg;

unsigned char step_counter;
unsigned char Tx_counter;
unsigned char PC_RX_Buffer;
unsigned char temp_data1;
unsigned char Rx_Buffer[6];

void MCU_Init(void);
void SJA_Init(void);
void send(unsigned char S_Data);
void Serial(void);
void Delay(unsigned char Delay_time);
void step(void);



*******************************************************

以下为c的主程序
copyright by alloy

*******************************************************
#include <stdio.h>
#include <string.h>
#include <REG51.h>
#include <TxMCU.h>
#include <absacc.h>
main()
{

    unsigned char i;
    MCU_Init();
    SJA_Init();
    REG_MODE = 0x01;                    //进入复位模式

    temp_data1 = REG_MODE;
        temp_data1 = temp_data1 & 0x01;
    if(temp_data1  ==  0x01)        //在复位模式中
    {
        REG_BTR0 = 0x85;
        REG_BTR1 = 0xb4;                //100k
        REG_OCR    = 0x1a;
        REG_CDR = 0xc0;
        REG_RBSA = 0x00;

        REG_ACR0 = 0xff;
        REG_ACR1 = 0xff;
        REG_ACR2 = 0xff;
        REG_ACR3 = 0xff;

        REG_AMR0 = 0xff;
        REG_AMR1 = 0xff;
        REG_AMR2 = 0xff;
        REG_AMR3 = 0xff;

        REG_IR_ABLE = 0xff;
    }
    REG_MODE = 0x0c;                    //进入自接收模式
    REG_MODE = 0x0c;

    for(i = 0;i<100;i++);
    temp_data1 = REG_Receive_Counter;
    send(temp_data1);
    for(;;)
    {
            while(Tx_flg == False);
                        Tx_flg = False;
            Tx_counter++;
            send(Tx_counter);
            temp_data1 = REG_SR;
            while((temp_data1 & 0x10) == 0x10);
            temp_data1 = REG_SR;
            if((temp_data1 & 0x04) == 0x04)
            {
                REG_RxBuffer0 = 0x08;            //标准帧,长度为8
                REG_RxBuffer1 = 0xff;
                REG_RxBuffer2 = 0xff;

                REG_RxBuffer3 = 0x01;
                REG_RxBuffer4 = 0x02;
                REG_DataBuffer1 = 0x03;
                REG_DataBuffer2 = 0x04;
                REG_DataBuffer3 = 0x05;
                REG_DataBuffer4 = 0x06;
                REG_DataBuffer5 = 0x07;
                REG_DataBuffer6 = 0x08;
                REG_DataBuffer7 = 0x09;
                REG_DataBuffer8 = 0x0a;
            }
            REG_CMD = 0x10;
            temp_data1 = REG_SR;
            temp_data1 = temp_data1 & 0x20;
            while(temp_data1 == 0x20)            //检查是否发送完成
            {
                //send(0xaa);
                temp_data1 = REG_ECC;
                send(temp_data1);
                temp_data1 = REG_SR;
                temp_data1 = temp_data1 & 0x20;
                //send(temp_data1);
            }

            send(0x66);
            temp_data1 = REG_ALC;
            send(temp_data1);
            temp_data1 = REG_ECC;
            send(temp_data1);
            temp_data1 = REG_SR;
            send(temp_data1);
            temp_data1 = REG_Receive_Counter;
            send(temp_data1);

            PC_RX_Buffer = 0x77;
            LED0 = ~LED0;

//            Tx_counter = 0x00;
    }
}

void MCU_Init(void)
{
    SJARst = 1;
    LED0 = OFF;
    LED1 = OFF;
    PC_RX_Buffer = 0x77;
    step_counter = 0x00;
    step_flg = False;
    Tx_flg = False;
    temp_data1 = 0x00;
    TMOD = 0x20;
    TH1 = 0xff;
    TL1 = 0xff;
    TR1 = 1;
    SCON = 0x50;
    PCON = 0x80;
    EA = 1;
    ES = 1;
    Tx_counter = 0x00;

}

void SJA_Init(void)
{
    unsigned char i;
    for(i = 0;i < 125;i++);
    SJARst = 0;
    for(i = 0;i < 125;i++);
    SJARst = 1;
    for(i = 0;i < 125;i++);
}

void send(unsigned char S_Data)
{
    SBUF = S_Data;
    while(TI == 0);
    TI =0;
}

void Serial() interrupt 4 using 2
{

    if(RI == 1)
    {
        PC_RX_Buffer = SBUF;
        RI = 0;
        if(PC_RX_Buffer == 0xaa)
        {
            send(0x13);
            Tx_flg = True;
            PC_RX_Buffer = 0x77;
        }
        else if(PC_RX_Buffer == 0x55)
        {
            send(0x14);
            Rx_flg = True;
            PC_RX_Buffer = 0x77;
        }
        else
        {
            send(0x15);
            PC_RX_Buffer = 0x77;
        }
    }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -