下载

2下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 PIC单片机应用开发典型模块各章程序第五章程序

PIC单片机应用开发典型模块各章程序第五章程序.doc

PIC单片机应用开发典型模块各章程序第五章程序

WindomZhong
2018-09-08 0人阅读 举报 0 0 暂无简介

简介:本文档为《PIC单片机应用开发典型模块各章程序第五章程序doc》,可适用于IT/计算机领域

()串行通讯程序应用#include"fh"#include"intcxxh"#defineENABLE#defineDISABLE#defineTRUE#defineFAULT#defineRECEIVEEN#defineTRANSFEREN#pragmabitIOPORTB#pragmabitIOPORTB#pragmabitIOPORTB#pragmabitCENPORTC#pragmaorigin=xunsrctemp,rxbuf,uchCRCHi,uchCRCLo,addr,txbuf,receivecount,dishz,discurrentunssethz,setrununsdiserror,disrunningbitreceiveok,transferok,mscountok*TableofCRCvaluesforhighorderbyte*constcharauchCRCHi={x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x,x,xC,x,x}*TableofCRCvaluesforloworderbyte*constcharauchCRCLo={x,xC,xC,x,xC,x,x,xC,xC,x,x,xC,x,xC,xC,x,xCC,xC,xD,xCD,xF,xCF,xCE,xE,xA,xCA,xCB,xB,xC,x,x,xC,xD,x,x,xD,xB,xDB,xDA,xA,xE,xDE,xDF,xF,xDD,xD,xC,xDC,x,xD,xD,x,xD,x,x,xD,xD,x,x,xD,x,xD,xD,x,xF,x,x,xF,x,xF,xF,x,x,xF,xF,x,xF,x,x,xF,xC,xFC,xFD,xD,xFF,xF,xE,xFE,xFA,xA,xB,xFB,x,xF,xF,x,x,xE,xE,x,xEB,xB,xA,xEA,xEE,xE,xF,xEF,xD,xED,xEC,xC,xE,x,x,xE,x,xE,xE,x,x,xE,xE,x,xE,x,x,xE,xA,x,x,xA,x,xA,xA,x,x,xA,xA,x,xA,x,x,xA,xC,xAC,xAD,xD,xAF,xF,xE,xAE,xAA,xA,xB,xAB,x,xA,xA,x,x,xB,xB,x,xBB,xB,xA,xBA,xBE,xE,xF,xBF,xD,xBD,xBC,xC,xB,x,x,xB,x,xB,xB,x,x,xB,xB,x,xB,x,x,xB,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,xC,xC,xD,xD,xF,xF,xE,xE,xA,xA,xB,xB,x,x,x,x,x,x,x,x,xB,xB,xA,xA,xE,xE,xF,xF,xD,xD,xC,xC,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x}interruptserver(void){unstempintsaveregistersW,STATUS(andPCLATH)charsvFSR=FSRif(TIF){TMR=msinterruptPS=prescalevalue=:PS=KHz=KHz,K=KHz(ms)PS=mscountok=ENABLETIF=}if(INTF){INTF=}if(TMRIF){TMRIF=}if(RCIF){rctemp=RCREGif(receiveok==FAULT){if(mscountok)receivecount=if(receivecount<)rxbufreceivecount=rctempif(receivecount==addr==rxbuf)receiveok=TRUEreceivecount}mscountok=DISABLETMR=timerreset,countagainRCIF=}if(SSPIFSSPIE){SSPIF=}FSR=svFSRintrestoreregisters}pageunscrc(uns*puchMsg,unscrccount){unsuindexunstempuchCRCHi=xffuchCRCLo=xffwhile(crccount){uindex=uchCRCHi^*puchMsgpuchMsguchCRCHi=uchCRCLo^auchCRCHiuindexuchCRCLo=auchCRCLouindexcrccount}temp=(uns)uchCRCHi<<temp=temp|uchCRCLoreturntemp}pagevoidmain(void){unsiunstempTRISA=bTRISB=bRB(IO)RB(IO)RB(IO)>outputTRISC=bRC(RX)RC(TX)RC(CEN)>outputIO=IO=IO=addr=xdishz=discurrent=diserror=disrunning=bit>=stop,=runbit>=FR,=RRmscountok=DISABLEreceiveok=FAULTtransferok=TRUEreceivecount=CEN=RECEIVEENBRGH=SYNC=SPEN=TXIE=RCIE=TX=databittransferSPBRG=baudrate=M()=TXEN=CREN=receiveenableTCS=TIMERclock=Fosc=MHz=MHzTMR=PSA=使用预定标PS=预定标值=:PS=KHz=KHz,K=KHz(ms)PS=TIE=TIMER使能PEIE=GIE=rxbuf=xrxbuf=xrxbuf=xrxbuf=xbrxbuf=xrxbuf=xrxbuf=xrxbuf=xi=while(){if(receiveok==TRUE){temp=crc(rxbuf,)if(rxbuf==temphighrxbuf==templow){switch(rxbuf){casex:txbuf=rxbuftxbuf=rxbuftxbuf=bytecounttxbuf=datahighbyteswitch(rxbuf){case:txbuf=sethzsethzbreakcase:txbuf=setrunsetrunbreakcase:displayHztxbuf=dishzdatalowbytebreakcase:displaycurrenttxbuf=discurrentdatalowbytebreakcase:displayrunningstatetxbuf=disrunninghigh高字节txbuf=disrunninglow低字节breakcase:displayerrorcodetxbuf=diserrorhigh高字节txbuf=diserrorlow低字节}temp=crc(txbuf,)txbuf=temphightxbuf=templowtransferok=FAULTbreakcasex:txbuf=rxbuftxbuf=rxbuftxbuf=rxbuftxbuf=rxbuftxbuf=rxbuftxbuf=rxbuftxbuf=rxbuftxbuf=rxbufswitch(rxbuf){case:setHzsethz=rxbufbreakcase:setrunsetrun=rxbuf}transferok=FAULT}}receiveok=FAULT}if(TXIFTRMTtransferok==FAULT){CEN=TRANSFERENTXREG=txbufiiif(i==txbuf==){transferok=TRUEi=}if(i==txbuf==){transferok=TRUEi=}}if(TRMT)CEN=RECEIVEEN}}()单片机双机异步通信发送程序(PIC单片机)#include<pich>unsignedcharsend*定义数组存储发送数据*unsignedchark*定义全局变量**不带小数点的显示段码表**给数组赋初值子程序*voidfuzhi(){for(k=k<k){trank=k}}*SCI部件初始化子程序*voidsciint(){SPBRG=X*将传输的波特率设为约位秒*TXSTA=X*选择异步高速方式传输位数据*RCSTA=X*允许同步串行口工作*TRISC=TRISC=*将RC、RC设置为输入方式对外部呈高阻状态*}*主程序*main(){sciint()*SCI部件初始化*di()*中断禁止*TXEN=*发送允许*CREN=*接收数据允许*for(k=k<k){TXREG=sendk*发出个字符*while(){if(TXIF==)break}*等待写入完成*while(){if(RCIF==)break*若收到响应字节则终止等待*}RCREG=RCREG*读响应字节清RCIF*}while(){}}()单片机双机异步通信接收程序(PIC单片机)#include<pich>unsignedcharreceive*定义数组存储接收数据*unsignedchari*定义通用寄存器**SCI部件初始化子程序*voidsciint(){SPBRG=X*波特率设置与PIC相同为约位秒*TXSTA=X*异步高速传输*RCSTA=X*串行口工作使能*TRISC=TRISC=*将RC、RC设置为输入方式对外部呈高阻状态*}*主程序*main(){sciint()*SCI部件初始化*di()*中断禁止*CREN=*接收允许*TXEN=*发送允许*for(i=i<k){while(){if(RCIF==)break}*等待接收数据*receivek=RCREG*读取接收数据同时清RCIF*TXREG=recek*发送接收到的数据*while(){if(TXIF==)break}*等待写入完成*}while(){}}()单片机双机同步通信发送程序(PIC单片机)#include<pich>unsignedcharsend*定义数组存储发送数据*unsignedchark*定义通用寄存器**给发送数组赋初值子程序*voidfuzhi(){for(k=k<k){sendk=k}*发送个数据*}*SCI部件初始化子程序*voidsciint(){SPBRG=*将传输的波特率设为约位秒*TXSTA=X*选择主控方式*RCSTA=X*允许同步串行口工作*TRISC=TRISC=*将RC、RC设置为输入方式对外部呈高阻状态*}*主程序*main(){fuzhi()*给发送数组赋发送初值*sciint()*SCI部件初始化*di()*中断禁止*TXEN=*发送允许*while(){for(k=k<k){TXREG=sendk*发出个字符*while(){if(TXIF==)break}*等待上一个数据写入完成*}}*循环发送*}()单片机双机同步通信接收程序(PIC单片机)#include<pich>unsignedcharreceive*定义一个数组存储接收数据*unsignedchark*定义通用寄存器*unsignedinti*SCI部件初始化子程序*voidsciint(){TXSTA=X*选择同步从动方式*RCSTA=X*串行口工作使能*TRISC=TRISC=*将RC、RC设置为输入方式对外部呈高阻状态*}*主程序*main(){sciint()*SCI部件初始化*di()*中断禁止*CREN=*接收允许*for(k=k<k)receivek=xwhile(){while(){CREN=*允许连续接收*while(){if(RCIF==)break}*等待接收数据*k=receivek=RCREG*读取接收数据*if(OERR==){*如果有溢出错误,则处理*CREN=CREN=}if(recek==x)break*""为同步字符,只有接收到""时才进行下面的接收*}for(k=k<k){while(){if(RCIF==)break}*等待接收数据*receivek=RCREG*读取接收数据*if(OERR==){*如果有溢出错误则处理*CREN=CREN=}recek=recekxF*屏蔽高位防止干扰*}CREN=for(i=i)continuefor(i=i)continue*给予一定时间的延时再进行下一轮接收*}}()USB通讯模块程序联合体的定义typedefunioneppesflags{structflags{UCHARtimer:l定时器标志UCHARbusreset:总线复位标志UCHARsuspend:总线挂起标志UCHARsetuppacket:建立包标志UCHARremotewakeup:l远程唤醒标志UCHARinisr:D中断处理标志UCHARcontrolstate:控制状态标志UCHARconfiguration:l配置状态标志}bitsUSHORTvalue}EPPFLAGSvoidoutportb(UCHARaddr,UCHARdta){UCHARxdata*extaddressextaddress=addr*extaddress=dta}UCHARinportb(UCHARaddr){UCHARcUCHARxdata*extaddressextaddress=addrc=*extesaddressreturnc}命令接口函数VoidSetAddressEn(UCHARAddress,UCHAREnable)设置地址使能VoidSetEndpointEn(UCHAREnable)设置端点使能VoidSetMode(UCHARConfig,UCHARClkDiv)设置模式USHORTReadlnterruptRegister(void)读中断寄存器UCHARSelectEndpoint(UCHAREndp)选择端点UCHARReadLastTransactionStatus(UCHAREndp)读最后处理状态voidSetEndpointStatus(UCHARbEndp,UCHARStalled)设置端点状态voidSendResume(void)发送恢复UCHARReadEndpoint(UCHARendp,UCHAR*buf,UCHARlen)读端点缓冲区UCHARWriteEndpoint(UCHARendp,UCHAR*buf,UCHARten)写端点缓冲区以上所有命令都是通过调用底层函数实现的。以USHORTReadlnterruptRegister(void)函数为例其代码如下USHORTReadInterruptRegister(void)读中断寄存器返回其值{UCHARbUINTjoutportb(DCOMMAND,xF)输出命令编码b=inportb(DDATA)j=inportb(DDATA)j<<=对个字节进行组装j=breturnj}中断服务处理函数代码Usbisr()interrupt中断服务程序入口{DISABLE关中断UINTistbEPPflagsbitsinisr=置中断处理标志位ist=ReadInterruptRegister()读中断寄存器switch(ist){caseDINTBUSRESET:busreset()bEPPflagsbitsbusreset=breakcaseDINTSUSPENDCHANGE:bEPPflagsbitssuspend=breakcaseDINTENDPOIN:eptxdone()breakcaseDINTENDPOUT:eprxdone()breakcaseDINTENDPIN:eptxdone()breakcaseDINTENDPIOUT:eprxdone()breakcaseDINTENDPIN:maintxdone()breakcaseDINTENDPUT:mainrxdone()breakdefault:break}bEPPflagsbitsinisr=清中断处理标志位ENABLE开中断}主端点的收发函数voidmaintxdone(void)主端点发送{UCHARlenReadLastTransactionStatus()清ControlIn中断标志if(smainflag==)主端点缓冲区有数据{smainflag=len=WriteEndpoint(,EpBuf,rCount)tCount=len}}voidmainrxdone(void)主端点接收{UCHARlenReadLastTransactionStatus()清ControlIn中断标志Len=RcadEndpoint(,EpBuf,)if(len!=){smaiflag=rCount=len}}()CAN总线模块程序#include<pich>#include<picfxh>#include<mcph>MCP寄存器定义#defineREADx读MCP指令代码#defineWRITEx写MCP指令代码#defineRESETxC复位MCP指令代码#defineRTSxMCP请求发送指令代码#defineSTAxA读MCP状态指令代码#defineBITMODxMCP位修改指令代码intaSPI发送或接收数据寄存器intb发送或接收的数据intc发送或接收的数据inti临时变量intcount发送接收计数器intcount=测试用intRecIDH=intRecIDL=intDLC=voidSPIINT()voidTMRINT()voidCCPINT()voidSPIEXCHANGE(intcount)voidWAITSPI()voidRESET()intRD(intadress,intn)voidWR(intadress,intn)voidRTS(intRTSn)intGETS()voidBM(intadress,intmask,intdata)voidSETNORMAL()voidTXCOMPLETE(intadress)voidTXMSG(intDLC)intRXMSG()voidINIT()voidINIT()voidINITSPI()voidACK()voidwait()主程序main(void){intl,detect=SSPIE=TMRIE=CCPIE=CCPIE=PEIE=ei()开中断INIT()初始化PICF芯片INITSPI()初始化SPI接口INIT()初始化MCP芯片flag=flag=CCPCON=xCCPCON=xwhile(){RXMSG()TXMSG()}}中断服务程序SPI中断服务子程序voidSPIINT(){SSPIF=ai=SSPBUF数据暂存a中count=if(count>)SSPBUF=ai未发送完继续elseRE=否则片选信号置高电平return}TMR中断服务子程序voidTMRINT(){TMRIF=TCON=if(!flag){TMRH=xfeμs脉冲宽度TMRL=xTCON=xPORTD=xff输出所有通道flag=}else{flag=PORTD=TCON=}return}CCP中断服务子程序voidCCPINT(){CCPIF=TCON=xreturn}CCP中断服务子程序voidCCPINT(){CCPIF=TCON=xreturn}中断入口保护现场判中断类型voidinterruptINTS(){di()if(TMRIF)TMRINT()定时器TMR中断elseif(CCPIF)CCPINT()电压过零捕捉中断elseif(CCPIF)CCPINT()电压过零捕捉中断elseif(SSPIF)SPIINT()SPI接口中断ei()}功能子程序voidSPIEXCHANGE(count)启动SPI传送intcount{if(count>){有数据可送?i=RE=片选位置低电平SSPBUF=ai送数}else否则空操作并返回return}等待SPI传送完成voidWAITSPI(){do{}while(count>)当count!=时等待toadd"CLRWDT"return}对MCP芯片进行复位voidRESET(){a=RESETcount=SPIEXCHANGE(count)送复位指令WAITSPI()return}读取从地址"adress"开始的寄存器中的数据共n个存放在数组bn中intRD(adress,n)intadressintn{intja=READa=adressfor(j=j<nj)aj=count=n指令、地址和要得到的数据量nSPIEXCHANGE(count)WAITSPI()for(j=j<nj)bj=aj数据存到数组b中return}向从地址"adress"开始的寄存器写入数据共n个数据存放数组bn中voidWR(adress,n)intadressintn{intja=WRITEa=adressfor(j=j<nj)aj=bjcount=n指令、地址和要写入的数据量nSPIEXCHANGE(count)WAITSPI()return}MCP芯片请求发送程序voidRTS(RTSn)intRTSn{a=RTS^RTSncount=SPIEXCHANGE(count)发送MCP芯片请求发送指令WAITSPI()return}读取MCP芯片的状态intGETS(){a=STAa=count=SPIEXCHANGE(count)读取MCP芯片状态WAITSPI()b=a状态存到数组b中return}对MCP芯片进行位修改子程序voidBM(adress,mask,data)intadressintmaskintdata{a=BITMOD位修改指令a=adress位修改寄存器地址a=mask位修改屏蔽位a=data位修改数据count=SPIEXCHANGE(count)WAITSPI()return}设置MCP芯片为正常操作模式voidSETNORMAL(){intk=BM(CANCTRL,xe,x)设置为正常操作模式do{RD(CANSTAT,)k=bxe}while(k)确认已进入正常操作模式return}对MCP进行初始化voidINIT(){RESET()使芯片复位b=xb=xb=xWR(CNF,)波特率为Kbitsb=xb=xWR(RXMSIDH,)b=xb=xWR(RXFSIDH,)RX接收屏蔽位为过滤器为b=xWR(CANINTE,)CAN中断不使能SETNORMAL()设置为正常操作模式return}MCP芯片发送完成与否判断邮箱号为adressvoidTXCOMPLETE(adress)intadress{intk=do{RD(adress,)k=bx}while(k)确认是否已发送完毕toaddCLRWDTreturn}初始化PICF芯片voidINIT(){PORTA=PORTB=PORTC=PORTD=PORTE=TRISA=xffTRISB=xfdTRISC=xdSCK,SDO:输出,SDI:输入TRISD=TRISE=x片选CS信号输出PORTA=xffPORTB=xRST=PORTC=PORTD=xffPORTE=xreturn}初始化SPI接口voidINITSPI(){SSPCON=xSSPEN=SSP使能SSPSTAT=return}发送数据子程序voidTXMSG(intDLC){for(i=i<DLCi)bi=ciWR(TXBD,DLC)b=DLCWR(TXBDLC,)b=xb=RecIDHb=RecIDLWR(TXBCTRL,)RTS(x)请求发送TXCOMPLETE(TXBCTRL)等待发送完毕return}接收数据子程序intRXMSG(){intkRD(CANINTF,)k=bxif(k==){BM(CANINTF,x,x)RD(RXBSIDH,)RecIDH=bRecIDL=bxeRD(RXBDLC,)DLC=bxfRD(RXBD,DLC)for(i=i<DLCi)ci=bireturn}return}

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/21

PIC单片机应用开发典型模块各章程序第五章程序

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利