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

📄 232tocan.h

📁 RS232/CAN转换器 硬件电路需自己设计(电路很简单)
💻 H
字号:
#define uchar unsigned char
#define uint   unsigned int
#define ulong  unsigned long

#define CRYSTAL_FREQ 11059200ul    //晶振频率
#define FREQ_DIV     6             //分频数

#define EXRAM_ENABLE   0x02        //使用外部扩展RAM
#define EXRAM_DISABLE  0x00        //使用片内扩展RAM

//定时器T0工作在16位定时模式
#define TIMER1ms_TH0 (65536-CRYSTAL_FREQ/FREQ_DIV/1000)/256
#define TIMER1ms_TL0 (65536-CRYSTAL_FREQ/FREQ_DIV/1000)%256

#define TIMER2ms_TH0 (65536-2*CRYSTAL_FREQ/FREQ_DIV/1000)/256
#define TIMER2ms_TL0 (65536-2*CRYSTAL_FREQ/FREQ_DIV/1000)%256

#define TIMER5ms_TH0 (65536-5*CRYSTAL_FREQ/FREQ_DIV/1000)/256
#define TIMER5ms_TL0 (65536-5*CRYSTAL_FREQ/FREQ_DIV/1000)%256

#define TIMER10ms_TH0 (65536-10*CRYSTAL_FREQ/FREQ_DIV/1000)/256
#define TIMER10ms_TL0 (65536-10*CRYSTAL_FREQ/FREQ_DIV/1000)%256

#define TIMER20ms_TH0 (65536-20*CRYSTAL_FREQ/FREQ_DIV/1000)/256
#define TIMER20ms_TL0 (65536-20*CRYSTAL_FREQ/FREQ_DIV/1000)%256

#define TIMER25ms_TH0 (65536-25*CRYSTAL_FREQ/FREQ_DIV/1000)/256
#define TIMER25ms_TL0 (65536-25*CRYSTAL_FREQ/FREQ_DIV/1000)%256

#define TIMER50ms_TH0 (65536-50*CRYSTAL_FREQ/FREQ_DIV/1000)/256
#define TIMER50ms_TL0 (65536-50*CRYSTAL_FREQ/FREQ_DIV/1000)%256

//定时器T2用作波特率发生器
#define BAUD600H (65536-CRYSTAL_FREQ/600/32*12/FREQ_DIV)/256      //600bps
#define BAUD600L (65536-CRYSTAL_FREQ/600/32*12/FREQ_DIV)%256

#define BAUD1200H (65536-CRYSTAL_FREQ/1200/32*12/FREQ_DIV)/256    //1200bps
#define BAUD1200L (65536-CRYSTAL_FREQ/1200/32*12/FREQ_DIV)%256

#define BAUD2400H (65536-CRYSTAL_FREQ/2400/32*12/FREQ_DIV)/256    //2400bps
#define BAUD2400L (65536-CRYSTAL_FREQ/2400/32*12/FREQ_DIV)%256

#define BAUD4800H (65536-CRYSTAL_FREQ/4800/32*12/FREQ_DIV)/256    //4800bps
#define BAUD4800L (65536-CRYSTAL_FREQ/4800/32*12/FREQ_DIV)%256

#define BAUD9600H (65536-CRYSTAL_FREQ/9600/32*12/FREQ_DIV)/256    //9600bps
#define BAUD9600L (65536-CRYSTAL_FREQ/9600/32*12/FREQ_DIV)%256

#define BAUD19200H (65536-CRYSTAL_FREQ/19200/32*12/FREQ_DIV)/256  //19200bps
#define BAUD19200L (65536-CRYSTAL_FREQ/19200/32*12/FREQ_DIV)%256

#define BAUD38400H (65536-CRYSTAL_FREQ/38400/32*12/FREQ_DIV)/256  //38400bps
#define BAUD38400L (65536-CRYSTAL_FREQ/38400/32*12/FREQ_DIV)%256

#define BAUD57600H (65536-CRYSTAL_FREQ/57600/32*12/FREQ_DIV)/256  //57600bps
#define BAUD57600L (65536-CRYSTAL_FREQ/57600/32*12/FREQ_DIV)%256

