收藏 分享(赏)

基于CAN总线的远距离水位监控系统.doc

上传人:myw993772 文档编号:8719235 上传时间:2019-07-09 格式:DOC 页数:28 大小:81.50KB
下载 相关 举报
基于CAN总线的远距离水位监控系统.doc_第1页
第1页 / 共28页
基于CAN总线的远距离水位监控系统.doc_第2页
第2页 / 共28页
基于CAN总线的远距离水位监控系统.doc_第3页
第3页 / 共28页
基于CAN总线的远距离水位监控系统.doc_第4页
第4页 / 共28页
基于CAN总线的远距离水位监控系统.doc_第5页
第5页 / 共28页
点击查看更多>>
资源描述

1、基于 CAN 总线的远距离水位监控系统描述: 独立的 CAN 控制器 SJA1000 基本硬件头文件定义BasicCAN 工作方式*/#include #include #include#include#include #define uchar unsigned char#define uint unsigned intsbit CS7221 = P11; / 7221 的片选sbit DIN7221 = P10; / 7221 的数据端sbit CLK7221 = P12; / 7221 的时钟端sbit wr_0804=P37; /0804 读端sbit rd_0804=P36; /08

2、04 写端sbit intr_0804=P22; /0804 中断端sbit cs_0804=P21; /0804 片选端uchar temp,c4; /温度暂存uchar DATA_BUF6; /发送数据暂存/*SJA1000 与微处理器的接口是以外部存储器的方式,所以以下的基址定义,用户 *应根据自己的实际电路来进行调整 */#define SJA_Adr 0xfe00 /定义 sja1000 的片选基址/计算 SJA1000 在电路中的实际地址:基址+内部寄存器地址/* 以下的定义为 SJA1000 的内部寄存器的地址,不可修改 * 各寄存器的具体功能清参阅 sja1000 的数据手册

3、*/#define REG_CONTROL SJA_Adr+0x00 /内部控制寄存器#define REG_COMMAND SJA_Adr+0x01 /命令寄存器#define REG_STATUS SJA_Adr+0x02 /状态寄存器#define REG_INTERRUPT SJA_Adr+0x03 /中断寄存器#define REG_ACR SJA_Adr+0x04 /验收代码寄存器#define REG_AMR SJA_Adr+0x05 /验收屏蔽寄存器#define REG_BTR0 SJA_Adr+0x06 /总线定时寄存器 0 #define REG_BTR1 SJA_Adr

4、+0x07 /总线定时寄存器 1 #define REG_OCR SJA_Adr+0x08 /输出控制寄存器#define REG_TEST SJA_Adr+0x09 /测试寄存器 /以下为发送缓冲区寄存器定义#define REG_TxBuf1 SJA_Adr+0x0A /发送缓冲区 1#define REG_TxBuf2 SJA_Adr+0x0B /发送缓冲区 2#define REG_TxBuf3 SJA_Adr+0x0C /发送缓冲区 3#define REG_TxBuf4 SJA_Adr+0x0D /发送缓冲区 4#define REG_TxBuf5 SJA_Adr+0x0E /发送

5、缓冲区 5#define REG_TxBuf6 SJA_Adr+0x0F /发送缓冲区 6#define REG_TxBuf7 SJA_Adr+0x10 /发送缓冲区 7#define REG_TxBuf8 SJA_Adr+0x11 /发送缓冲区 8#define REG_TxBuf9 SJA_Adr+0x12 /发送缓冲区 9#define REG_TxBuf10 SJA_Adr+0x13 /发送缓冲区 10/以下为接收缓冲区寄存器定义#define REG_RxBuf1 SJA_Adr+0x14 /接收缓冲区 1#define REG_RxBuf2 SJA_Adr+0x15 /接收缓冲区

6、2#define REG_RxBuf3 SJA_Adr+0x16 /接收缓冲区 3#define REG_RxBuf4 SJA_Adr+0x17 /接收缓冲区 4#define REG_RxBuf5 SJA_Adr+0x18 /接收缓冲区 5#define REG_RxBuf6 SJA_Adr+0x19 /接收缓冲区 6#define REG_RxBuf7 SJA_Adr+0x1A /接收缓冲区 7#define REG_RxBuf8 SJA_Adr+0x1B /接收缓冲区 8#define REG_RxBuf9 SJA_Adr+0x1C /接收缓冲区 9#define REG_RxBuf10

