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

📄 main.c

📁 CAN转232及485的通讯卡程序,调试通过
💻 C
📖 第 1 页 / 共 2 页
字号:

/*
*********************************************************************************************************
* Copyright (c) 2003, 凌宝设计中心
* All rights reserved.
* 
* 文件名称:cancom.c
* 文件标识:无
* 摘    要:
* 
* 以前版本:1.0
* 作    者:王黎
* 完成日期:2003年9月9日
*
*当前版本:2.0
*作    者: WWW.ZHTIANTAN.COM
*完成日期:08年11月
*********************************************************************************************************
* 包含头文件	
* 	
*********************************************************************************************************
*/
#include "cancom.h"

/*
*********************************************************************************************************
* 	
* 全局变量定义	
* 	
*********************************************************************************************************
*/


/**************************CAN**************************************/
static code BYTE CANID[] = { 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 
						130, 131, 132, 133, 134, 135, 136, 137, 138, 139,
						140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 
						150, 151, 152, 153, 154, 155, };	// 1~36路CAN的ID号	
static code BYTE MYID=0X55;
BYTE idata ucCircle = 0;			// 标志1~36路的某路
BOOL idata bSjaReceived;			// 标识CAN数据是否有效
unsigned char  xdata Candata_R[BadLenght_can][13];    //存放CAN接收数据 
unsigned char  TCandata[13];
unsigned char  BagCount_R_CAN;  //CAN接收数据包数计数
unsigned char  Bagcount_T_CAN;  //CAN发送数据包数计数
unsigned int   RCount_CAN=0;
unsigned int   TCount_CAN=0;


/**************************RS232**************************************/

BOOL idata int_flag_232;//232发送完一包数据标志位
BOOL idata rx_flag_232;//232接收完一包数据标志位
BOOL idata int_232;//232发送一字节完成标志
BOOL idata rx_232; //232接收完一字节完成标志 
unsigned char  *send_232; //232发送指针
unsigned char  xdata rec_232_R[BadLenght][13];//定义10包232的接收级冲区
unsigned char  length_232=0; //标识232发送长度
unsigned char  length_232_R=0; //标识232接收长度
unsigned char  BagCount_T_232=0; //232发送数据包数计数
unsigned char  BagCount_R_232=0;  //232读取数据包数计数
unsigned int   TCount_232=0; //发送计数
unsigned int   RCount_232=0;//接收计数



/**************************485**************************************/
BOOL idata rx_flag_485;//485接收完成标志
BOOL idata int_flag_485; //485发送完成标志
BOOL idata int_485;//485发送一字节完成标志
BOOL idata rx_485; //485接收完一字节完成标志 
unsigned char  *send_485; //485发送指针
unsigned char  xdata rec_485_R[BadLenght][13];//定义10包485的接收级冲区
unsigned char  length_485=0; //485发送长度
unsigned char  length_485_R=0; //485接收长度
unsigned char  BagCount_T_485=0; //485发送数据包数计数
unsigned char  BagCount_R_485=0;  //485读取数据包数计数
unsigned int   TCount_485=0; //发送计数
unsigned int   RCount_485=0; //接收计数

 
sbit LED = P1^0;
sbit Control485=P1^1;
/*
*********************************************************************************************************
* 
* 函数名称:CpuInit
*	
* 输入变量:无
* 
* 输出变量:无
* 
* 功能描述:初始化51各个CPU寄存器
*	
*********************************************************************************************************
*/
void CpuInit(void)
{
	
		SCON = 0x50;		// 串口0设置为:8bits,无校验位,一位停止位
		SCON1= 0x50;    // 串口1设置为:8bits,无校验位,一位停止位
		PCON = 0xc0;    //波特率加倍
    TMOD = 0x21;    //定时器使用方式2  
    TH1  = 0xFD;		// 设置波特率为9600bps
    TL1  = 0xFD;
		TR1  = 1;
		ES   = 1;			// 开串行0中断
		ES1  = 1;     // 开串行1中断
		EX0  = 1;			// 开外部中断
		IT0  = 0;			// 外部中断1通过INT1脚的低电平触发
		TH0  = 0Xdc;  //10MS定时,
		TL0  = 0X00;
		ET0  = 1;     // 定时器0中断
		TR0  = 0;     // 关定时器0;
}

/*
*********************************************************************************************************
* 
* 函数名称:EnalbeInterrupt
*	
* 输入变量:无
* 
* 输出变量:无
* 
* 功能描述:打开中断
*	
*********************************************************************************************************
*/
void EnalbeInterrupt(void)
{
	EA = 1;
}


/*
*********************************************************************************************************
* 
* 函数名称:DisableInterrupt
*	
* 输入变量:无
* 
* 输出变量:无
* 
* 功能描述:关闭中断,对各个中断源的中断信号不予响应
*	
*********************************************************************************************************
*/
void DisableInterrupt(void)
{
	EA = 0;
}


/*
*********************************************************************************************************
* 
* 函数名称:DisableInterrupt
*	
* 输入变量:无
* 
* 输出变量:无
* 
* 功能描述:定时器中断
*	
*********************************************************************************************************
*/
void time0_intt0(void) interrupt 1
{
	  EA=0; 
	  TH0  = 0Xdc;  //10MS定时,
	  TL0  = 0X00;   
		TR0  = 0; //关定时器0 
		LED^=1;
		length_485_R=0;
		length_232_R=0;
		EA=1;
		
}

