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

📄 can_232.h

📁 本程序是一个将CanOpen协议的通讯转换为TTL串口通讯(9600,e,7,1),CANOPEN的站号是9
💻 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 + -