***********************RS485.c文件程序源代码*************************#includereg52.h#includeintrins.hSbitRS485_DIR=P1^7;//RS485方向选择引脚bit flagOnceTxd = 0; //单次发送完成标志,即发送完一个字节bit cmdArrived = 0; //命令到达标志,即接收到上位机下发的命令unsigned char cntRxd = 0;unsigned char pdata bufRxd[40]; //串口接收缓冲区 void ConfigUART(unsigned int baud) //串口配置函数,baud为波特率{ RS485_DIR = 0; //RS485设置为接收方向 SCON = 0x50; //配置串口为模式1 TMOD &= 0x0F; //清零T1的控制位 TMOD |= 0x20; //配置T1为模式2 TH1 = 256 - (11059200/12/32) / baud; //计算T1重载值 TL1 = TH1; //初值等于重载值 ET1 = 0; //禁止T1中断 ES = 1; //使能串口中断 TR1 = 1; //启动T1}unsigned char UartRead(unsigned char *buf, unsigned char len) //串口数据读取函数,数据接收指针buf,读取数据长度len,返回值为实际读取到的数据长度{ unsigned char i; if (len > cntRxd) //读取长度大于接收到的数据长度时, { len = cntRxd; //读取长度设置为实际接收到的数据长度 } for (i=0; i<len; i++) //拷贝接收到的数据 { *buf = bufRxd[i]; buf++; } cntRxd = 0; //清零接收计数器 return len; //返回实际读取长度}void DelayX10us(unsigned char t) //软件延时函数,延时时间(t*10)us{ do { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } while (--t);}void UartWrite(unsigned char *buf, unsigned char len) //串口数据写入函数,即串口发送函数,待发送数据指针buf,数据长度len{ RS485_DIR = 1; //RS485设置为发送 while (len--) //发送数据 { flagOnceTxd = 0; SBUF = *buf; buf++; while (!flagOnceTxd); } DelayX10us(5); //等待最后的停止位完成,延时时间由波特率决定 RS485_DIR = 0; //RS485设置为接收} void UartDriver() //串口驱动函数,检测接收到的命令并执行相应动作{ unsigned char len; unsigned char buf[30]; if (cmdArrived) //有命令到达时,读取处理该命令 { cmdArrived = 0; len = UartRead(buf, sizeof(buf)-2); //将接收到的命令读取到缓冲区中 buf[len++] = '\r'; //在接收到的数据帧后添加换车换行符后发回 buf[len++] = '\n'; UartWrite(buf, len); }} void UartRxMonitor(unsigned char ms) //串口接收监控函数{ static unsigned char cntbkp = 0; static unsigned char idletmr = 0; if (cntRxd > 0) //接收计数器大于零时,监控总线空闲时间 { if (cntbkp != cntRxd) //接收计数器改变,即刚接收到数据时,清零空闲计时 {  nbsp; cntbkp = cntRxd; idletmr = 0; } &nb