#define BAUD115200H (65536-CRYSTAL_FREQ/115200/32*12/FREQ_DIV)/256  //115200bps
#define BAUD115200L (65536-CRYSTAL_FREQ/115200/32*12/FREQ_DIV)%256
//x5045  define
#define WREN    0x06		//enable write operation
#define WRDI    0x04		//disable write operation
#define RSDR    0x05		//read status register
#define WRSR    0x01		//write status register
#define READ    0x03		//read data from menory
#define WRITE   0x02		//write data
#define BL      0x0c		//块保护
#define BO      0x00        //块不保护

#define Somenop(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();\
                   _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

/*****************SJA1000定义(Pelican)******************/
#define PELI_MODE_REG              PBYTE[0]  //工作模式寄存器
#define PELI_COMMAND_REG           PBYTE[1]  //命令寄存器
#define PELI_STATUS_REG            PBYTE[2]  //状态寄存器
#define PELI_INTERRUPT_REG         PBYTE[3]  //中断寄存器
#define INTERRUPT_EN_REG           PBYTE[4]  //中断使能寄存器
#define PELI_BTR0_REG              PBYTE[6]  //总线定时寄存器0
#define PELI_BTR1_REG              PBYTE[7]  //总线定时寄存器1
#define PELI_OUTPUT_CONTROL_REG    PBYTE[8]  //输出控制寄存器
#define PELI_TEST_REG              PBYTE[9]  //测试寄存器
#define ARB_LOST_REG               PBYTE[11] //仲裁丢失失捕获寄存器
#define ERR_CODE_REG               PBYTE[12] //错误代码捕获寄存器
#define ERR_WARN_REG               PBYTE[13] //错误警告限制寄存器
#define RX_ERR_REG                 PBYTE[14] //接收错误计数寄存器
#define TX_ERR_REG                 PBYTE[15] //发收错误计数寄存器

#define PELI_ACCEPT_CODE0_REG      PBYTE[16] //验收代码0寄存器
#define PELI_ACCEPT_CODE1_REG      PBYTE[17] //验收代码1寄存器
#define PELI_ACCEPT_CODE2_REG      PBYTE[18] //验收代码2寄存器
#define PELI_ACCEPT_CODE3_REG      PBYTE[19] //验收代码3寄存器

#define PELI_ACCEPT_MASK0_REG      PBYTE[20] //验收屏蔽0寄存器
#define PELI_ACCEPT_MASK1_REG      PBYTE[21] //验收屏蔽1寄存器
#define PELI_ACCEPT_MASK2_REG      PBYTE[22] //验收屏蔽2寄存器
#define PELI_ACCEPT_MASK3_REG      PBYTE[23] //验收屏蔽3寄存器

//接收缓冲区(标准帖)
//#define RX_FRAME_INFO              PBYTE[16] //接收帧信息寄存器
//#define PELI_RX_ID1                PBYTE[17] //标识符1
//#define PELI_RX_ID2                PBYTE[18] //标识符2
#define SF_RX_DATA1                PBYTE[19] //数据1
#define SF_RX_DATA2                PBYTE[20] //数据2
#define SF_RX_DATA3                PBYTE[21] //数据3
#define SF_RX_DATA4                PBYTE[22] //数据4
#define SF_RX_DATA5                PBYTE[23] //数据5
#define SF_RX_DATA6                PBYTE[24] //数据6
#define SF_RX_DATA7                PBYTE[25] //数据7
#define SF_RX_DATA8                PBYTE[26] //数据8

//发送缓冲区(标准帖)
//#define TX_FRAME_INFO              PBYTE[16] //发送帖信息寄存器
//#define PELI_TX_ID1                PBYTE[17] //标识符1
//#define PELI_TX_ID2                PBYTE[18] //标识符2
#define SF_TX_DATA1                PBYTE[19] //数据1
#define SF_TX_DATA2                PBYTE[20] //数据2
#define SF_TX_DATA3                PBYTE[21] //数据3
#define SF_TX_DATA4                PBYTE[22] //数据4
#define SF_TX_DATA5                PBYTE[23] //数据5
#define SF_TX_DATA6                PBYTE[24] //数据6
#define SF_TX_DATA7                PBYTE[25] //数据7
#define SF_TX_DATA8                PBYTE[26] //数据8

