基于CAN总线的远距离水位监控系统_第1页
基于CAN总线的远距离水位监控系统_第2页
基于CAN总线的远距离水位监控系统_第3页
基于CAN总线的远距离水位监控系统_第4页
基于CAN总线的远距离水位监控系统_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

-.z基于CAN总线的远距离水位监控系统.t*t你出生的时候,你哭着,周围的人笑着;你逝去的时候,你笑着,而周围的人在哭!喜欢*些人需要一小时,爱上*些人只需要一天,而忘记一个人得用一生/*描述:独立的CAN控制器SJA1000根本硬件头文件定义BasicCAN工作方式*/*include<string.h>*include<reg51.h>*include<stdio.h>*include<intrins.h>*include<absacc.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与微处理器的接口是以外部存储器的方式,所以以下的基址定义,用户**应根据自己的实际电路来进展调整*************************************************************************/*define SJA_Adr 0*fe00 //定义sja1000的片选基址//计算SJA1000在电路中的实际地址:基址+内部存放器地址/*************************************************************************以下的定义为SJA1000的内部存放器的地址,不可修改**各存放器的具体功能清参阅sja1000的数据手册*************************************************************************/*define REG_CONTROL SJA_Adr+0*00 //内部控制存放器*define REG_MAND SJA_Adr+0*01 //命令存放器*define REG_STATUS SJA_Adr+0*02 //状态存放器*define REG_INTERRUPT SJA_Adr+0*03 //中断存放器*define REG_ACR SJA_Adr+0*04 //验收代码存放器*define REG_AMR SJA_Adr+0*05 //验收屏蔽存放器*define REG_BTR0 SJA_Adr+0*06 //总线定时存放器0*define REG_BTR1 SJA_Adr+0*07 //总线定时存放器1*define REG_OCR SJA_Adr+0*08 //输出控制存放器*define REG_TEST SJA_Adr+0*09 //测试存放器//以下为发送缓冲区存放器定义*define REG_T*Buf1 SJA_Adr+0*0A //发送缓冲区1*define REG_T*Buf2 SJA_Adr+0*0B //发送缓冲区2*define REG_T*Buf3 SJA_Adr+0*0C //发送缓冲区3*define REG_T*Buf4 SJA_Adr+0*0D //发送缓冲区4*define REG_T*Buf5 SJA_Adr+0*0E //发送缓冲区5*define REG_T*Buf6 SJA_Adr+0*0F //发送缓冲区6*define REG_T*Buf7 SJA_Adr+0*10 //发送缓冲区7*define REG_T*Buf8 SJA_Adr+0*11 //发送缓冲区8*define REG_T*Buf9 SJA_Adr+0*12 //发送缓冲区9*define REG_T*Buf10 SJA_Adr+0*13 //发送缓冲区10//以下为接收缓冲区存放器定义*define REG_R*Buf1 SJA_Adr+0*14 //接收缓冲区1*define REG_R*Buf2 SJA_Adr+0*15 //接收缓冲区2*define REG_R*Buf3 SJA_Adr+0*16 //接收缓冲区3*define REG_R*Buf4 SJA_Adr+0*17 //接收缓冲区4*define REG_R*Buf5 SJA_Adr+0*18 //接收缓冲区5*define REG_R*Buf6 SJA_Adr+0*19 //接收缓冲区6*define REG_R*Buf7 SJA_Adr+0*1A //接收缓冲区7*define REG_R*Buf8 SJA_Adr+0*1B //接收缓冲区8*define REG_R*Buf9 SJA_Adr+0*1C //接收缓冲区9*define REG_R*Buf10 SJA_Adr+0*1D //接收缓冲区10/*************************************************************************内部地址01EH备用*************************************************************************//*************************************************************************时钟分频存放器(内部地址01FH)*************************************************************************/*defineREG_CDR SJA_Adr+0*1F //时钟分频存放器/*************************************************************************定义指针*************************************************************************/uchar *data *SJA_BCANAdr;/*************************************************************************定义命令字*************************************************************************/*defineTR_CMD 0*01 //发送请求命令*defineAT_CMD 0*02 //夭折发送命令*defineRRB_CMD 0*04 //释放接收缓冲区*defineCOS_CMD 0*08 //去除超载状态*defineGTS_CMD 0*10 //进入睡眠状态命令/*************************************************************************定义12M的晶体下,CAN总线波特率*************************************************************************/*definebps_20k 0*00 //波特率20kbps*definebps_40k 0*01 //波特率40kbps*definebps_50k 0*02 //波特率50kbps*definebps_80k 0*03 //波特率80kbps*definebps_100k 0*04 //波特率100kbps*definebps_125k 0*05 //波特率125kbps*definebps_200k 0*06 //波特率200kbps*definebps_250k 0*07 //波特率250kbps*definebps_400k 0*08 //波特率400kbps*definebps_500k 0*09 //波特率500kbps*definebps_666k 0*0a //波特率666kbps*define bps_800k 0*0b //波特率800kbps*definebps_1000k 0*0c //波特率1000kbps/*-------------------------------------------------------------------------------------------*以下为BASICCANSJA1000的错误字*-------------------------------------------------------------------------------------------*/*define INTERFACE_0K 0 //SJA1000接口正常*defineBUS_0K 0//CAN总线工作正常*defineINTERFACE_ERR 0*FF//SJA1000接口错误?*defineENTRESET_ERR 0*FE//SJA1000不能进入复位模式*defineQUITRESET_ERR 0*FD//SJA1000不能退出复位模式*defineINITOBJECT_ERR 0*FC//初始化报文验收滤波器错*defineINITBTR_ERR 0*FB//初始化总线定时器器错*defineINITOUTCTL_ERR0*FA//初始化输出控制错误*defineINTCLKDIV_ERR 0*F9//初始化时钟分频控制器错*defineBUS_ERR 0*F8//SJA1000发送数据错*defineNO_BANDRATE_SIZE0*e7 ///*************************************************************************以下为根本的函数说明〔BasicCAN)*************************************************************************/bitCREATE_MUNATION(void); //检测CAN控制器的接口是否正常bitENTER_RETMODEL(void); //CAN控制器进入复位工作模式bitQUIT_RETMODEL(void); //CAN控制器退出复位工作模式bitSET_BANDRATE(ucharCAN_bps); //设置CAN控制器SJA1000通信波特率bit SET_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); //MA*7221初始化voidWR7221(ucharaddr,ucharData); //MA*7221写程序voidMa*7221Display(uchar*buffer); //MA*7221显示程序voidread_0804(); //读AD转换电压值voidwdcl_0804(); //转换电压值voiddelay(uintn); //延时程序main(){ sja1000(); //SJA1000初始化 while(1) { uchark; read_0804(); //读AD转换电压值 wdcl_0804(); //转换电压值 Ma*7221Display(&c[0]); //显示 DATA_BUF[0]=0*aa; //ID高8位为10101010=0*aa DATA_BUF[1]=0*b4; //ID低3位为101数据帧数据长度为4位 for(k=0;k<=3;k++) //要发送的4位数据 { DATA_BUF[2+k]=c[k]; // } DATA_WRITE(&DATA_BUF[0]); //通过CAN总线向计算机发送数据 delay(100); //延时 } }/****adc0804******/voidread_0804() //读AD转换电压值{ intr_0804=1; cs_0804=1; wr_0804=1; rd_0804=1; intr_0804=0; _nop_();_nop_(); cs_0804=0; //0804片选有效 wr_0804=0; //0804写地址 _nop_();_nop_(); intr_0804=1; rd_0804=0; //0804读 _nop_();_nop_(); temp=P0; //读AD转换数据 cs_0804=1; wr_0804=1; rd_0804=1; }voidwdcl_0804(){ temp=(temp*2-273)*10; //提取一位小数 c[0]=temp/1000; //千位 c[1]=temp/100%10; //百位 c[2]=temp/10%10; //十位 c[3]=temp%10; //个位}voiddelay(uintn) //延时程序{uinti1,j1;for(i1=0;i1<n;i1++)for(j1=0;j1<1140;j1++);}voidWR7221(ucharaddr,ucharData) //MA*7221的写子程序{uchari;CS7221=0; //片选有效for(i=0;i<8;i++) //写8位地址{CLK7221=0; //时钟低DIN7221=(addr&(0*80>>i))?1:0; //先发高位依次到低位_nop_();_nop_();CLK7221=1; //时钟高上升沿锁数据_nop_();_nop_();}for(i=0;i<8;i++) //写8位数据{CLK7221=0; //时钟低DIN7221=(Data&(0*80>>i))?1:0; //先发高位依次到低位_nop_();_nop_();CLK7221=1; //时钟高上升沿锁数据_nop_();_nop_();}CS7221=1; //片选无效}voidInitial7221(void) //MA*7221初始化{ WR7221(0*0A,0*0A); //亮度地址0AH,0*00~0*0F,0*0F最亮 WR7221(0*0B,0*07); //扫描LED个数地址0BH,0*00~0*07,最多扫描8个数码管 WR7221(0*0C,0*01); //工作模式地址0*0C.0*00:关断;0*01:正常 WR7221(0*09,0*FF); //编码模式地址0*09.0*00~0*FF:哪一位为1,哪一位就支持编码}voidMa*7221Display(uchar*buffer) //MA*7221显示子程序{uchari;for(i=0;i<8;i++) //MA*7221的8个数码管显示{WR7221(i+1,*(buffer+i)); //调MA*7221的写子程序}}voidsja1000(){ do{;}while(CREATE_MUNATION()==1); //检测CAN控制器的接口是否正常 do{;}while(ENTER_RETMODEL()==1); //进入复位工作模式 HW_INIT(0*aa,0*00,0*c9,0*c9,0*ff,0*48); //CAN控制器的初始化 do{;}while(QUIT_RETMODEL()==1); //退出复位工作模式}/*************************************************************************说明:该函数用于检测CAN控制器的接口是否正常*************************************************************************/bitCREATE_MUNATION(void){ SJA_BCANAdr=REG_TEST; //测试存放器*SJA_BCANAdr=0*aa; //写入测试值if(*SJA_BCANAdr==0*aa){ return0; //读测试正确}else{ return1;}}/*************************************************************************说明:CAN控制器进入复位工作模式*************************************************************************/bitENTER_RETMODEL(void){ ucharTempData;SJA_BCANAdr=REG_CONTROL;//地址指向控制存放器TempData=*SJA_BCANAdr;//保存原始值*SJA_BCANAdr=(TempData|0*01);//置位复位请求if((*SJA_BCANAdr&0*01)==1){ return0;}else{ return1;}}/*************************************************************************说明:CAN控制器退出复位工作模式*************************************************************************/bitQUIT_RETMODEL(void){ucharTempData;SJA_BCANAdr=REG_CONTROL; //地址指向控制存放器TempData=*SJA_BCANAdr; //保存原始值*SJA_BCANAdr=(TempData&0*fe); //去除复位请求if((*SJA_BCANAdr&0*01)==0){ return0;//}else{ return1;//退出成功}}/************************************************************************;*说明:设置CAN控制器SJA1000通信波特率.SJA1000的晶振为必须为16MHZ,*;*其它晶体的频率的值的波特率,需自己计算。该子程序只能用于*;*复位模式*;************************************************************************/uchar code SJA_BTR_CODETAB[]={ 0*53,0*2F, //;20KBPS的预设值0*87,0*FF, //;40KBPS的预设值0*47,0*2F, //;50KBPS的预设值0*83,0*FF, //;80KBPS的预设值0*43,0*2f, //;100KBPS的预设值0*03,0*1c, //;125KBPS的预设值0*81,0*fa, //;200KBPS的预设值0*01,0*1c, //;250KBPS的预设值0*80,0*fa, //;400KBPS的预设值0*00,0*1c, //;500KBPS的预设值0*80,0*b6, //;666KBPS的预设值0*00,0*16, //;800KBPS的预设值0*00,0*14 //;1000KBPS的预设值};bitSET_BANDRATE(ucharCAN_bps){ ucharBTR0_num,BTR1_num; BTR0_num=SJA_BTR_CODETAB[CAN_bps*2]; BTR1_num=SJA_BTR_CODETAB[CAN_bps*2+1]; //将波特率的的预设值装入sja1000的总线定时器 SJA_BCANAdr=REG_BTR0; //地址指向总线定时存放器0 *SJA_BCANAdr=BTR0_num; //写入参数 if(*SJA_BCANAdr!=BTR0_num) //校验写入值 { return1; } SJA_BCANAdr=REG_BTR1; //地址指向总线定时存放器1 *SJA_BCANAdr=BTR1_num; //写入参数 if(*SJA_BCANAdr!=BTR1_num) //校验写入值 { return1; } return0;}/************************************************************************;*说明:设置CAN节点的通讯对象,允许接收的报文ID号的高8位(D10--D3)。*;*允许接收的报文,是由AMR和ACR共同决定的.*;*满足以下条件的ID号的报文才可以被接收*;*[〔ID.10-ID.3〕≡〔AC.7-AC.0〕]||〔AM.7-AM.0〕≡11111111*;*该子程序只能用于复位模式**;************************************************************************/bitSET_OBJECT(ucharBCAN_ACR,ucharBCAN_AMR){ SJA_BCANAdr=REG_ACR; //地址指向验收代码存放器(ACR) *SJA_BCANAdr=BCAN_ACR; //写入参数 if(*SJA_BCANAdr!=BCAN_ACR) //校验写入值 { return1; } SJA_BCANAdr=REG_AMR; //地址指向验收屏蔽存放器(AMR) *SJA_BCANAdr=BCAN_AMR; //写入参数 if(*SJA_BCANAdr!=BCAN_AMR) //校验写入值 { return1; } return0;}/************************************************************************;*说明:设置SJA1000的输出模式和时钟分频。该子程序只能用于复位模式**;************************************************************************/bitSET_OUTCLK(ucharOut_Control,ucharClock_Out){ SJA_BCANAdr=REG_OCR; //地址指向输出控制存放器 *SJA_BCANAdr=Out_Control; //写入参数 if(*SJA_BCANAdr!=Out_Control) //校验写入值 { return1; } SJA_BCANAdr=REG_CDR; //地址指向时钟分频存放器 *SJA_BCANAdr=Clock_Out; //写入参数 return0;}/************************************************************************说明:CAN控制器的初始化只能在复位模式下才能完成。初始化操作之前请先进入**到复位操作模式,并将要初始化的各参数的值按数据手册中的计算方法,正**确的按实际需要计算好参数后,将参数写入对应的存放器。*************************************************************************/bitHW_INIT(ucharBCAN_ACR,ucharBCAN_AMR,ucharBus_Timing0, ucharBus_Timing1,ucharOut_Control,ucharClock_Out){ SJA_BCANAdr=REG_ACR; //地址指向验收代码存放器(ACR) *SJA_BCANAdr=BCAN_ACR; //写入参数 if(*SJA_BCANAdr!=BCAN_ACR) //校验写入值 { return1; } SJA_BCANAdr=REG_AMR; //地址指向验收屏蔽存放器(AMR) *SJA_BCANAdr=BCAN_AMR; //写入参数 if(*SJA_BCANAdr!=BCAN_AMR) //校验写入值 { return1; } SJA_BCANAdr=REG_BTR0; //地址指向总线定时存放器0 *SJA_BCANAdr=Bus_Timing0; //写入参数 if(*SJA_BCANAdr!=Bus_Timing0) //校验写入值 { return1; } SJA_BCANAdr=REG_BTR1; //地址指向总线定时存放器1 *SJA_BCANAdr=Bus_Timing1; //写入参数 if(*SJA_BCANAdr!=Bus_Timing1) //校验写入值 { return1; } SJA_BCANAdr=REG_OCR; //地址指向输出控制存放器 *SJA_BCANAdr=Out_Control; //写入参数 if(*SJA_BCANAdr!=Out_Control) //校验写入值 { return1; } SJA_BCANAdr=REG_CDR; //地址指向时钟分频存放器 *SJA_BCANAdr=Clock_Out; //写入参数 return0;}/*************************************************************************说明:将待发送特定帧各式的数据,送入SJA1000发送缓存区中,然后启动**SJA1000发送。**特定帧格式为:开场的两个字节存放'描述符',以后的为数据**描述符包括11位长的ID(标志符〕\1位RTR\4位描述数据长度的DLC共16位*************************************************************************/bitDATA_WRITE(uchar*SendDataBuf){ ucharTempCount; SJA_BCANAdr=REG_STATUS; //地址指向状态存放器 if((*SJA_BCANAdr&0*08)==0) //判断上次发送是否完成 { return 1; } if((*SJA_BCANAdr&0*04)==0) //判断发送缓冲区是否锁定 { return 1; } SJA_BCANAdr=REG_T*Buf1; //地址指向发送缓冲区1 if((SendDataBuf[1]&0*10)==0) //判断RTR,从而得出是数据帧还是远程帧 { TempCount=(SendDataBuf[1]&0*0f)+2; //输入数据帧 } else { TempCount=2; //远程帧 } memcpy(SJA_BCANAdr,SendDataBuf,TempCount); return0;}/******************************

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论