can總線通信程序_第1頁(yè)
can總線通信程序_第2頁(yè)
can總線通信程序_第3頁(yè)
can總線通信程序_第4頁(yè)
can總線通信程序_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、CAN總線通信程序/CANUART的協(xié)議轉(zhuǎn)換器/說(shuō)明:/1單片機(jī)使用P89C61X2BA/-晶振11.0592MHZ/-CAN總線中斷使用單片機(jī)的中斷0,外部有上拉電阻,波特率可以設(shè)定/2,CAN總線發(fā)送采用查詢方式,接收采用中斷方式/3,看門狗復(fù)位時(shí)間1.2S/4,SJA1000晶振8MHZ,Peil模式/5,串口中斷接收,查詢發(fā)送,波特率可設(shè)置/6,xxx當(dāng)串口收到數(shù)據(jù)后,每8個(gè)數(shù)一組打包,通過(guò)CAN總線發(fā)送出去/10.16日,重新修改程序完成以下功能/-此功能已經(jīng)改為,每收到一幀數(shù)據(jù),啟動(dòng)一次CAN傳輸,傳輸字節(jié)數(shù)等于串口收到的數(shù)據(jù)/串行幀的幀間界定通過(guò)當(dāng)前波特率下傳輸5個(gè)字節(jié)為時(shí)間間隔

2、,具體為當(dāng)順序接收到的任意兩個(gè)數(shù)據(jù),它們之間的時(shí)間間隔大于5個(gè)字節(jié)傳送時(shí)間,認(rèn)為這兩個(gè)數(shù)據(jù)分屬于兩個(gè)不同的幀/7,當(dāng)CAN總線每接收一幀信息后,通過(guò)串口發(fā)送出去/改為可以識(shí)別CAN的報(bào)文字節(jié)長(zhǎng)度,即串口只發(fā)送CAN報(bào)文長(zhǎng)度個(gè)字節(jié)/8,看門狗芯片MAX1232CPA,硬件溢出時(shí)間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;/待發(fā)送的數(shù)據(jù)緩沖區(qū)unsignedcharcodeACR_ID4=0,0,0,0;/CAN初始設(shè)置驗(yàn)收濾波值unsignedcharcodeAMR_ID4=0 xff,0 xff,0 xff,0 xff;unsignedcharCAN_TX_ID4=0,0,0,0;待發(fā)送的目標(biāo)的IDunsignedcharCAN_RX_ID4=0,0,0,0;接收到的信息來(lái)自何IDunsignedcharCAN_RX_Data8=7,6,5,4,3,2,1,0;/接受到的數(shù)據(jù)緩沖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發(fā)送標(biāo)志位unsignedcharUART_flag;/uns

5、ignedcharCAN_ERROR_flag=NOT;/unsignedcharCAN_DataLength=8;/CAN信息的報(bào)文長(zhǎng)度unsignedcharUART_DataLength=0;/串口接收時(shí)的當(dāng)前指示unsignedcharUART_Length=0;/串口接收區(qū)的長(zhǎng)度指示/sbitAAA=P4;voidmain(void)EA=0;System_init();/系統(tǒng)初始化Timer_init();/定時(shí)器初始化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;/功能:系統(tǒng)設(shè)置/-外部數(shù)據(jù)存儲(chǔ)區(qū)訪問使能/-LED指示燈關(guān)(1=on,0=off)/-流程控制標(biāo)志置為無(wú)效NOT/-清空串口,CAN的相關(guān)數(shù)據(jù)緩沖區(qū)/voidSystem_init(void)CKCON=0 x00;/Foscdevide12AUXR=0 x00;/0 x02;/EXMenableLED1=0;/LED0-3off指示燈,共陰接法,1時(shí)亮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;*/軟件延時(shí)(非精確)/內(nèi)置清看門狗定時(shí)器子函數(shù)/防止多次調(diào)用延時(shí)過(guò)長(zhǎng)導(dǎo)致/看門狗復(fù)位/voidDelay(unsignedchartime)unsignedchari;unsignedin

9、tj;for(i=0;itime;i+)W_WDT();for(j=0;j30000;j+)/串行口初始化設(shè)置/方式1,8數(shù)據(jù)位,一個(gè)停止位,無(wú)奇偶校驗(yàn)/串口中斷允許/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的一個(gè)下降沿觸發(fā)一次/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;/定時(shí)器關(guān),開始次CAN信息傳送for(i=0;iCAN_TX_Dat

11、ai=UART_RX_Datai;UART_Length=UART_DataLength;UART_DataLength=0;CAN_flag=YES;/串口中斷服務(wù)程序/只有接收使用/每收一個(gè)數(shù)重新初始化定時(shí)器/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;/啟動(dòng)數(shù)據(jù)間隔定時(shí),判斷是否分屬兩幀els

12、e/TX/串口發(fā)送單字節(jié)程序/voidUART_Send_Byte(unsignedcharData)SBUF=Data;while(TI=0)/等待發(fā)送完畢TI=0;/初始化定時(shí)器程序/定時(shí)器0方式1,定時(shí)器1方式2留給串口/voidTimer_init(void)TMOD|=0 x01;/使用定時(shí)器0方式1TH0=temp_TH0;TL0=temp_TL0;/TR0=1;/這里不打開定時(shí)器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關(guān)閉IER_CAN1=0 x01;/允許發(fā)送中斷,其他中斷禁能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;/串口發(fā)送一幀接受到的CAN數(shù)據(jù)/長(zhǎng)度18,根據(jù)接收到的CAN信息來(lái)確定/voidUART_Transmit(void)/using0unsignedchari;LED3=!LED3;for(i=0;iUART_Send_Byte(CAN_RX_Datai);/CAN發(fā)送接受到的一幀串口數(shù)據(jù)/最大長(zhǎng)度255,根據(jù)接收到的串口信息的/個(gè)數(shù)來(lái)確定/-按每依次8個(gè)數(shù)據(jù)作為一個(gè)CAN幀的報(bào)文部分/不足8個(gè)或超過(guò)8的

15、倍數(shù)的部分按實(shí)際個(gè)數(shù)作/為CAN報(bào)文/FarmeType=1為擴(kuò)展幀,F(xiàn)armeType=0為/標(biāo)準(zhǔn)幀/voidCAN_Transmit(bitFarmeType)unsignedchari;unsignedcharm;unsignedcharcan_status;unsignedcharxdata*pointer;if(FarmeType=0)/標(biāo)準(zhǔn)幀for(m=0;m(UART_Length/8);m+)W_WDT();do/發(fā)送緩沖區(qū)空么?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/發(fā)送緩沖區(qū)空么?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/擴(kuò)展幀for(m=0;m(UART_Length/8);m+)W_WDT();do/發(fā)送緩沖區(qū)空么?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/發(fā)送緩沖區(qū)空么?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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論