基于C51的RS485通信.zip

  • 好梦来
    了解作者
  • C/C++
    开发工具
  • 44KB
    文件大小
  • zip
    文件格式
  • 1
    收藏次数
  • 1 积分
    下载积分
  • 3
    下载次数
  • 2018-01-25 16:52
    上传日期
基于C51的RS485通信,具有数据CRC校验功能。
基于C51的RS485通信.zip
  • lesson18_1
  • lesson18_1.uvgui.me
    171.7KB
  • lesson18_1.lnp
    76B
  • STARTUP.OBJ
    749B
  • RS485.LST
    6.4KB
  • lesson18_1.hex
    3.4KB
  • RS485.OBJ
    7KB
  • STARTUP.A51
    6.2KB
  • main.LST
    3.2KB
  • RS485.c
    3.7KB
  • lesson18_1.M51
    16KB
  • lesson18_1.uvproj
    13.9KB
  • STARTUP.LST
    13.7KB
  • lesson18_1.build_log.htm
    1.1KB
  • lesson18_1
    10.4KB
  • main.OBJ
    4.3KB
  • lesson18_1.uvopt
    7.1KB
  • main.c
    1.6KB
内容介绍
#include <reg52.h> #include <intrins.h> sbit RS485_DIR = P1^7; //RS485方向选择引脚 bit flagFrame = 0; //帧接收完成标志,即接收到一帧新数据 bit flagTxd = 0; //单字节发送完成标志,用来替代TXD中断标志位 unsigned char cntRxd = 0; //接收字节计数器 unsigned char pdata bufRxd[64]; //接收字节缓冲区 extern void UartAction(unsigned char *buf, unsigned char len); /* 串口配置函数,baud-通信波特率 */ void ConfigUART(unsigned int baud) { RS485_DIR = 0; //RS485设置为接收方向 SCON = 0x50; //配置串口为模式1 TMOD &= 0x0F; //清零T1的控制位 TMOD |= 0x20; //配置T1为模式2 TH1 = 256 - (22118400/12/32)/baud; //计算T1重载值 TL1 = TH1; //初值等于重载值 ET1 = 0; //禁止T1中断 ES = 1; //使能串口中断 TR1 = 1; //启动T1 } /* 软件延时函数,延时时间(t*10)us */ void DelayX10us(unsigned char t) { do { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } while (--t); } /* 串口数据写入,即串口发送函数,buf-待发送数据的指针,len-指定的发送长度 */ void UartWrite(unsigned char *buf, unsigned char len) { RS485_DIR = 1; //RS485设置为发送 while (len--) //循环发送所有字节 { flagTxd = 0; //清零发送标志 SBUF = *buf++; //发送一个字节数据 while (!flagTxd); //等待该字节发送完成 } DelayX10us(5); //等待最后的停止位完成,延时时间由波特率决定 RS485_DIR = 0; //RS485设置为接收 } /* 串口数据读取函数,buf-接收指针,len-指定的读取长度,返回值-实际读到的长度 */ unsigned char UartRead(unsigned char *buf, unsigned char len) { unsigned char i; if (len > cntRxd) //指定读取长度大于实际接收到的数据长度时, { //读取长度设置为实际接收到的数据长度 len = cntRxd; } for (i=0; i<len; i++) //拷贝接收到的数据到接收指针上 { *buf++ = bufRxd[i]; } cntRxd = 0; //接收计数器清零 return len; //返回实际读取长度 } /* 串口接收监控,由空闲时间判定帧结束,需在定时中断中调用,ms-定时间隔 */ void UartRxMonitor(unsigned char ms) { static unsigned char cntbkp = 0; static unsigned char idletmr = 0; if (cntRxd > 0) //接收计数器大于零时,监控总线空闲时间 { if (cntbkp != cntRxd) //接收计数器改变,即刚接收到数据时,清零空闲计时 { cntbkp = cntRxd; idletmr = 0; } else //接收计数器未改变,即总线空闲时,累积空闲时间 { if (idletmr < 30) //空闲计时小于30ms时,持续累加 { idletmr += ms; if (idletmr >= 30) //空闲时间达到30ms时,即判定为一帧接收完毕 { flagFrame = 1; //设置帧接收完成标志 } } } } else { cntbkp = 0; } } /* 串口驱动函数,监测数据帧的接收,调度功能函数,需在主循环中调用 */ void UartDriver() { unsigned char len; unsigned char pdata buf[40]; if (flagFrame) //有命令到达时,读取处理该命令 { flagFrame = 0; len = UartRead(buf, sizeof(buf)-2); //将接收到的命令读取到缓冲区中 UartAction(buf, len); //传递数据帧,调用动作执行函数 } } /* 串口中断服务函数 */ void InterruptUART() interrupt 4 { if (RI) //接收到新字节 { RI = 0; //清零接收中断标志位 if (cntRxd < sizeof(bufRxd)) //接收缓冲区尚未用完时, { //保存接收字节,并递增计数器 bufRxd[cntRxd++] = SBUF; } } if (TI) //字节发送完毕 { TI = 0; //清零发送中断标志位 flagTxd = 1; //设置字节发送完成标志 } }
评论
    相关推荐
    • C51-RS485.zip
      此程序是一份单片机与PC的485通讯程序,通过此程序,可检测单片机485铜须是否正常,在PC端发送数据通过单片机返回相同数据,即为正常.
    • AD9_C51_RS485.zip
      Altium Designer设计的基于51的最小系统,主要包括RS485控制器,温度传感器,51单片机,晶振,复位等功能模块
    • AT898252_RS485_C51.rar
      Example code for RS485 network sensor ( MCU AT898252, Keil C51)
    • RS485.zip
      RS485经典源程序代码,基于C51语言写法
    • 22-RS485.rar
      RS485 通信 在c51中实现以RS485口语外界的通信功能
    • RS485-MODBUS.rar
      RS485 总线测控模块的 MODBUS 扩展协议设计
    • RS485.rar
      51单片机RS485通信,包含所有的工程文件
    • RS485多机通信,带C51源程序,带仿真!
      RS485多机通信,Keil C51源程序,Proteus仿真!适合初学者与项目参考!
    • RS485通信程序.zip
      通常的微处理器都集成有 1 路或多路硬件 UART 通道,可以非常方便地... 本章将详细介绍 RS-485/422 原理与区别、元件选择、参考电路、通讯规约、程序设计 等方面的应用要点,以及在产品实践中总结出的一些经验、窍门。
    • Proteus7.12.rar
      Proteus7.12完美破解版.rar电路仿真软件很好用可以仿真单片数字模拟电路