




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、CAN总线通信程序/CANUART的协议转换器/说明:/1单片机使用P89C61X2BA/-晶振11.0592MHZ/-CAN总线中断使用单片机的中断0,外部有上拉电阻,波特率可以设定/2,CAN总线发送采用查询方式,接收采用中断方式/3,看门狗复位时间1.2S/4,SJA1000晶振8MHZ,Peil模式/5,串口中断接收,查询发送,波特率可设置/6,xxx当串口收到数据后,每8个数一组打包,通过CAN总线发送出去/10.16日,重新修改程序完成以下功能/-此功能已经改为,每收到一帧数据,启动一次CAN传输,传输字节数等于串口收到的数据/串行帧的帧间界定通过当前波特率下传输5个字节为时间间隔
2、,具体为当顺序接收到的任意两个数据,它们之间的时间间隔大于5个字节传送时间,认为这两个数据分属于两个不同的帧/7,当CAN总线每接收一帧信息后,通过串口发送出去/改为可以识别CAN的报文字节长度,即串口只发送CAN报文长度个字节/8,看门狗芯片MAX1232CPA,硬件溢出时间1.2S/#include#include#include#includeCANCOM.hunsignedcharUART_TX_Data8=0,1,2,3,4,5,6,7;unsignedcharCAN_TX_Data8=0,1,2,3,4,5,6,7;unsignedcharxdataUART_RX_Data255;
3、/串口接收到的串行帧unsignedcharxdataCAN_TX_Data255;/待发送的数据缓冲区unsignedcharcodeACR_ID4=0,0,0,0;/CAN初始设置验收滤波值unsignedcharcodeAMR_ID4=0 xff,0 xff,0 xff,0 xff;unsignedcharCAN_TX_ID4=0,0,0,0;待发送的目标的IDunsignedcharCAN_RX_ID4=0,0,0,0;接收到的信息来自何IDunsignedcharCAN_RX_Data8=7,6,5,4,3,2,1,0;/接受到的数据缓冲unsignedcharcodeCAN_BTR
4、010=0 xdf,0 xcf,0 xc7,0 xc3,0 x43,0 xc1,0 xc1,0 xc0,0 xc0,0 x80;unsignedcharcodeCAN_BTR110=0 x7f,0 x7f,0 x7f,0 x7f,0 x2f,0 x7f,0 x4d,0 x3e,0 x3a,0 x23;/5K10K20K40K50K80K100K200K250K500KunsignedcharcodeUART_BTR4=0 xe8,0 xf4,0 xfa;/1.2K,2.4K,4.8KunsignedcharCAN_flag;/CAN发送标志位unsignedcharUART_flag;/uns
5、ignedcharCAN_ERROR_flag=NOT;/unsignedcharCAN_DataLength=8;/CAN信息的报文长度unsignedcharUART_DataLength=0;/串口接收时的当前指示unsignedcharUART_Length=0;/串口接收区的长度指示/sbitAAA=P4;voidmain(void)EA=0;System_init();/系统初始化Timer_init();/定时器初始化Interrupt_init();/中断UART_ini();CAN_init();Delay(1);W_WDT();EA=1;/Delay(1);/UART_Le
6、ngth=8;/CAN_Transmit(0);/UART_Transmit();while(1)W_WDT();if(CAN_flag=YES)CAN_flag=NOT;CAN_Transmit(0);LED1=!LED1;elseCAN_flag=NOT;/*if(UART_flag=YES)UART_flag=NOT;/Delay(50);UART_Transmit();/Clear_Buffer(CAN_RX_Data,8);/LED3=!LED3;elseUART_flag=NOT;*/if(CAN_ERROR_flag=YES)CAN_ERROR_flag=NOT;CAN_init
7、();elseCAN_ERROR_flag=NOT;/功能:系统设置/-外部数据存储区访问使能/-LED指示灯关(1=on,0=off)/-流程控制标志置为无效NOT/-清空串口,CAN的相关数据缓冲区/voidSystem_init(void)CKCON=0 x00;/Foscdevide12AUXR=0 x00;/0 x02;/EXMenableLED1=0;/LED0-3off指示灯,共阴接法,1时亮LED2=0;LED3=0;LED4=0;WDT=1;/WDTiniCAN_DataLength=8;UART_DataLength=0;UART_Length=0;CAN_flag=NOT
8、;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);/*CAN_flag=YES;UART_flag=YES;*/软件延时(非精确)/内置清看门狗定时器子函数/防止多次调用延时过长导致/看门狗复位/voidDelay(unsignedchartime)unsignedchari;unsignedin
9、tj;for(i=0;itime;i+)W_WDT();for(j=0;j30000;j+)/串行口初始化设置/方式1,8数据位,一个停止位,无奇偶校验/串口中断允许/voidUART_ini(void)SCON=0 x50;方式1波特率可变,8bits,接受允许PCON&=0 x7F;/SMOD=0TMOD|=0 x20;/timer1mode2TL1=UART_BTR2;/|f|波特率=TH1=UART_BTR2;|32*2人smod*12*(256-TL1)TCON|=0 x40;/startTI=0;/看门狗喂狗程序,WDT的一个下降沿触发一次/voidW_WDT(void)/trig
10、gleWDTunsignedchari;WDT=1;for(i=0;iCAN_TX_buffer/voidTimer0_ISR(void)interrupt1using2staticunsignedchari;/unsignedcharcounter;/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信息传送for(i=0;iCAN_TX_Dat
11、ai=UART_RX_Datai;UART_Length=UART_DataLength;UART_DataLength=0;CAN_flag=YES;/串口中断服务程序/只有接收使用/每收一个数重新初始化定时器/voidRX_INT(void)interrupt4using3staticunsignedcharn;if(RI=1)doRI=0;while(RI!=0);/UART_RX_DataUART_DataLength+=SBUF;n=SBUF;UART_Send_Byte(n);TH0=temp_TH0;TL0=temp_TL0;TR0=1;/启动数据间隔定时,判断是否分属两帧els
12、e/TX/串口发送单字节程序/voidUART_Send_Byte(unsignedcharData)SBUF=Data;while(TI=0)/等待发送完毕TI=0;/初始化定时器程序/定时器0方式1,定时器1方式2留给串口/voidTimer_init(void)TMOD|=0 x01;/使用定时器0方式1TH0=temp_TH0;TL0=temp_TL0;/TR0=1;/这里不打开定时器voidCAN_init(void)EA=0;MOD_CAN1|=0 x08;/单滤波方式doMOD_CAN1|=0 x01;/requesttoresetmodewhile(MOD_CAN1&0 x01
13、)!=0 x01);CDR_CAN1=0 xc8;选择PeliCAN模式,使用输入比较器,clk_out关闭IER_CAN1=0 x01;/允许发送中断,其他中断禁能ACR0_CAN1=ACR_ID0;ACR1_CAN1=ACR_ID1;ACR2_CAN1=ACR_ID2;ACR3_CAN1=ACR_ID3;AMR0_CAN1=AMR_ID0;AMR1_CAN1=AMR_ID1;AMR2_CAN1=AMR_ID2;AMR3_CAN1=AMR_ID3;/ECC_CAN1=0;/TXERR_CAN1=0;/RBSA_CAN1=0;BTR0_CAN1=CAN_BTR00;BTR1_CAN1=CAN_
14、BTR10;OCR_CAN1=0 xaa;/normaloutputW_WDT();doMOD_CAN1&=0 xfe;while(MOD_CAN1&0 x01)!=0 x00);EA=1;/串口发送一帧接受到的CAN数据/长度18,根据接收到的CAN信息来确定/voidUART_Transmit(void)/using0unsignedchari;LED3=!LED3;for(i=0;iUART_Send_Byte(CAN_RX_Datai);/CAN发送接受到的一帧串口数据/最大长度255,根据接收到的串口信息的/个数来确定/-按每依次8个数据作为一个CAN帧的报文部分/不足8个或超过8的
15、倍数的部分按实际个数作/为CAN报文/FarmeType=1为扩展帧,FarmeType=0为/标准帧/voidCAN_Transmit(bitFarmeType)unsignedchari;unsignedcharm;unsignedcharcan_status;unsignedcharxdata*pointer;if(FarmeType=0)/标准帧for(m=0;m(UART_Length/8);m+)W_WDT();do/发送缓冲区空么?can_status=SR_CAN1;while(can_status&0 x04)!=0 x04);TXFrameInfo1=0 x00+0 x08
16、;pointer=&TXID1;for(i=0;i2;i+)*(pointer+)=CAN_TX_IDi;pointer=&TXID3;for(i=0;i8;i+)*(pointer+)=CAN_TX_Datai+8*m;CMR_CAN1=Request_TX;W_WDT();if(UART_Length%8)!=0)W_WDT();do/发送缓冲区空么?can_status=SR_CAN1;while(can_status&0 x04)!=0 x04);TXFrameInfo1=0 x00+UART_Length%8;pointer=&TXID1;for(i=0;i2;i+)*(pointe
17、r+)=CAN_TX_IDi;pointer=&TXID3;for(i=0;i(UART_Length%8);i+)*(pointer+)=CAN_TX_Datai+8*(UART_Length/8);CMR_CAN1=Request_TX;W_WDT();elseelse/扩展帧for(m=0;m(UART_Length/8);m+)W_WDT();do/发送缓冲区空么?can_status=SR_CAN1;while(can_status&0 x04)!=0 x04);TXFrameInfo1=0 x80+0 x08;pointer=&TXID1;for(i=0;i4;i+)*(point
18、er+)=CAN_TX_IDi;pointer=&TXDATA1;for(i=0;i8;i+)*(pointer+)=CAN_TX_Datai+8*m;CMR_CAN1=Request_TX;W_WDT();if(UART_Length%8)!=0)W_WDT();do/发送缓冲区空么?can_status=SR_CAN1;while(can_status&0 x04)!=0 x04);TXFrameInfo1=0 x80+UART_Length%8;pointer=&TXID1;for(i=0;i4;i+)*(pointer+)=CAN_TX_IDi;pointer=&TXDATA1;for(i=0;i(UART_Length%8);i+)*(pointer+)=CAN_TX_Datai+8*(UART_Length/8);CMR_CAN1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论