您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 绩效管理 > 基于CAN总线的远距离水位监控系统
/*描述:独立的CAN控制器SJA1000基本硬件头文件定义BasicCAN工作方式*/#includestring.h#includereg51.h#includestdio.h#includeintrins.h#includeabsacc.h#defineucharunsignedchar#defineuintunsignedintsbitCS7221=P1^1;//7221的片选sbitDIN7221=P1^0;//7221的数据端sbitCLK7221=P1^2;//7221的时钟端sbitwr_0804=P3^7;//0804读端sbitrd_0804=P3^6;//0804写端sbitintr_0804=P2^2;//0804中断端sbitcs_0804=P2^1;//0804片选端uchartemp,c[4];//温度暂存ucharDATA_BUF[6];//发送数据暂存/*************************************************************************SJA1000与微处理器的接口是以外部存储器的方式,所以以下的基址定义,用户**应根据自己的实际电路来进行调整*************************************************************************/#defineSJA_Adr0xfe00//定义sja1000的片选基址//计算SJA1000在电路中的实际地址:基址+内部寄存器地址/*************************************************************************以下的定义为SJA1000的内部寄存器的地址,不可修改**各寄存器的具体功能清参阅sja1000的数据手册*************************************************************************/#defineREG_CONTROLSJA_Adr+0x00//内部控制寄存器#defineREG_COMMANDSJA_Adr+0x01//命令寄存器#defineREG_STATUSSJA_Adr+0x02//状态寄存器#defineREG_INTERRUPTSJA_Adr+0x03//中断寄存器#defineREG_ACRSJA_Adr+0x04//验收代码寄存器#defineREG_AMRSJA_Adr+0x05//验收屏蔽寄存器#defineREG_BTR0SJA_Adr+0x06//总线定时寄存器0#defineREG_BTR1SJA_Adr+0x07//总线定时寄存器1#defineREG_OCRSJA_Adr+0x08//输出控制寄存器#defineREG_TESTSJA_Adr+0x09//测试寄存器//以下为发送缓冲区寄存器定义#defineREG_TxBuf1SJA_Adr+0x0A//发送缓冲区1#defineREG_TxBuf2SJA_Adr+0x0B//发送缓冲区2#defineREG_TxBuf3SJA_Adr+0x0C//发送缓冲区3#defineREG_TxBuf4SJA_Adr+0x0D//发送缓冲区4#defineREG_TxBuf5SJA_Adr+0x0E//发送缓冲区5#defineREG_TxBuf6SJA_Adr+0x0F//发送缓冲区6#defineREG_TxBuf7SJA_Adr+0x10//发送缓冲区7#defineREG_TxBuf8SJA_Adr+0x11//发送缓冲区8#defineREG_TxBuf9SJA_Adr+0x12//发送缓冲区9#defineREG_TxBuf10SJA_Adr+0x13//发送缓冲区10//以下为接收缓冲区寄存器定义#defineREG_RxBuf1SJA_Adr+0x14//接收缓冲区1#defineREG_RxBuf2SJA_Adr+0x15//接收缓冲区2#defineREG_RxBuf3SJA_Adr+0x16//接收缓冲区3#defineREG_RxBuf4SJA_Adr+0x17//接收缓冲区4#defineREG_RxBuf5SJA_Adr+0x18//接收缓冲区5#defineREG_RxBuf6SJA_Adr+0x19//接收缓冲区6#defineREG_RxBuf7SJA_Adr+0x1A//接收缓冲区7#defineREG_RxBuf8SJA_Adr+0x1B//接收缓冲区8#defineREG_RxBuf9SJA_Adr+0x1C//接收缓冲区9#defineREG_RxBuf10SJA_Adr+0x1D//接收缓冲区10/*************************************************************************内部地址01EH备用*************************************************************************//*************************************************************************时钟分频寄存器(内部地址01FH)*************************************************************************/#defineREG_CDRSJA_Adr+0x1F//时钟分频寄存器/*************************************************************************定义指针*************************************************************************/ucharxdata*SJA_BCANAdr;/*************************************************************************定义命令字*************************************************************************/#defineTR_CMD0x01//发送请求命令#defineAT_CMD0x02//夭折发送命令#defineRRB_CMD0x04//释放接收缓冲区#defineCOS_CMD0x08//清除超载状态#defineGTS_CMD0x10//进入睡眠状态命令/*************************************************************************定义12M的晶体下,CAN总线波特率*************************************************************************/#definebps_20k0x00//波特率20kbps#definebps_40k0x01//波特率40kbps#definebps_50k0x02//波特率50kbps#definebps_80k0x03//波特率80kbps#definebps_100k0x04//波特率100kbps#definebps_125k0x05//波特率125kbps#definebps_200k0x06//波特率200kbps#definebps_250k0x07//波特率250kbps#definebps_400k0x08//波特率400kbps#definebps_500k0x09//波特率500kbps#definebps_666k0x0a//波特率666kbps#definebps_800k0x0b//波特率800kbps#definebps_1000k0x0c//波特率1000kbps/*-------------------------------------------------------------------------------------------*以下为BASICCANSJA1000的错误字*-------------------------------------------------------------------------------------------*/#defineINTERFACE_0K0//SJA1000接口正常#defineBUS_0K0//CAN总线工作正常#defineINTERFACE_ERR0XFF//SJA1000接口错误?#defineENTRESET_ERR0XFE//SJA1000不能进入复位模式#defineQUITRESET_ERR0XFD//SJA1000不能退出复位模式#defineINITOBJECT_ERR0XFC//初始化报文验收滤波器错#defineINITBTR_ERR0XFB//初始化总线定时器器错#defineINITOUTCTL_ERR0XFA//初始化输出控制错误#defineINTCLKDIV_ERR0XF9//初始化时钟分频控制器错#defineBUS_ERR0XF8//SJA1000发送数据错#defineNO_BANDRATE_SIZE0xe7///*************************************************************************以下为基本的函数说明(BasicCAN)*************************************************************************/bitCREATE_COMMUNATION(void);//检测CAN控制器的接口是否正常bitENTER_RETMODEL(void);//CAN控制器进入复位工作模式bitQUIT_RETMODEL(void);//CAN控制器退出复位工作模式bitSET_BANDRATE(ucharCAN_bps);//设置CAN控制器SJA1000通信波特率bitSET_OBJECT(ucharBCAN_ACR,ucharBCAN_AMR);//设置CAN节点的通讯对象bitSET_OUTCLK(ucharOut_Control,ucharClock_Out);//设置SJA1000的输出模式和时钟分频bitHW_INIT(ucharBCAN_ACR,ucharBCAN_AMR,ucharBus_Timing0,ucharBus_Timing1,ucharOut_Control,ucharClock_Out);//CAN控制器的初始化bitDATA_WRITE(uchar*SendDataBuf);//发送特定帧各式的数据bitRECEIVE(uchar*RcvDataBuf);//CAN控制器接收数据bitCMD_PRG(ucharcmd);//执行sja1000命令voidsja1000();//SJA1000初始化voidInitial7221(void);//MAX7221初始化voidWR7221(ucharaddr,ucharData);//MAX7221写程序voidMax7221Display(uchar*buffer);//MAX7221显示程序voidread_0804();//读AD转换电压值voidwdcl_0804();//转换电压值voiddelay(uintn);//延时程序main(){sja1000();//SJA1000初始化while(1){uchark;read_0804();//读AD转换电压值wdcl_0804();//
本文标题:基于CAN总线的远距离水位监控系统
链接地址:https://www.777doc.com/doc-2568851 .html