📄 can_232.h
字号:
//---------------------------------------------------------------------
//创建日期: 2006年3月17日
//文件名称: can_232.c
//作 者: 边国利
//说 明: 1.本程序是用C51芯片的串口接收FT025发送的数据,再将其用CAN总线发
// 送出去,另一方面将从CAN总线上的数据通过串口发送到FT025中
// 2.利用T0的计数器功能将一个1024Hz的方波信号分频为2Hz的方波信号
// 通过一个I/O输出
//---------------------------------------------------------------------
#include "REG52.H"
//#define KuoZhan
#define Can_ID 0x09 //Can地址
#ifdef KuoZhan
#define Can_ID_H ((Can_ID>>5)&0x07) //Can地址高三位
#define Can_ID_L (Can_ID<<3) //低五位
#define StartNo 4
#else
#define Can_ID_H ((Can_ID>>3)&0x0F) //Can地址高五位
#define Can_ID_L (Can_ID<<5) //低三位
#define StartNo 2
#endif
#define XBYTE ((unsigned char volatile xdata *) 0)
//#define BIT15 0x8000
//#define BIT14 0x4000
//#define BIT13 0x2000
//#define BIT12 0x1000
//#define BIT11 0x0800
//#define BIT10 0x0400
//#define BIT9 0x0200
//#define BIT8 0x0100
#define BIT7 0x80
#define BIT6 0x40
#define BIT5 0x20
#define BIT4 0x10
#define BIT3 0x08
#define BIT2 0x04
#define BIT1 0x02
#define BIT0 0x01
sbit FeedPulseOut=P1^0; //脉冲1输出为
sbit DoofPulseOut=P1^1; //脉冲2输出为
//高四位是命令功能
unsigned char CanBlkInd; //Can发送数据的块索引
//SJA1000 的寄存器和位定义
#define _PeliCANMode //定义为PeliCAN模式
//#define CANBasicAdd 0 //SJA1000的基地址
#define CANBasicAdd 0x0800 //SJA1000的基地址
//模式和控制寄存器的地址和位定义
#define ModeControlReg XBYTE[CANBasicAdd+0]
#define RM_RR_Bit 0x01 //复位模式请求位
#if defined (_PeliCANMode)
#define LOM_Bit 0x02 //仅听模式位
#define STM_Bit 0x04 //自我测试模式位
#define AFM_Bit 0x08 //验收滤波器模式位
#define SM_Bit 0x10 //进入休眠模式位
#endif
//中断使能和控制寄存器的地址和位定义
#if defined (_PeliCANMode)
#define InterruptEnReg XBYTE[CANBasicAdd+4] // PeliCAN 模式
#define RIE_Bit 0x01 //接收中断使能位
#define TIE_Bit 0x02 //发送中断使能位
#define EIE_Bit 0x04 //错误警告中断使能位
#define DOIE_Bit 0x08 //数据超载中断使能位
#define WUIE_Bit 0x10 //唤醒中断使能位
#define EPIE_Bit 0x20 //错误隐性中断使能位
#define ALIE_Bit 0x40 //仲裁丢失中断使能位
#define BEIE_Bit 0x80 //总线错误中断使能位
#else //BasicCAN 模式
#define InterruptEnReg XBYTE[CANBasicAdd+0] // 控制寄存器
#define RIE_Bit 0x02 //接收中断使能位
#define TIE_Bit 0x04 //发送中断使能位
#define EIE_Bit 0x08 //错误中断使能位
#define DOIE_Bit 0x10 //超载中断使能位
#endif
//命令寄存器的地址和位定义
#define CommandReg XBYTE[CANBasicAdd+1]
#define TR_Bit 0x01 //发送请求位
#define AT_Bit 0x02 //中止发送位
#define RRB_Bit 0x04 //释放接收缓冲器位
#define CDO_Bit 0x08 //清除数据超载位
#if defined (_PeliCANMode)
#define SRR_Bit 0x10 //自身接收请求位
#else //BasicCAN 模式
#define GTS_Bit 0x10 //进入睡眠模式位
#endif
//状态寄存器的地址和位定义
#define StatusReg XBYTE[CANBasicAdd+2]
#define RBS_Bit 0x01 //接收缓冲器状态位
#define DOS_Bit 0x02 //数据超载状态位
#define TBS_Bit 0x04 //发送缓冲器状态位
#define TCS_Bit 0x08 //发送完成状态位
#define RS_Bit 0x10 //接收状态位
#define TS_Bit 0x20 //发送状态位
#define ES_Bit 0x40 //错误状态位
#define BS_Bit 0x80 //总线状态位
//中断寄存器的地址和位定义
#define InterruptReg XBYTE[CANBasicAdd+3]
#define RI_Bit 0x01 //接收中断位
#define TI_Bit 0x02 //发送中断位
#define EI_Bit 0x04 //错误警告中断位
#define DOI_Bit 0x08 //数据超载中断位
#define WUI_Bit 0x10 //唤醒中断位
#if defined (_PeliCANMode)
#define EPI_Bit 0x20 //错误被动中断位
#define ALI_Bit 0x40 //仲裁丢失中断位
#define BEI_Bit 0x80 //总线错误中断位
#endif
//总线定时寄存器的地址和位定义
#define BusTiming0Reg XBYTE[CANBasicAdd+6]
#define BusTiming1Reg XBYTE[CANBasicAdd+7]
#define SAM_Bit 0x80 //采样模式位:1总线被采样三次,0总线被采样一次
//输出控制寄存器的地址和位定义
#define OutControlReg XBYTE[CANBasicAdd+8]
//OCMODE1 OCMODE0
#define BiPhaseMode 0x00 //双相输出模式
#define NormalMode 0x02 //正常输出模式
#define ClkOutMode 0x03 //时钟输出模式
//TX1 的输出管脚配置
#define OCPOL1_Bit 0x20 //输出极性控制位
#define Tx1Float 0x00 //配置为悬空
#define Tx1PullDn 0x40 //配置为下拉
#define Tx1PullUp 0x80 //配置为上拉
#define Tx1PshPull 0Xc0 //配置为推挽
//TX0 的输出管脚配置
#define OCPOL0_Bit 0x04 //输出极性控制位
#define Tx0Float 0x00 //配置为悬空
#define Tx0PullDn 0x08 //配置为下拉
#define Tx0PullUp 0x10 //配置为上拉
#define Tx0PshPull 0X18 //配置为推挽
//验收代码和屏蔽寄存器的地址定义
#if defined (_PeliCANMode)
#define AcceptCode0Reg XBYTE[CANBasicAdd+16]
#define AcceptCode1Reg XBYTE[CANBasicAdd+17]
#define AcceptCode2Reg XBYTE[CANBasicAdd+18]
#define AcceptCode3Reg XBYTE[CANBasicAdd+19]
#define AcceptMask0Reg XBYTE[CANBasicAdd+20]
#define AcceptMask1Reg XBYTE[CANBasicAdd+21]
#define AcceptMask2Reg XBYTE[CANBasicAdd+22]
#define AcceptMask3Reg XBYTE[CANBasicAdd+23]
#else //BasicCAN 模式
#define AcceptCodeReg XBYTE[CANBasicAdd+4]
#define AcceptMaskReg XBYTE[CANBasicAdd+5]
#endif
//Rx-缓冲器的地址定义
#if defined (_PeliCANMode)
#define RxFramInFo XBYTE[CANBasicAdd+16]
unsigned char volatile xdata RxBuffer[CANBasicAdd+12] _at_ (CANBasicAdd+17);
//#define RxBuffer1 XBYTE[CANBasicAdd+17]
//#define RxBuffer2 XBYTE[CANBasicAdd+18]
//#define RxBuffer3 XBYTE[CANBasicAdd+19]
//#define RxBuffer4 XBYTE[CANBasicAdd+20]
//#define RxBuffer5 XBYTE[CANBasicAdd+21]
//#define RxBuffer6 XBYTE[CANBasicAdd+22]
//#define RxBuffer7 XBYTE[CANBasicAdd+23]
//#define RxBuffer8 XBYTE[CANBasicAdd+24]
//#define RxBuffer9 XBYTE[CANBasicAdd+25]
//#define RxBuffer10 XBYTE[CANBasicAdd+26]
//#define RxBuffer11 XBYTE[CANBasicAdd+27]
//#define RxBuffer12 XBYTE[CANBasicAdd+28]
#else //BasicCAN模式
unsigned char volatile xdata RxBuffer[CANBasicAdd+10] _at_ (CANBasicAdd+20);
//#define RxBuffer1 XBYTE[CANBasicAdd+20]
//#define RxBuffer2 XBYTE[CANBasicAdd+21]
//#define RxBuffer3 XBYTE[CANBasicAdd+22]
//#define RxBuffer4 XBYTE[CANBasicAdd+23]
//#define RxBuffer5 XBYTE[CANBasicAdd+24]
//#define RxBuffer6 XBYTE[CANBasicAdd+25]
//#define RxBuffer7 XBYTE[CANBasicAdd+26]
//#define RxBuffer8 XBYTE[CANBasicAdd+27]
//#define RxBuffer9 XBYTE[CANBasicAdd+28]
//#define RxBuffer10 XBYTE[CANBasicAdd+29]
#endif
//Tx 缓冲器的地址定义
#if defined (_PeliCANMode)
//仅写地址
#define TxFramInFo XBYTE[CANBasicAdd+16]
unsigned char volatile xdata TxBuffer[CANBasicAdd+12] _at_ (CANBasicAdd+17);
//#define TxBuffer1 XBYTE[CANBasicAdd+17]
//#define TxBuffer2 XBYTE[CANBasicAdd+18]
//#define TxBuffer3 XBYTE[CANBasicAdd+19]
//#define TxBuffer4 XBYTE[CANBasicAdd+20]
//#define TxBuffer5 XBYTE[CANBasicAdd+21]
//#define TxBuffer6 XBYTE[CANBasicAdd+22]
//#define TxBuffer7 XBYTE[CANBasicAdd+23]
//#define TxBuffer8 XBYTE[CANBasicAdd+24]
//#define TxBuffer9 XBYTE[CANBasicAdd+25]
//#define TxBuffer10 XBYTE[CANBasicAdd+26]
//#define TxBuffer11 XBYTE[CANBasicAdd+27]
//#define TxBuffer12 XBYTE[CANBasicAdd+28]
//仅读地址
#define TxFramInFoRd XBYTE[CANBasicAdd+96]
#define TxBufferRd1 XBYTE[CANBasicAdd+97]
#define TxBufferRd2 XBYTE[CANBasicAdd+98]
#define TxBufferRd3 XBYTE[CANBasicAdd+99]
#define TxBufferRd4 XBYTE[CANBasicAdd+100]
#define TxBufferRd5 XBYTE[CANBasicAdd+101]
#define TxBufferRd6 XBYTE[CANBasicAdd+102]
#define TxBufferRd7 XBYTE[CANBasicAdd+103]
#define TxBufferRd8 XBYTE[CANBasicAdd+104]
#define TxBufferRd9 XBYTE[CANBasicAdd+105]
#define TxBufferRd10 XBYTE[CANBasicAdd+106]
#define TxBufferRd11 XBYTE[CANBasicAdd+107]
#define TxBufferRd12 XBYTE[CANBasicAdd+108]
#else //BasicCAN 模式
unsigned char volatile xdata TxBuffer[CANBasicAdd+10] _at_ (CANBasicAdd+10);
//#define TxBuffer1 XBYTE[CANBasicAdd+10]
//#define TxBuffer2 XBYTE[CANBasicAdd+11]
//#define TxBuffer3 XBYTE[CANBasicAdd+12]
//#define TxBuffer4 XBYTE[CANBasicAdd+13]
//#define TxBuffer5 XBYTE[CANBasicAdd+14]
//#define TxBuffer6 XBYTE[CANBasicAdd+15]
//#define TxBuffer7 XBYTE[CANBasicAdd+16]
//#define TxBuffer8 XBYTE[CANBasicAdd+17]
//#define TxBuffer9 XBYTE[CANBasicAdd+18]
//#define TxBuffer10 XBYTE[CANBasicAdd+19]
#endif
//其他寄存器的地址 定义
#if defined (_PeliCANMode)
#define ArbLostCapReg XBYTE[CANBasicAdd+11]
#define ErrCodeCapReg XBYTE[CANBasicAdd+12] //错误代码捕捉
#define ErrWarnLimitReg XBYTE[CANBasicAdd+13]
#define RxErrCountReg XBYTE[CANBasicAdd+14]
#define TxErrCountReg XBYTE[CANBasicAdd+15] //TX错误计数器
#define RxMsgCountReg XBYTE[CANBasicAdd+29]
#define RxBufstartAdr XBYTE[CANBasicAdd+30] //RX缓冲器起始地址
#endif
//时钟分频寄存器的地址和位定义
#define ClockDivideReg XBYTE[CANBasicAdd+31]
#define DivBy1 0x07 //CLKOUT=振荡器频率
#define DivBy2 0x00 //CLKOUT=1/2 振荡器频率
#define CLKOff_Bit 0x08 //时钟关闭位时钟输出管脚控制位
#define RXINTEN_Bit 0x20 //用于接收中断的管脚TX1
#define CBP_Bit 0x40 //CAN 比较器旁路控制位
#define CANMode_Bit 0x80 //CAN 模式控制位
//寄存器内容默认复位值清除寄存器
#define ClrByte 0x00
//常量清除中断使能寄存器
#if defined (_PeliCANMode)
#define ClrIntEnSJA ClrByte
#else
#define ClrIntEnSJA ClrByte|RM_RR_Bit //保留复位请求
#endif
//验收代码和屏蔽寄存器的定义
#define DontCare 0xFF
#define Prec_MB_24 0x00 //波特率预分频器1
#define SJW_MB_24 0x00 //SJW 1
#define TSEG1_MB_24 0x08 //TSEG1 9
#define TSEG2_MB_24 0x10 //TSEG2 2
//与串口发送相关的变量
unsigned char SCI_SendLen; //将要发送的字节数
unsigned char SCI_SendCount; //已发送的字节数
//union
//{
// unsigned char CAN_RecBuf[16]; //CAN总线接收缓冲区
unsigned char SCI_SendBuf[16]; //串口发送缓冲区
//};
#define CAN_RecBuf SCI_SendBuf
unsigned char bdata bitChar; //用于求偶校验
sbit B_0=bitChar^0;
sbit B_1=bitChar^1;
sbit B_2=bitChar^2;
sbit B_3=bitChar^3;
sbit B_4=bitChar^4;
sbit B_5=bitChar^5;
sbit B_6=bitChar^6;
sbit B_7=bitChar^7;
#define CAN_SendLen 10 //将要发送的字节数
#define CAN_RecLen 10 //将要发送的字节数
#define SCI_RecLen 26 //将要发送的字节数
unsigned char SCI_RecCount; //已发送的字节数
//union
//{
// unsigned char CAN_SendBuf[22]; //CAN总线发送缓冲区
unsigned char SCI_RecBuf[SCI_RecLen]; //串口接收缓冲区
//};
#define CAN_SendBuf SCI_RecBuf
//与修改CAN通讯的波特率有关的声明
unsigned char btr;
#define btr_1M 0
#define btr_800k 1
#define btr_500k 2
#define btr_250k 3
#define btr_125k 4
#define btr_50k 5
#define btr_20k 6
#define btr_10k 7
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -