"这篇资源是关于51单片机实现CAN通信的源代码,适合初学者进行二次开发。" 在嵌入式系统中,CAN(Controller Area Network)总线是一种广泛应用的通信协议,尤其在汽车电子设备和工业自动化领域。51单片机由于其简单易用和成本效益,常被用于基础教学和小型项目。本资源提供的源代码展示了如何在51单片机上实现CAN通信,这对于理解CAN通信协议以及51单片机的中断、定时器和串行通信功能非常有帮助。 源代码中包含以下几个关键部分: 1. **头文件引用**: - `REG52.H`:包含了51单片机的寄存器定义,如定时器、中断等。 - `_intrins.h`:提供了51系列单片机的内联函数支持。 - `SJA_BCANCONF.H` 和 `SJA_BCANFUNC.C`:这两个文件包含了针对SJA1000 CAN控制器的配置和函数,SJA1000是常用的独立CAN控制器芯片。 2. **全局变量和标志位**: - `send_data` 和 `rcv_data`:用于存储发送和接收的数据缓冲区。 - `flag_init`:初始化标志位,用于记录各种状态。 - `rcv_flag`, `err_flag`, `over_flag` 和 `send_flag`:这些标志位用于指示接收、错误、溢出和发送完成的状态。 - `CAN_RESET`, `LED1`, `LED0` 和 `send_over_flag`:控制GPIO口的变量,如CAN控制器的复位和LED指示灯。 3. **中断服务函数**: - `T1_int()`:定时器1中断服务函数,用于设置定时器1为模式2,设定初始计数值,并开启定时器,这个定时器通常用于波特率发生器或者串行通信的波特率设置。 - `UART_int()`:串行口中断服务函数,负责接收数据并将其存入缓冲区,同时更新发送状态标志。 4. **初始化函数**: - `Sja_1000_Init()`:这是SJA1000 CAN控制器的初始化函数,可能包括设置CAN控制器的工作模式、滤波器配置、波特率等。 源代码中没有给出完整的`Sja_1000_Init()`函数,但通常这个函数会涉及以下步骤: - 初始化CAN控制器的寄存器,如CAN控制寄存器(CNF1, CNF2, CNF3)和CAN比特率设置(BRG1, BRG2)。 - 设置CAN总线的传输模式,例如正常模式或静默模式。 - 配置接收和发送滤波器,以确定哪些CAN消息会被接收或忽略。 - 开启CAN控制器,使其开始监听和发送数据。 5. **其他辅助函数**: - `ex0_int(void)interrupt 0 using 1`:可能是外部中断0的中断服务函数,但未在给定的代码中具体实现。 通过这个源代码,初学者可以学习到51单片机的中断系统、定时器应用、串行通信以及CAN通信的基本操作。在实际应用中,开发者需要根据实际硬件配置和项目需求来完善和调整这些函数,以实现完整的CAN通信功能。
#include<REG52.H>
#include <intrins.h>
#include<SJA_BCANCONF.H>
#include<SJA_BCANFUNC.C>
//************************函数声明*****************************//
void T1_int(void);
void Sja_1000_Init(void);
//************************变量定义*****************************//
unsigned char data send_data[10],rcv_data[10]; //发送和接收数组定义
unsigned char bdata flag_init;
unsigned char j,k=2;
sbit rcv_flag=flag_init^0; //接收中断标志
sbit err_flag=flag_init^2; //错误中断标志
sbit over_flag=flag_init^3; //溢出中断
bit send_flag=0;
sbit CAN_RESET=P2^0;
sbit LED1=P3^4;
sbit LED0=P3^5;
bit send_over_flag; //发送一次结束标志位
//******************************外部中断0*******************//
void ex0_int(void) interrupt 0 using 1
{
SJA_BCANAdr=REG_INTERRUPT;
flag_init=*SJA_BCANAdr;
}
//******************************T1初始化********************//
void T1_int(void)
TMOD=0x20; //定时器1设为方式2
TL1=0xFD; //定时器初值
TH1=0xFD;
SCON=0x50; //串口设为方式1,REN=1允许接收
TR1=1; //启动定时器1
}
void UART_int(void) interrupt 4 using 3/*串口中断接受数据*/
{
send_data[k]=SBUF; //写串口数据到发送数组
RI=0; //接收中断清零
k++; //
if(k==10) //接收到8组数据
{k=2; //
send_flag=1; //置位发送标志
}
}
//******************************SJA1000初始化********************//
void Sja_1000_Init(void)
{ BCAN_ENTER_RETMODEL(); //进入复位
BCAN_SET_BANDRATE(0x06); //200K
BCAN_SET_OBJECT(0xa8,0x00); //设置地址ID:540
BCAN_SET_OUTCLK(0xaa,0x48); //设置输出方式,禁止COLOCKOUT输出
BCAN_QUIT_RETMODEL(); //退出复位模式
SJA_BCANAdr=REG_CONTROL; //地址指针指向控制寄存器
*SJA_BCANAdr|=0x1e; //开放错误\接收\发送中断
}
/////////////////////////////////////////////////////////////
void can_over_prg(void)
剩余27页未读,继续阅读
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- zlib-1.2.12压缩包解析与技术要点
- 微信小程序滑动选项卡源码模版发布
- Unity虚拟人物唇同步插件Oculus Lipsync介绍
- Nginx 1.18.0版本WinSW自动安装与管理指南
- Java Swing和JDBC实现的ATM系统源码解析
- 掌握Spark Streaming与Maven集成的分布式大数据处理
- 深入学习推荐系统:教程、案例与项目实践
- Web开发者必备的取色工具软件介绍
- C语言实现李春葆数据结构实验程序
- 超市管理系统开发:asp+SQL Server 2005实战
- Redis伪集群搭建教程与实践
- 掌握网络活动细节:Wireshark v3.6.3网络嗅探工具详解
- 全面掌握美赛:建模、分析与编程实现教程
- Java图书馆系统完整项目源码及SQL文件解析
- PCtoLCD2002软件:高效图片和字符取模转换
- Java开发的体育赛事在线购票系统源码分析