can总线通信程序
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
*/ if ((CAN_ERROR_flag == YES)) { CAN_ERROR_flag = NOT; CAN_init(); } else { CAN_ERROR_flag = NOT; } } } //--------------------------// 功能:系统设置 // --外部数据存储区访问使能 // --LED指示灯关(1=on,0=off)
unsigned char CAN_ERROR_flag = NOT; //
unsigned char CAN_DataLength = 8; //CAN信息的报文长度
unsigned char UART_DataLength = 0; //串口接收时的当前指
示 unsigned char UART_Length = 0; //sbit AAA = P1^4; void main(void) { EA = 0; System_init(); //系统初始化 Timer_init(); //定时器初始化 Interrupt_init(); //中断 UART_ini(); CAN_init(); Delay(1); W_WDT(); EA = 1;
//Delay(1); //UART_Length = 8; //CAN_Transmit(0); //UART_Transmit();
while (1) { W_WDT();
if (CAN_flag == YES) { CAN_flag = NOT; CAN_Transmit(0); LED1 = !LED1; } else { CAN_flag = NOT;
// RX_buffer ===> CAN_TX_buffer
//
//---------------------------------------------------
void Timer0_ISR(void) interrupt 1 using 2
{
static unsigned char i;
unsigned char CAN_TX_ID[4] = {0,0,0,0};
//待发送的目
标的ID
unsigned char CAN_RX_ID[4] = {0,0,0,0};
//接收到的信
息来自何ID
unsigned char CAN_RX_Data[8] = {7,6,5,4,3,2,1,0}; //接
PCON&= 0x7F; //SMOD = 0 TMOD |= 0x20; //timer1 mode 2
TL1 = UART_BTR[2]; //| f //| 波特率=----------------------
TH1 = UART_BTR[2]; //| 32*2^smod*12*(256-TL1) TCON |= 0x40; //start
for (i=0;i { CAN_TX_Data[i] = UART_RX_Data[i]; } UART_Length = UART_DataLength; UART_DataLength = 0; CAN_flag = YES; } //--------------------------------------------------------------// // 串口中断服务程序 // // ----只有接收使用 // ----每收一个数重新初始化定时器 // //---------------------------------------------------------------void RX_INT(void) interrupt 4 using 3 { static unsigned char n;
// --流程控制标志置为无效NOT // --清空串口,CAN的相关数据缓冲区 //--------------------------void System_init(void) { CKCON = 0x00; //Fosc devide 12 AUXR = 0x00;//0x02; //EXM enable LED1 = 0; //LED0-3 off 指示灯,共阴接法,1时亮 LED2 = 0; LED3 = 0; LED4 = 0; WDT = 1; //WDT ini
//串口接收到
的串行帧
unsigned char xdata CAN_TX_Data[255];
//待发送的数据
缓冲区
unsigned char code ACR_ID[4] = {0,0,0,0}; //CAN初始设
置验收滤波值
unsigned char code AMR_ID[4] = {0xff,0xff,0xff,0xff};
//串口接收区的长度指示
} /*
if (UART_flag == YES) { UART_flag = NOT; //Delay(50); UART_Transmit(); //Clear_Buffer(CAN_RX_Data,8); //LED3 = !LED3; } else { UART_flag = NOT; }
//unsigned char counter;
//TH0 = temp_TH0;
//TL0 = temp_TL0;
/*counter += 1;
if (counter == 20) //到1S了么? { //UART_flag = YES; } if (counter == 40) //到2S了么? { //CAN_flag = YES; counter = 0; }*/ //AAA = !AAA; TR0 = 0; //定时器关,开始次CAN信息传送
CAN总线通信程序
// CAN <==> UART的协议转换器 // 说明: // 1,单片机使用P89C61X2BA // --晶振 11.0592MHZ
// --CAN总线中断使用单片机的中断0,外部有上拉电阻,波特率可以 设定 // 2,CAN总线发送采用查询方式,接收采用中断方式 // 3,看门狗复位时间1.2S // 4,SJA1000晶振8MHZ,Peil模式 // 5,串口中断接收,查询发送,波特率可设置 // 6,×××当串口收到数据后,每8个数一组打包,通过CAN总线发 送出去 // // -----10.16日,重新修改程序完成以下功能----// ----此功能已经改为,每收到一帧数据,启动一次CAN传输,传 输字节数等于串口收到的数据 // ----串行帧的帧间界定通过当前波特率下传输5个字节为时间间 隔,具体为当顺序接收到的任意两个数据,它们之间的时间间隔大于5 个字节传送时间,认为这两个数据分属于两个不 同的帧 // 7,当CAN总线每接收一帧信息后,通过串口发送出去 // 改为可以识别CAN的报文字节长度,即串口只发送CAN报文长度个 字节 // 8,看门狗芯片MAX1232CPA,硬件溢出时间1.2S // //------------------------------------------------------#include
受到的数据缓冲
unsigned char code CAN_BTR0[10] =
{0xdf,0xcf,0xc7,0xc3,0x43,0xc1,0xc1,0xc0,0xc0,0x80};
unsigned char code CAN_BTR1[10] =
{0x7f,0x7f,0x7f,0x7f,0x2f,0x7f,0x4d,0x3e,0x3a,0x23};
TI = 0; }
//----------------------------------------------// // 看门狗“喂狗”程序,WDT的一个下降沿触发一次 // //----------------------------------------------void W_WDT(void) //triggle WDT { unsigned char i; WDT = 1; for (i=0;i<10;i++) { } WDT = 0; }
//
5K 10K 20K 40K 50K 80K 100K 200K 250K 500K
unsigned char code UART_BTR[4] = {0xe8,0xf4,0xfa};
//
1.2K,2.4K,4.8K
unsigned char CAN_flag; //CAN发送标志位
unsigned char UART_flag; //
CAN_DataLength = 8; UART_DataLength = 0; UART_Length = 0;
CAN_flag = NOT; CAN_ERROR_flag = NOT; //UART_flag = NOT;
Clear_Buffer(UART_RX_Data,255); Clear_Buffer(CAN_TX_Data,255); Clear_Buffer(CAN_TX_ID,4); Clear_Buffer(CAN_RX_ID,4); Clear_Buffer(CAN_RX_Data,8);
#iHale Waihona Puke clude#include
#include "CANCOM.h"
unsigned char UART_TX_Data[8] = {0,1,2,3,4,5,6,7};
unsigned char CAN_TX_Data[8] = {0,1,2,3,4,5,6,7};
unsigned char xdata UART_RX_Data[255];
//--------------------------------------------------// // 中断初始化 // // ----外部中断0有效,下降沿触发,用于SJA1000产生CAN事件中 断
// ----定时器中断,用于判定串口接收的顺序两个字节是否分属两帧 // ----串口中断,RX使用中断,TX未使用 // ----中断优先级暂时未设定 // //--------------------------------------------------void Interrupt_init(void) { //IP = 0x00; IT0 = 0x01; //外部0中断沿触发
if (RI==1) { do {
RI = 0; } while (RI != 0);
//UART_RX_Data[UART_DataLength++] = SBUF; n = SBUF; UART_Send_Byte(n);
ET0 = 1; //定时器0中断使能
EX0 = 1; //外部中断使能
ES = 1;
//串行中断使能
}
//---------------------------------------------------
//
// 定时中断程序
//
// 一旦中断,说明一帧的接收已经结束,开始启动CAN发送程序
// 把串口接收到的数据准备好给CAN总线发送
for (i = 0;i < time;i++) { W_WDT(); for (j=0;j<30000;j++) { } } }
//--------------------------------// 串行口初始化设置 // 方式1,8数据位,一个停止位,无奇偶校验 // 串口中断允许 //-----------------------------------void UART_ini(void) { SCON = 0x50; //方式1,波特率可变,8bits,接受允许
/* CAN_flag = YES; UART_flag = YES; */
} //----------------------------// // 软件延时(非精确) // ----内置清看门狗定时器子函数 // 防止多次调用延时过长导致 // 看门狗复位 // //----------------------------void Delay(unsigned char time) { unsigned char i; unsigned int j;
unsigned char CAN_ERROR_flag = NOT; //
unsigned char CAN_DataLength = 8; //CAN信息的报文长度
unsigned char UART_DataLength = 0; //串口接收时的当前指
示 unsigned char UART_Length = 0; //sbit AAA = P1^4; void main(void) { EA = 0; System_init(); //系统初始化 Timer_init(); //定时器初始化 Interrupt_init(); //中断 UART_ini(); CAN_init(); Delay(1); W_WDT(); EA = 1;
//Delay(1); //UART_Length = 8; //CAN_Transmit(0); //UART_Transmit();
while (1) { W_WDT();
if (CAN_flag == YES) { CAN_flag = NOT; CAN_Transmit(0); LED1 = !LED1; } else { CAN_flag = NOT;
// RX_buffer ===> CAN_TX_buffer
//
//---------------------------------------------------
void Timer0_ISR(void) interrupt 1 using 2
{
static unsigned char i;
unsigned char CAN_TX_ID[4] = {0,0,0,0};
//待发送的目
标的ID
unsigned char CAN_RX_ID[4] = {0,0,0,0};
//接收到的信
息来自何ID
unsigned char CAN_RX_Data[8] = {7,6,5,4,3,2,1,0}; //接
PCON&= 0x7F; //SMOD = 0 TMOD |= 0x20; //timer1 mode 2
TL1 = UART_BTR[2]; //| f //| 波特率=----------------------
TH1 = UART_BTR[2]; //| 32*2^smod*12*(256-TL1) TCON |= 0x40; //start
for (i=0;i { CAN_TX_Data[i] = UART_RX_Data[i]; } UART_Length = UART_DataLength; UART_DataLength = 0; CAN_flag = YES; } //--------------------------------------------------------------// // 串口中断服务程序 // // ----只有接收使用 // ----每收一个数重新初始化定时器 // //---------------------------------------------------------------void RX_INT(void) interrupt 4 using 3 { static unsigned char n;
// --流程控制标志置为无效NOT // --清空串口,CAN的相关数据缓冲区 //--------------------------void System_init(void) { CKCON = 0x00; //Fosc devide 12 AUXR = 0x00;//0x02; //EXM enable LED1 = 0; //LED0-3 off 指示灯,共阴接法,1时亮 LED2 = 0; LED3 = 0; LED4 = 0; WDT = 1; //WDT ini
//串口接收到
的串行帧
unsigned char xdata CAN_TX_Data[255];
//待发送的数据
缓冲区
unsigned char code ACR_ID[4] = {0,0,0,0}; //CAN初始设
置验收滤波值
unsigned char code AMR_ID[4] = {0xff,0xff,0xff,0xff};
//串口接收区的长度指示
} /*
if (UART_flag == YES) { UART_flag = NOT; //Delay(50); UART_Transmit(); //Clear_Buffer(CAN_RX_Data,8); //LED3 = !LED3; } else { UART_flag = NOT; }
//unsigned char counter;
//TH0 = temp_TH0;
//TL0 = temp_TL0;
/*counter += 1;
if (counter == 20) //到1S了么? { //UART_flag = YES; } if (counter == 40) //到2S了么? { //CAN_flag = YES; counter = 0; }*/ //AAA = !AAA; TR0 = 0; //定时器关,开始次CAN信息传送
CAN总线通信程序
// CAN <==> UART的协议转换器 // 说明: // 1,单片机使用P89C61X2BA // --晶振 11.0592MHZ
// --CAN总线中断使用单片机的中断0,外部有上拉电阻,波特率可以 设定 // 2,CAN总线发送采用查询方式,接收采用中断方式 // 3,看门狗复位时间1.2S // 4,SJA1000晶振8MHZ,Peil模式 // 5,串口中断接收,查询发送,波特率可设置 // 6,×××当串口收到数据后,每8个数一组打包,通过CAN总线发 送出去 // // -----10.16日,重新修改程序完成以下功能----// ----此功能已经改为,每收到一帧数据,启动一次CAN传输,传 输字节数等于串口收到的数据 // ----串行帧的帧间界定通过当前波特率下传输5个字节为时间间 隔,具体为当顺序接收到的任意两个数据,它们之间的时间间隔大于5 个字节传送时间,认为这两个数据分属于两个不 同的帧 // 7,当CAN总线每接收一帧信息后,通过串口发送出去 // 改为可以识别CAN的报文字节长度,即串口只发送CAN报文长度个 字节 // 8,看门狗芯片MAX1232CPA,硬件溢出时间1.2S // //------------------------------------------------------#include
受到的数据缓冲
unsigned char code CAN_BTR0[10] =
{0xdf,0xcf,0xc7,0xc3,0x43,0xc1,0xc1,0xc0,0xc0,0x80};
unsigned char code CAN_BTR1[10] =
{0x7f,0x7f,0x7f,0x7f,0x2f,0x7f,0x4d,0x3e,0x3a,0x23};
TI = 0; }
//----------------------------------------------// // 看门狗“喂狗”程序,WDT的一个下降沿触发一次 // //----------------------------------------------void W_WDT(void) //triggle WDT { unsigned char i; WDT = 1; for (i=0;i<10;i++) { } WDT = 0; }
//
5K 10K 20K 40K 50K 80K 100K 200K 250K 500K
unsigned char code UART_BTR[4] = {0xe8,0xf4,0xfa};
//
1.2K,2.4K,4.8K
unsigned char CAN_flag; //CAN发送标志位
unsigned char UART_flag; //
CAN_DataLength = 8; UART_DataLength = 0; UART_Length = 0;
CAN_flag = NOT; CAN_ERROR_flag = NOT; //UART_flag = NOT;
Clear_Buffer(UART_RX_Data,255); Clear_Buffer(CAN_TX_Data,255); Clear_Buffer(CAN_TX_ID,4); Clear_Buffer(CAN_RX_ID,4); Clear_Buffer(CAN_RX_Data,8);
#iHale Waihona Puke clude#include
#include "CANCOM.h"
unsigned char UART_TX_Data[8] = {0,1,2,3,4,5,6,7};
unsigned char CAN_TX_Data[8] = {0,1,2,3,4,5,6,7};
unsigned char xdata UART_RX_Data[255];
//--------------------------------------------------// // 中断初始化 // // ----外部中断0有效,下降沿触发,用于SJA1000产生CAN事件中 断
// ----定时器中断,用于判定串口接收的顺序两个字节是否分属两帧 // ----串口中断,RX使用中断,TX未使用 // ----中断优先级暂时未设定 // //--------------------------------------------------void Interrupt_init(void) { //IP = 0x00; IT0 = 0x01; //外部0中断沿触发
if (RI==1) { do {
RI = 0; } while (RI != 0);
//UART_RX_Data[UART_DataLength++] = SBUF; n = SBUF; UART_Send_Byte(n);
ET0 = 1; //定时器0中断使能
EX0 = 1; //外部中断使能
ES = 1;
//串行中断使能
}
//---------------------------------------------------
//
// 定时中断程序
//
// 一旦中断,说明一帧的接收已经结束,开始启动CAN发送程序
// 把串口接收到的数据准备好给CAN总线发送
for (i = 0;i < time;i++) { W_WDT(); for (j=0;j<30000;j++) { } } }
//--------------------------------// 串行口初始化设置 // 方式1,8数据位,一个停止位,无奇偶校验 // 串口中断允许 //-----------------------------------void UART_ini(void) { SCON = 0x50; //方式1,波特率可变,8bits,接受允许
/* CAN_flag = YES; UART_flag = YES; */
} //----------------------------// // 软件延时(非精确) // ----内置清看门狗定时器子函数 // 防止多次调用延时过长导致 // 看门狗复位 // //----------------------------void Delay(unsigned char time) { unsigned char i; unsigned int j;