//接收缓冲区(扩展帖)
#define RX_FRAME_INFO              PBYTE[16] //接收帖信息寄存器
#define PELI_RX_ID1                PBYTE[17] //标识符1
#define PELI_RX_ID2                PBYTE[18] //标识符2
#define PELI_RX_ID3                PBYTE[19] //标识符3
#define PELI_RX_ID4                PBYTE[20] //标识符4
#define EF_RX_DATA1                PBYTE[21] //数据1
#define EF_RX_DATA2                PBYTE[22] //数据2
#define EF_RX_DATA3                PBYTE[23] //数据3
#define EF_RX_DATA4                PBYTE[24] //数据4
#define EF_RX_DATA5                PBYTE[25] //数据5
#define EF_RX_DATA6                PBYTE[26] //数据6
#define EF_RX_DATA7                PBYTE[27] //数据7
#define EF_RX_DATA8                PBYTE[28] //数据8

//发送缓冲区(扩展帖)
#define TX_FRAME_INFO              PBYTE[16] //发送帖信息寄存器
#define PELI_TX_ID1                PBYTE[17] //标识符1
#define PELI_TX_ID2                PBYTE[18] //标识符2
#define PELI_TX_ID3                PBYTE[19] //标识符3
#define PELI_TX_ID4                PBYTE[20] //标识符4
#define EF_TX_DATA1                PBYTE[21] //数据1
#define EF_TX_DATA2                PBYTE[22] //数据2
#define EF_TX_DATA3                PBYTE[23] //数据3
#define EF_TX_DATA4                PBYTE[24] //数据4
#define EF_TX_DATA5                PBYTE[25] //数据5
#define EF_TX_DATA6                PBYTE[26] //数据6
#define EF_TX_DATA7                PBYTE[27] //数据7
#define EF_TX_DATA8                PBYTE[28] //数据8

#define RX_BUFFER_START            PBYTE[30] //接收缓冲区起始地址
#define PELI_CLK_DIV_REG           PBYTE[31] //时钟分频寄存器

/*****************SJA1000定义(BasicCAN)******************/
#define BASIC_MODE_REG              PBYTE[0]  //工作模式寄存器
#define BASIC_COMMAND_REG           PBYTE[1]  //命令寄存器
#define BASIC_STATUS_REG            PBYTE[2]  //状态寄存器
#define BASIC_INTERRUPT_REG         PBYTE[3]  //中断寄存器
#define BASIC_BTR0_REG              PBYTE[6]  //总线定时寄存器0
#define BASIC_BTR1_REG              PBYTE[7]  //总线定时寄存器1
#define BASIC_OUTPUT_CONTROL_REG    PBYTE[8]  //输出控制寄存器
#define BASIC_TEST_REG              PBYTE[9]  //测试寄存器

#define BASIC_ACCEPT_CODE_REG       PBYTE[4]  //验收代码寄存器
#define BASIC_ACCEPT_MASK_REG       PBYTE[5]  //验收屏蔽寄存器

//接收缓冲区
#define BASIC_RX_ID1                PBYTE[20] //标识符1
#define BASIC_RX_ID2                PBYTE[21] //标识符2
#define BASIC_RX_DATA1              PBYTE[22] //数据1
#define BASIC_RX_DATA2              PBYTE[23] //数据2
#define BASIC_RX_DATA3              PBYTE[24] //数据3
#define BASIC_RX_DATA4              PBYTE[25] //数据4
#define BASIC_RX_DATA5              PBYTE[26] //数据5
#define BASIC_RX_DATA6              PBYTE[27] //数据6
#define BASIC_RX_DATA7              PBYTE[28] //数据7
#define BASIC_RX_DATA8              PBYTE[29] //数据8

//发送缓冲区
#define BASIC_TX_ID1                PBYTE[10] //标识符1
#define BASIC_TX_ID2                PBYTE[11] //标识符2
#define BASIC_TX_DATA1              PBYTE[12] //数据1
#define BASIC_TX_DATA2              PBYTE[13] //数据2
#define BASIC_TX_DATA3              PBYTE[14] //数据3
#define BASIC_TX_DATA4              PBYTE[15] //数据4
#define BASIC_TX_DATA5              PBYTE[16] //数据5
#define BASIC_TX_DATA6              PBYTE[17] //数据6
#define BASIC_TX_DATA7              PBYTE[18] //数据7
#define BASIC_TX_DATA8              PBYTE[19] //数据8

#define BASIC_CLK_DIV_REG           PBYTE[31] //时钟分频寄存器