7、 SJA_Adr+0x1D /接收缓冲区 10/*内部地址 01EH 备用 */*时钟分频寄存器(内部地址 01FH) */#define REG_CDR SJA_Adr+0x1F /时钟分频寄存器/*定义指针 */uchar xdata *SJA_BCANAdr; /*定义命令字 */ #define TR_CMD 0x01 /发送请求命令#define AT_CMD 0x02 /夭折发送命令#define RRB_CMD 0x04 /释放接收缓冲区#define COS_CMD 0x08 /清除超载状态#define GTS_CMD 0x10 /进入睡眠状态命令/*定义 12M 的晶体下,

8、CAN 总线波特率 */#define bps_20k 0x00 /波特率 20kbps#define bps_40k 0x01 /波特率 40kbps#define bps_50k 0x02 /波特率 50kbps#define bps_80k 0x03 /波特率 80kbps#define bps_100k 0x04 /波特率 100kbps#define bps_125k 0x05 /波特率 125kbps#define bps_200k 0x06 /波特率 200kbps#define bps_250k 0x07 /波特率 250kbps#define bps_400k 0x08 /波

9、特率 400kbps#define bps_500k 0x09 /波特率 500kbps#define bps_666k 0x0a /波特率 666kbps#define bps_800k 0x0b /波特率 800kbps#define bps_1000k 0x0c /波特率 1000kbps/*-* 以下为 BASICCAN SJA1000 的错误字 *-*/#define INTERFACE_0K 0 /SJA1000 接口正常 #define BUS_0K 0 /CAN 总线工作正常#define INTERFACE_ERR 0XFF /SJA1000 接口错误? #define EN

10、TRESET_ERR 0XFE /SJA1000 不能进入复位模式#define QUITRESET_ERR 0XFD /SJA1000 不能退出复位模式#define INITOBJECT_ERR 0XFC /初始化报文验收滤波器错#define INITBTR_ERR 0XFB /初始化总线定时器器错#define INITOUTCTL_ERR 0XFA /初始化输出控制错误#define INTCLKDIV_ERR 0XF9 /初始化时钟分频控制器错#define BUS_ERR 0XF8 /SJA1000 发送数据错#define NO_BANDRATE_SIZE 0xe7 /*以下为

11、基本的函数说明(BasicCAN) */bit CREATE_COMMUNATION(void); /检测 CAN 控制器的接口是否正常 bit ENTER_RETMODEL(void); /CAN 控制器进入复位工作模式 bit QUIT_RETMODEL(void); /CAN 控制器退出复位工作模式 bit SET_BANDRATE(uchar CAN_bps); /设置 CAN 控制器 SJA1000 通信波特率bit SET_OBJECT(uchar BCAN_ACR,uchar BCAN_AMR); /设置 CAN 节点的通讯对象bit SET_OUTCLK (uchar Out_

12、Control,uchar Clock_Out);/设置 SJA1000 的输出模式和时钟分频 bit HW_INIT(uchar BCAN_ACR,uchar BCAN_AMR,uchar Bus_Timing0,uchar Bus_Timing1,uchar Out_Control,uchar Clock_Out); /CAN 控制器的初始化bit DATA_WRITE(uchar *SendDataBuf); /发送特定帧各式的数据 bit RECEIVE(uchar *RcvDataBuf); /CAN 控制器接收数据bit CMD_PRG(uchar cmd); /执行 sja100

