下载

1下载券

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

上传资料

关闭

关闭

关闭

封号提示

内容

首页 51单片机实现的RS485通讯程序

51单片机实现的RS485通讯程序.doc

51单片机实现的RS485通讯程序

360639329
2011-08-17 0人阅读 举报 0 0 暂无简介

简介:本文档为《51单片机实现的RS485通讯程序doc》,可适用于IT/计算机领域

单片机实现的通讯程序#ifndefC#defineC#include<regh>#include<stringh>#defineunsignedcharuchar#defineunsignedintuint*通信命令*#defineACTIVEx   主机询问从机是否存在#defineGETDATAx   主机发送读设备请求#defineOKx   从机应答#defineSTATUSx   从机发送设备状态信息#defineMAXSIZEx   缓冲区长度#defineERRLEN   任何通信帧长度超过则表示出错uchardbufMAXSIZE   该缓冲区用于保存设备状态信息uchardev   该字节用于保存本机设备号sbitMDE=P^   驱动器使能有效sbitMRE=P^   接收器使能有效voidgetstatus()   调用该函数获得设备状态信息函数代码未给出voidsenddata(uchartype,ucharlen,uchar*buf)   发送数据帧bitrecvcmd(uchar*type)   接收主机命令主机请求仅包含命令信息voidsendbyte(ucharda)   该函数发送一帧数据中的一个字节由senddata()函数调用voidmain(){uchartypeucharlen*系统初始化*P=xff   读取本机设备号dev=(P>>)TMOD=x定时器T使用工作方式TH=   设置初值TL=TR=   开始计时PCON=x   SMOD=SCON=x工作方式波特率bps允许接收ES=   关闭串口中断IT=   外部中断使用电平触发模式EX=   开启外部中断EA=   开启中断*主程序流程*while()   主循环{  if(recvcmd(type)==)   发生帧错误或帧地址与本机地址不符丢弃当前帧后返回   continue  switch(type)  {   caseACTIVE:   主机询问从机是否存在    senddata(OK,,dbuf)   发送应答信息这里buf的内容并未用到    break   caseGETDATA:    len=strlen(dbuf)    senddata(STATUS,len,dbuf)   发送设备状态信息    break   default:    break   命令类型错误丢弃当前帧后返回  }}}voidREADSTATUS()interruptusing   产生外部中断时表示设备状态发生改变该函数使用寄存器组{getstatus()   获得设备状态信息并将其存入dbuf指向的存储区数据最后一字节置表示数据结束}*该函数接收一帧数据并进行检测无论该帧是否错误函数均会返回*函数参数type保存接收到的命令字*当接收到数据帧错误或其地址位不为时(非主机发送帧)函数返回反之返回*bitrecvcmd(uchar*type){bitdb=   当接收到的上一个字节为xdb时该位置位bitc=   当接收到的上一个字节为xc时该位置位uchardatabufERRLEN   保存接收到的帧uchartmpucharecc=uchariMDE=   置发送禁止接收允许MRE=*接收一帧数据*i=while(!c)   循环直至帧接收完毕{  RI=  while(!RI)  tmp=SBUF  RI=  if(db==)   接收到的上一个字节为xdb  {   switch(tmp)   {    casexdd:     databufi=xdb   xdbdd表示xdb     ecc=ecc^xdb     db=     break    casexdc     databufi=xc   xdbdc表示xc     ecc=ecc^xc     db=     break    default     return   帧错误返回   }   i  }  switch(tmp)   正常情况  {   casexc:   帧结束    c=    break   casexdb:   检测到转义字符    db=    break   default:   普通数据    databufi=tmp   保存数据    ecc=ecc^tmp   计算校验字节    i  }  if(i==ERRLEN)   帧超长错误返回   return}*判断帧是否错误*if(i<)   帧过短错误返回  returnif(ecc!=)   校验错误返回  returnif(databuf!=dev)   非访问本机命令错误返回  return*type=databuf   获得命令字return   函数成功返回}*该函数发送一帧数据帧参数type为命令字、len为数据长度、buf为要发送的数据内容*voidsenddata(uchartype,ucharlen,uchar*buf){uchariucharecc=   该字节用于保存校验字节MDE=   置发送允许接收禁止MRE=sendbyte(dev)   发送本机地址ecc=devsendbyte(type)   发送命令字ecc=ecc^typesendbyte(len)   发送长度ecc=ecc^lenfor(i=i<leni)   发送数据{  sendbyte(*buf)  ecc=ecc^(*buf)  buf}sendbyte(ecc)   发送校验字节TI=   发送帧结束标志SBUF=xcwhile(!TI)TI=}*该函数发送一个数据字节若该字节为xdb则发送xdbdd若该字节为xc则发送xdbdc*voidsendbyte(ucharda){switch(da){  casexdb:   字节为xdb发送xdbdd   TI=   SBUF=xdb   while(!TI)   TI=   SBUF=xdd   while(!TI)   TI=   break  casexc:   字节为xc发送xdbdc   TI=   SBUF=xdb   while(!TI)   TI=   SBUF=xdc   while(!TI)   TI=   break  default:   普通数据则直接发送   TI=   SBUF=da   while(!TI)   TI=}}#endifRS接口实现计算机和单片机通信程序作者:佚名    来源:本站原创    点击数:…   更新时间:年月日    【字体:大中小】 HYPERLINK"http:wwwheicomahtm"t"blank"INCLUDEPICTURE"http:wwwheicombanjpg"*MERGEFORMATINET此程序通过RS接口来完成计算机和单片机通信(程序已用pf试验板上调试通过)程序的调试可以用"串口调试助手V"辅助完成此程序可在http:wwwheicom下载此程序首先发送测试数据H,再通过中断实现数据的接收和发送#include "pfh"void InterruptHandlerHigh(void)初始化程序void initial(){ SPBRG=X    选择传输波特率为bps TXSTA=X    选择异步高速方式传输位数据 RCSTA=X    允许同步串行口工作 TRISC=X    将RC,RC设置为输入断绝与外接电路的连接 TXSTAbitsTXEN=   发送允许 RCSTAbitsCREN=   接受数据允许 PIEbitsRCIE=   接收中断使能 INTCON=XC   总中断和外围中断允许}高优先级中断向量#pragmacodeInterruptVectorHigh=xvoid InterruptVectorHigh(void){ asm   gotoInterruptHandlerHigh  跳到中断程 endasm}高优先级中断服务程序#pragmacode#pragmainterruptInterruptHandlerHighvoid InterruptHandlerHigh(){ while(PIRbitsRCIF==)  若接收中断标志不为则为误操作,返回 {  TXREG=RCREG  将接收到的数据放入发送寄存器,并启动发送 }}主程序main(){ initial()     系统初始化  TXREG=X    发送数据H进行测试 for()}  汇编语言版本的RS接口实现计算机和单片机通信程序此程序通过RS接口来完成计算机和单片机通讯(程序以在pf试验板上调通)本单片机程序由http:wwwheicom提供此程序首先发送测试数据H再通过中断实现数据的接收和发送程序的调试可以用"串口调试助手V"辅助完成   LIST    P=f   INCLUDE   "PfINC"  ORG  x   GOTO MAIN  ORG  x   GOTO INTSERVE    ORG  X**************中断服务子程序***************INTSERVE  BTFSS PIRRCIF  接收中断标志为?  GOTO ERRRE   误操作返回                           MOVF RCREG   否则将接收到的数据通过W寄存器  MOVWF TXREG   放入发送寄存器并启动发送       ERRRE NOP  RETFIE****************初始化程序***************INITIAL NOP              MOVLW  X   选择传输波特率为bps       MOVWF  SPBRG           MOVLW  X   选择异步高速方式传输位数据        MOVWF  TXSTA        MOVLW  X   允许同步串行口工作        MOVWF  RCSTA        MOVLW  X   将RCRC设置为输入断绝与外接电路的连接        MOVWF  TRISC  BSF  TXSTATXEN  发送允许  BSF  RCSTACREN  接受数据允许   BSF     PIERCIE  接收中断使能  MOVLW  XC   总中断和外围中断允许  MOVWF  INTCON  RETURN**********************主程序*********************         MAIN    NOP        CLRWDT  CALL  INITIAL         MOVLW  X   发送数据H进行测试           MOVWF  TXREG LOOP        GOTO  LOOP        END两片单片机互相通信的串行通信程序(一个发送程序,一个接收程序):系统晶振是MHz单片机发送单片机程序此程序用Proteus仿真通过此程序在硬件上测试通过附有简化电路图为了使初学者能看懂程序与图尽可能的简单扼要实验现象为发送端的P口的哪个键被接下接收端的哪个灯对应着亮如果把两个单片机的T和R通过无线模块(如基于MCP芯片的模块)来扩充便可做成无线通信                   ORG                H                   AJMP               START                   ORG                HSTART:                   MOV                SP,#H                          MOV                SCON,#H                  串口方式                   MOV                TMOD,#H                  T方式                   MOV                TL,#FDH                  波特率的常数                   MOV                TH,#FDH                   SETB               TR                     mov                r,#h                   WAIT:                   mov              p,#ffh                   mov              a,p                   mov              r,a                   lcalldelay                     读键盘这里去抖动还要加几句话                   mov              a,p                    nop                   CJNE               A,,WAIT               是否有键输入                   MOV                SBUF,a                     串口输出键盘输入的值                   NOPSS:                JBC                TI,WAIT                    是否发送完毕                   SJMP               SSDELAY:                                     延时子程序                   PUSH                                         保存现场                   PUSH                                  MOV                ,#HDELAY:MOV                ,#H                   DJNZ               ,$                   DJNZ               ,DELAY                   POP                                          恢复现场                   POP                                   RET                   ENDHYPERLINK"http:hiphotosbaiducomxxjmcupicitemfcbcacajpg"t"blank"INCLUDEPICTURE"http:hiphotosbaiducomxxjmcuabpicitemfcbcacajpg"*MERGEFORMATINET系统晶振是MHz单片机接收单片机程序此程序用Proteus仿真通过此程序在硬件上测试通过附有简化电路图为了使初学者能看懂程序与图尽可能的简单扼要实验现象为发送端的P口的哪个键被接下接收端的哪个灯对应着亮如果把两个单片机的T和R通过无线模块(如基于MCP芯片的模块)来扩充便可做成无线通信                   ORG                H                   AJMP               START                   ORG                HSTART:                          MOV                SCON,#H                  串口方式                   MOV                TMOD,#H                  T方式                   MOV                TL,#FDH                  波特率的常数                   MOV                TH,#FDH                   SETB               TR                            WAIT:                   JBC                RI,DISREC                 是否接收到数据                          sjmp               waitDISREC:                   MOV                A,SBUF                     读串口接收到的数据                           mov                p,a                   SJMP               wait                   end单片机串行口通信程序设计例子时间::来源:未知作者:牛牛点击:次串行口方式应用编程单片机串行口方式为移位寄存器方式外接一个串入并出的移位寄存器就能扩展一个并行口。单片机串行口通信程序设计硬件连接图例:用单片机串行口外接CD扩展位并行输出口如图所示位并行口的各位都接一个发光二极管  串行口方式应用编程单片机串行口方式为移位寄存器方式外接一个串入并出的移位寄存器就能扩展一个并行口。<单片机串行口通信程序设计硬件连接图>例:用单片机串行口外接CD扩展位并行输出口如图所示位并行口的各位都接一个发光二极管要求发光管呈流水灯状态。串行口方式的数据传送可采用中断方式也可采用查询方式无论哪种方式都要借助于TI或RI标志。串行发送时能靠TI置位(发完一帧数据后)引起中断申请在中断服务程序中发送下一帧数据或者通过查询TI的状态只要TI为就继续查询TI为就结束查询发送下一帧数据。在串行接收时则由RI引起中断或对RI查询来确定何时接收下一帧数据。无论采用什么方式在开始通信之前都要先对控制寄存器SCON进行初始化。在方式中将将H送SCON就能了。单片机串行口通信程序设计列子ORGHSTART:MOVSCON,#H置串行口工作方式MOVA,#H最高位灯先亮CLRP关闭并行输出(避象传输过程中各LED的"暗红"现象)OUT:MOVSBUF,A开始串行输出OUT:JNBTI,OUT输出完否CLRTI完了清TI标志以备下次发送SETBP打开并行口输出ACALLDELAY延时一段时间RRA循环右移内容来自单片机之家wwwdpjcomCLRP关闭并行输出JMPOUT循环说明:DELAY延时子程序能用前面我们讲P口流水灯时用的延时子程序这里就不给出了

用户评价(0)

关闭

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

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

提示

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

文档小程序码

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

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/22

51单片机实现的RS485通讯程序

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利