欢迎来到天天文库
浏览记录
ID:15801292
大小:88.00 KB
页数:9页
时间:2018-08-05
《pic单片机c语言编程实例五》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、第9章PIC16F87X在CAN通信中的应用9.3软件清单//========CAN通信程序=======#include#include#include//MCP2510寄存器定义//=========常数和变量定义=========#defineREAD0x03//读MCP2510指令代码#defineWRITE0x02//写MCP2510指令代码#defineRESET0xC0//复位MCP2510指令代码#defineRTS0x80//MCP2510请求发送指令代码#defineSTA25100xA
2、0//读MCP2510状态指令代码#defineBITMOD0x05//MCP2510位修改指令代码inta[12];//SPI发送或接收数据寄存器intb[8];//发送或接收的数据intc[8];//发送或接收的数据inti;//临时变量intcount;//发送接收计数器intcount1=0;//fortestintRecID_H=0;intRecID_L=0;intDLC=8;voidSPIINT();voidTMR1INT();voidCCP1INT();voidSPIEXCHANGE(intcount);voidWAIT_SPI();voidRESET2
3、510();intRD2510(intadress,intn);voidWR2510(intadress,intn);voidRTS2510(intRTSn);intGETS2510();voidBM2510(intadress,intmask,intdata);voidSETNORMAL();voidTXCOMPLETE(intadress);voidTXMSG(intDLC);162intRXMSG();voidINIT2510();voidINIT877();voidINITSPI();voidACK();voidwait();//========主程序====
4、===main(void){intl,detect=0;SSPIE=1;TMR1IE=1;CCP1IE=1;CCP2IE=1;PEIE=1;ei();//开中断INIT877();//初始化PIC16F877芯片INITSPI();//初始化SPI接口INIT2510();//初始化MCP2510芯片flag1=0;flag2=0;CCP1CON=0x05;CCP2CON=0x04;while(1){RXMSG();TXMSG(8);}}//========中断服务程序=======//SPI中断服务子程序voidSPIINT(){SSPIF=0;a[i++]=SSP
5、BUF;//数据暂存a[]中count-=1;if(count>0)SSPBUF=a[i];//未发送完,继续elseRE2=1;//否则,片选信号置高电平return;162}//TMR1中断服务子程序voidTMR1INT(){TMR1IF=0;T1CON=0;if(!flag1){TMR1H=0xfe;//512μs脉冲宽度TMR1L=0x00;T1CON=0x01;PORTD=0xff;//输出所有通道flag1=1;}else{flag1=0;PORTD=0;T1CON=0;}return;}//CCP1中断服务子程序voidCCP1INT(){CCP1IF
6、=0;T1CON=0x01;return;}//CCP2中断服务子程序voidCCP2INT(){CCP2IF=0;T1CON=0x01;return;}//中断入口,保护现场,判中断类型voidinterruptINTS(){di();162if(TMR1IF)TMR1INT();//定时器TMR1中断elseif(CCP1IF)CCP1INT();//电压过零捕捉中断1elseif(CCP2IF)CCP2INT();//电压过零捕捉中断2elseif(SSPIF)SPIINT();//SPI接口中断ei();}//========子程序=======//启动SPI
7、传送voidSPIEXCHANGE(count)intcount;{if(count>0){//有数据可送?i=0;RE2=0;//片选位置低电平SSPBUF=a[i];//送数}else;//否则,空操作,并返回return;}//等待SPI传送完成voidWAIT_SPI(){do{;}while(count>0);//当count!=0时,等待toadd"CLRWDT"return;}//对MCP2510芯片进行复位voidRESET2510(){a[0]=RESET;count=1;SPIEXCHANGE(count);//送复位指令WAIT
此文档下载收益归作者所有