13、0 命令 void sja1000(); /SJA1000 初始化void Initial7221(void); /MAX7221 初始化void WR7221(uchar addr,uchar Data); /MAX7221 写程序void Max7221Display(uchar *buffer); /MAX7221 显示程序void read_0804(); /读 AD 转换电压值void wdcl_0804(); /转换电压值void delay(uint n); /延时程序main() sja1000(); /SJA1000 初始化while(1)uchar k;read_0804(

14、); /读 AD 转换电压值wdcl_0804(); /转换电压值Max7221Display( /显示DATA_BUF0=0xaa; /ID 高 8 位为 10101010=0xaaDATA_BUF1=0xb4; /ID 低 3 位为 101 数据帧 数据长度为 4 位for(k=0;ki) ? 1:0; /先发高位 依次到低位_nop_();_nop_();CLK7221 = 1; /时钟高 上升沿锁数据_nop_();_nop_();for (i=0;ii) ? 1:0; /先发高位 依次到低位_nop_();_nop_();CLK7221 = 1; /时钟高 上升沿锁数据_nop_()

15、;_nop_();CS7221 = 1; /片选无效void Initial7221(void) /MAX7221 初始化WR7221(0x0A,0x0A); /亮度地址 0AH,0x000x0F,0x0F 最亮WR7221(0x0B,0x07); /扫描 LED 个数地址 0BH,0x000x07,最多扫描 8 个数码管WR7221(0x0C,0x01); /工作模式地址 0x0C. 0x00:关断;0x01:正常WR7221(0x09,0xFF); /编码模式地址 0x09. 0x000xFF:哪一位为 1,哪一位就支持编码void Max7221Display(uchar *buffer

16、) /MAX7221 显示子程序uchar i;for (i=0;i8;i+) /MAX7221 的 8 个数码管显示WR7221(i+1,*(buffer+i); /调 MAX7221 的写子程序void sja1000()do;while(CREATE_COMMUNATION()=1); /检测 CAN 控制器的接口是否正常do;while(ENTER_RETMODEL()=1); /进入复位工作模式HW_INIT(0xaa,0x00,0xc9,0xc9,0xff,0x48); /CAN 控制器的初始化do;while(QUIT_RETMODEL()=1); /退出复位工作模式/*说明:该

17、函数用于检测 CAN 控制器的接口是否正常 */bit CREATE_COMMUNATION(void) SJA_BCANAdr=REG_TEST; /访问测试寄存器 *SJA_BCANAdr =0xaa; /写入测试值if(*SJA_BCANAdr = 0xaa)return 0; /读测试正确else return 1; /*说明: CAN 控制器进入复位工作模式 */ bit ENTER_RETMODEL(void)uchar TempData;SJA_BCANAdr = REG_CONTROL; /访问地址指向控制寄存器 TempData= *SJA_BCANAdr; /保存原始值*S

18、JA_BCANAdr=(TempData|0x01); /置位复位请求if(*SJA_BCANAdrelsereturn 1; /*说明: CAN 控制器退出复位工作模式 */ bit QUIT_RETMODEL(void)uchar TempData;SJA_BCANAdr = REG_CONTROL; /访问地址指向控制寄存器 TempData = *SJA_BCANAdr; /保存原始值*SJA_BCANAdr=(TempData /清除复位请求if(*SJA_BCANAdr /elsereturn 1; /退出成功/*;*说明:设置 CAN 控制器 SJA1000 通信波特率.SJA1

19、000 的晶振为必须为 16MHZ, *;* 其它晶体的频率的值的波特率,需自己计算 。该子程序只能用于 *;* 复位模式 * ;*/uchar code SJA_BTR_CODETAB=0x53,0x2F, /;20KBPS 的预设值0x87,0xFF, /;40KBPS 的预设值0x47,0x2F, /;50KBPS 的预设值0x83,0xFF, /;80KBPS 的预设值0x43,0x2f, /;100KBPS 的预设值0x03,0x1c, /;125KBPS 的预设值0x81,0xfa, /;200KBPS 的预设值0x01,0x1c, /;250KBPS 的预设值0x80,0xfa,

20、 /;400KBPS 的预设值0x00,0x1c, /;500KBPS 的预设值0x80,0xb6, /;666KBPS 的预设值0x00,0x16, /;800KBPS 的预设值0x00,0x14 /;1000KBPS 的预设值;bit SET_BANDRATE(uchar CAN_bps)uchar BTR0_num,BTR1_num;BTR0_num = SJA_BTR_CODETABCAN_bps*2;BTR1_num = SJA_BTR_CODETABCAN_bps*2+1;/将波特率的的预设值装入 sja1000 的总线定时器SJA_BCANAdr=REG_BTR0; /访问地址指

21、向总线定时寄存器 0*SJA_BCANAdr=BTR0_num; /写入参数if(*SJA_BCANAdr != BTR0_num) /校验写入值return 1; SJA_BCANAdr=REG_BTR1; /访问地址指向总线定时寄存器 1*SJA_BCANAdr=BTR1_num; /写入参数if(*SJA_BCANAdr != BTR1_num) /校验写入值return 1; return 0; /*;*说明:设置 CAN 节点的通讯对象,允许接收的报文 ID 号的高 8 位(D10-D3) 。 *;* 允许接收的报文,是由 AMR 和 ACR 共同决定的. * ;* 满足以下条件的

22、ID 号的报文才可以被接收 *;*(ID.10-ID.3)(AC.7-AC.0)|(AM.7-AM.0)11111111 *;* 该子程序只能用于复位模式 * * ;*/bit SET_OBJECT(uchar BCAN_ACR,uchar BCAN_AMR)SJA_BCANAdr=REG_ACR; /访问地址指向验收代码寄存器(ACR)*SJA_BCANAdr=BCAN_ACR; /写入参数if(*SJA_BCANAdr != BCAN_ACR) /校验写入值return 1; SJA_BCANAdr=REG_AMR; /访问地址指向验收屏蔽寄存器(AMR)*SJA_BCANAdr=BCAN

23、_AMR; /写入参数if(*SJA_BCANAdr != BCAN_AMR) /校验写入值return 1; return 0;/*;*说明:设置 SJA1000 的输出模式和时钟分频 。该子程序只能用于复位模式 * * ;*/bit SET_OUTCLK (uchar Out_Control,uchar Clock_Out)SJA_BCANAdr=REG_OCR ; /访问地址指向输出控制寄存器*SJA_BCANAdr=Out_Control; /写入参数if(*SJA_BCANAdr != Out_Control) /校验写入值return 1; SJA_BCANAdr=REG_CDR;

24、 /访问地址指向时钟分频寄存器*SJA_BCANAdr=Clock_Out; /写入参数return 0;/*说明:CAN 控制器的初始化只能在复位模式下才能完成。初始化操作之前请先进入* 到复位操作模式,并将要初始化的各参数的值按数据手册中的计算方法,正 * 确的按实际需要计算好参数后,将参数写入对应的寄存器 。 */bit HW_INIT(uchar BCAN_ACR,uchar BCAN_AMR,uchar Bus_Timing0,uchar Bus_Timing1,uchar Out_Control,uchar Clock_Out) SJA_BCANAdr=REG_ACR; /访问地址

25、指向验收代码寄存器(ACR)*SJA_BCANAdr=BCAN_ACR; /写入参数if(*SJA_BCANAdr != BCAN_ACR) /校验写入值return 1; SJA_BCANAdr=REG_AMR; /访问地址指向验收屏蔽寄存器(AMR)*SJA_BCANAdr=BCAN_AMR; /写入参数if(*SJA_BCANAdr != BCAN_AMR) /校验写入值return 1; SJA_BCANAdr=REG_BTR0; /访问地址指向总线定时寄存器 0*SJA_BCANAdr=Bus_Timing0; /写入参数if(*SJA_BCANAdr != Bus_Timing0)

26、 /校验写入值return 1; SJA_BCANAdr=REG_BTR1; /访问地址指向总线定时寄存器 1*SJA_BCANAdr=Bus_Timing1; /写入参数if(*SJA_BCANAdr != Bus_Timing1) /校验写入值return 1; SJA_BCANAdr=REG_OCR ; /访问地址指向输出控制寄存器*SJA_BCANAdr=Out_Control; /写入参数if(*SJA_BCANAdr != Out_Control) /校验写入值return 1; SJA_BCANAdr=REG_CDR; /访问地址指向时钟分频寄存器*SJA_BCANAdr=Clo

27、ck_Out; /写入参数return 0; /*说明: 将待发送特定帧各式的数据,送入 SJA1000 发送缓存区中,然后启动 * SJA1000 发送。 * 特定帧格式为:开始的两个字节存放 描述符 ,以后的为数据 * 描述符包括 11 位长的 ID(标志符)1 位 RTR4 位描述数据长度的 DLC 共 16 位 */ bit DATA_WRITE(uchar *SendDataBuf)uchar TempCount;SJA_BCANAdr = REG_STATUS; /访问地址指向状态寄存器if(*SJA_BCANAdr if(*SJA_BCANAdr SJA_BCANAdr = REG_TxBuf1; /访问地址指向发送缓冲区 1if(SendDataBuf1 /输入数据帧elseTempCount =2; /远程帧memcpy(SJA_BCANAdr,SendDataBuf,TempCount);return 0;/*说明:CAN 控制器接收数据,仅限于接收数据 *

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报