📄 main.c
字号:
/*
*********************************************************************************************************
* 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 + -