/*
*********************************************************************************************************
* 
* 函数名称:SjaInit
*	
* 输入变量:无
* 
* 输出变量:无
* 
* 功能描述:SJA1000初始化函数
*	
*********************************************************************************************************
*/
void SjaInit(void)
{
	  DisableInterrupt();
	  CLKOUT =  0x80;                 //选择CAN模式为Pelican,中止CAN 输入比较器
		do 
		{										// 进入复位模式
     	  MODECTLREG = 0x01;
		} 
		while(!(MODECTLREG & 0x01));			   // 测试是否进入了复位模式
		CLKOUT =  0xC0;                 //选择CAN模式为Pelican,中止CAN 输入比较器
		BUFFER0=0;
    BUFFER1 = MYID&0x07;
 		BUFFER2 = ((CANID[0]&0x07)|(MYID&0xF8));	                        
		BUFFER3 = (CANID[0]&0xf8);		 //设置接收识别ID 
		BUFFER4 = 0Xff;                // 设置接收ID掩码,只对接收地址及本机ID进行识别
		BUFFER5 = 0Xff;
		BUFFER6 = 0Xff;
		BUFFER7 = 0xff;					 
    BUSTIME0 = 0x01;      					// 设置通信波特率为250kbps  由计算软件算出
    BUSTIME1 = 0x1c;
    OUTCTL = 0x1a;       					  // 输出为正常模式
    do 
    {										            // 返回正常运行模式
    	MODECTLREG = 0x00;
    }
    while(MODECTLREG & 0x01);				// 测试是否返回了正常模式
    InterruptIER= 0X01;  //开接收中断
    EnalbeInterrupt();
}

/*
*********************************************************************************************************
* 
* 函数名称:SjaInterrupt
*	
* 输入变量:无
* 
* 输出变量:无
* 
* 功能描述:CAN中断函数(使用外部中断1,中断号为 2,使用寄存器 1)
*	
*********************************************************************************************************
*/
void SjaInterrupt(void) interrupt 0 using 0
{
DisableInterrupt();
if(TF1)
{
	TF1 = 0;
	if (!bSjaReceived) {
		 //接收帧信息
		 Candata_R[BagCount_R_CAN][0] = BUFFER0; 
		 //接收ID
		 Candata_R[BagCount_R_CAN][1] = BUFFER1;
		 Candata_R[BagCount_R_CAN][2] = BUFFER2;
		 Candata_R[BagCount_R_CAN][3] = BUFFER3;
		 Candata_R[BagCount_R_CAN][4] = BUFFER4; 
		 //接收数据
		 Candata_R[BagCount_R_CAN][5] = BUFFER5;	
		 Candata_R[BagCount_R_CAN][6] = BUFFER6;
		 Candata_R[BagCount_R_CAN][7] = BUFFER7;	
		 Candata_R[BagCount_R_CAN][8] = BUFFER8;
		 Candata_R[BagCount_R_CAN][9] = BUFFER9;	
		 Candata_R[BagCount_R_CAN][10] = BUFFER10;
		 Candata_R[BagCount_R_CAN][11] = BUFFER11;	
		 Candata_R[BagCount_R_CAN][12] = BUFFER12;
	   // 设置数据有效
		bSjaReceived = TRUE;
		RCount_CAN++;
		BagCount_R_CAN++;			 //CAN数据包计数加1
		if(BagCount_R_CAN>BadLenght_can) //CAN数据包计数已到了最大值
		BagCount_R_CAN=0;  	
	}	
	ucCircle++;
	SjaInit();
	
}
EnalbeInterrupt();
}            
 /*
*********************************************************************************************************
* 
* 函数名称:SjaSend
*	
* 输入变量:要发送的数据地址首址、数据长度、数据ID号
* 
* 输出变量:无
* 
* 功能描述:发送CAN数据
*	
*********************************************************************************************************
*/
void SjaSend(unsigned char *p)
{
	
	BUFFER0	= (*p|0x80);  //设置发送数据长度及帧格式
	
	BUFFER1 = (*(p+1)<<3|*(p+2)>>5);    //设置ID
	BUFFER2 = (*(p+2)<<3|*(p+3)>>5); 
	BUFFER3 = (*(p+3)<<3|*(p+4)>>5); 
	BUFFER4 = *(p+4)<<3;
	
	BUFFER5	= *(p+5); //设置数据
	BUFFER6	= *(p+6);
	BUFFER7	= *(p+7);
	BUFFER8	= *(p+8);
	BUFFER9	= *(p+9);
	BUFFER10 = *(p+10);
	BUFFER11 = *(p+11);
	BUFFER12 = *(p+12);
	
	COMMANDREG	= 0x01;  //请求发送
	COMMANDREG	= 0x0E;  //发送信息错误,仲裁丢失不会重发,内部发送请求自动清除
}   
      
/*      
*********************************************************************************************************
* 
* 函数名称:SerialInterrupt
*	
* 输入变量:无
* 
* 输出变量:无
* 
* 功能描述:串口中断函数(中断号为 4,使用寄存器 1)

⌨️ 快捷键说明

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