RS485C程序源代码

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

***********************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

1 / 5
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功