#define TR_CMD         0x01                   //发送请求
#define AT_CMD         0x02                   //中止发送
#define RRB_CMD        0x04                   //释放接收缓冲区
#define CDO_CMD        0x08                   //清除数据溢出
#define SRR_CMD        0x10                   //自接收请求
#define GTS_CMD        0x10                   //请求睡眠

//时间常数
#define TIMER100ms     2                   
#define TIMER500ms     10
#define TIMER1s        20
#define TIMER5s        100
#define TIMER10s       200

#define MAX_LENGHT     15                     //数据缓冲区长度
#define COM_MIN        7                      //串口最小接收字节长度
#define CMD_LENGHT     100                    //命令字长度

#define COM_HEAD       0xaa                   //起始字节
#define COM_END        0xbb                   //结束字节

//调试模式识别码
#define ASCII_ENTER    0x0d                   //回车键
#define ASCII_LF       0x0a                   //换行符

/* p89c51RD2 增强型UART */
sfr AUXR  = 0x8E;
sfr SADDR = 0xa9;       //从地址
sfr SADEN = 0xb9;       //从地址屏蔽

sbit WP     = P2 ^ 3;
sbit SPI_CS = P2 ^ 4;

sbit SPI_SO = P1 ^ 1;
sbit SPI_SI = P1 ^ 2;
sbit SCLK   = P1 ^ 3;

sbit RST    = P2 ^ 6;
sbit CAN_CS = P2 ^ 7;

sbit REC_LED  = P2 ^ 1;              //串口接收数据指示
sbit SEND_LED = P2 ^ 2;              //串口发送数据指示

union
{
    uchar t[2];
    uint crc;
}Add;                                //累加和

uchar data ComBaud;                 //串口波特率
uchar data Rec_delay;               //串口接收延时
uchar data CanBaud;                 //CAN波特率
uchar data Can_mode;                //CAN工作模式
uint  idata Acr_data;               //验收码
uint  idata Amr_data;               //屏蔽码

uchar xdata Ver_a;                   //软件版本号
uchar xdata Ver_b;          
uchar xdata Ver_c;

uchar data  Timer50ms;               //50ms定时器
uchar idata Com_rec_timer;           //串口接收数据字节间隔

uchar idata Can_rxbuf[MAX_LENGHT];   //CAN接收缓冲区
uchar idata Can_txbuf[MAX_LENGHT];   //CAN发送缓冲区
uchar idata Com_rxbuf[MAX_LENGHT];   //串口接收缓冲区
uchar idata Com_txbuf[MAX_LENGHT];   //串口发送缓冲区

uchar code  Bitrate[3][2] = {//BTR0,BTR1
                                {0x03, 0x1c}, //125k
                                {0x01, 0x1c}, //250k
                                {0x00, 0x1c}, //500k
                             };
                             
uchar xdata Command[CMD_LENGHT];     //调试命令接收缓冲区
uchar xdata Recjs;                   //接收计数

uchar data Can_rxcount;              //CAN接收数据计数
uchar data Can_txcount;              //CAN发送数据计数
uchar data Com_rxcount;              //串口接收数据计数
uchar data Com_txcount;              //串口发送数据计数
uchar idata *Telcom;                 //串口通讯缓冲区指针

uchar data Wait_timer;               //等待时间

uchar bdata CANInterrupt;            //CAN通讯中断标志
sbit RI_Bit  = CANInterrupt ^ 0;
sbit TI_Bit  = CANInterrupt ^ 1;
sbit EI_Bit  = CANInterrupt ^ 2;
sbit DOI_Bit = CANInterrupt ^ 3;
sbit WUI_Bit = CANInterrupt ^ 4;
sbit EPI_Bit = CANInterrupt ^ 5;
sbit ALI_Bit = CANInterrupt ^ 6;
sbit BEI_Bit = CANInterrupt ^ 7;   

uchar bdata temp1;
sbit Can_send_ready = temp1 ^ 0;     //准备启动CAN发送标志
sbit Com_send_ready = temp1 ^ 1;     //准备启动串口发送标志
sbit Can_send_now   = temp1 ^ 2;     //CAN正在发送
sbit Com_send_now   = temp1 ^ 3;     //串口正在发送
sbit Can_rec_now    = temp1 ^ 4;     //CAN正在接收
sbit Com_rec_now    = temp1 ^ 5;     //串口正在接收

uchar bdata temp2;
sbit Can_err        = temp2 ^ 0;     //CAN通讯错误

⌨️ 快捷键说明

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