精华内容
下载资源
问答
  • RS485多机通信程序(终结版AVR)
    千次阅读
    2012-04-02 14:48:03
    RS485多机通信程序(终结版AVR)

    RS485多机通信程序(终结版AVR)  


    单片机:AVR ATMEGA8
    通信:RS485
    芯片:MAX485/MAX487
    要求:一个主机从机三个以上。(本例使用3个从机)
    工作原理:
    三个从机:
    采集电压(1-5V),并把数据发给主机
    模数采样引脚PC0/ADC0
    MAX487的RE和DE连在一起,并接到PD3
    主机:
    MAX487的RE和DE连在一起,并接到PD3
    PC0-PC3接1602液晶的D4-D7 (只用4条数据线)
    PD7接LCD  E
    PC4接LCD  RW
    PC5接LCD  RS
    工作过程:
    从机等间隔进行进行AD采样
    1. 主机发送地址(adr):01 寻找01从机 ,01号从机收到后,把AD采回来的数据发给主机,主机把数

    据显示在LCD上。
    2. 从机改变发送02 找2号从机,重复步骤1。完了再发03。这样轮换的通信。
    程序在实际硬件上已经调试成功,验证了正确性,下面把程序贴出来供大家参考。
    采用9位数据帧
    下面是程序,使用ICCAVR软件编写
    主机程序:
    #include
    #include
    #pragma interrupt_handler uartrupt:12
    unsigned char temp; //接收临时变量
    unsigned char adr;  //从机地址及标志位
    const unsigned char LCD[]="IP01 IP02 IP03";
    const unsigned char LCDASC[]={0X30,0X31,0X32,0X33,0X34,0X35,0x36,0x37,0x38,0x39};
    unsigned char LCDA=0;
    unsigned char LCDB=0;
    unsigned char LCDC=0;
    //QQQQQQQQQQQQQQQQQQQ
    //名称:Delay()
    //功能:延时程序
    //QQQQQQQQQQQQQQQQQQQ

    void Delay(int t)
    {
    while(t--);
       
    }
    void LDelay(int t)//延时程序(时间较长)
    {
    for(;t>0;t--)
    {
      Delay(4000);
    }
       
    }


    //*************************************
    //名称:LCDCOM()与LCDTATA()LCDinit()
    //功能:1602液晶显示
    //*************************************
    void LCDCOM(unsigned char com)
    {
    unsigned char tempcom;
    tempcom = com;
    DDRC |=0X3F; //PORTC0-5 OUTPUT
    DDRD |=0X80;//pd7 output
    PORTC &=~0x20; //RS = 0
    com = com>>4;
    com =com&0x0f;
    PORTC &=0XF0; //低4位清零
    Delay(100);
    PORTC |=com;//写指令
    Delay(100);
    PORTD|=0x80; //EN
    Delay(100);
    PORTD&=~0x80;
    //LLLLLLLLLLL
    com = tempcom&0x0f;
    PORTC &=0XF0; //清零
    Delay(100);
    PORTC |=com;//写指令
    Delay(200);
    PORTD|=0x80; //EN
    Delay(100);
    PORTD&=~0x80;

    }
    void LCDTATA(unsigned char tata)
    {
    unsigned char temptata;
    temptata = tata;
    DDRC |=0X3F;
    DDRD |=0X80;//pd7 output
    PORTC|=0x20; //RS = 1
    tata= tata>>4;
    tata &= 0x0f;
    PORTC &=0XF0; //清零
    Delay(100);
    PORTC |=tata;//写指令
    Delay(100);
    PORTD|=0x80; //EN
    Delay(100);
    PORTD&=~0x80;
    //LLLLLLLLLLL
    tata = temptata&0x0f;
    PORTC &=0XF0; //清零
    Delay(100);
    PORTC |=tata;//写指令
    Delay(100);
    PORTD|=0x80; //EN
    Delay(100);
    PORTD&=~0x80;
    }
    void LCDinit()
    {
    LCDCOM(0X28);
    Delay(3000);
    LCDCOM(0X28);
    Delay(3000);
    LCDCOM(0X28);
    Delay(3000);
    LCDCOM(0X28);
    Delay(3000);  //while(t--) Delay(3000)以上
    LCDCOM(0X08);
    Delay(3000);
    LCDCOM(0X01);
    Delay(3000);
    LCDCOM(0X06);
    Delay(3000);
    LCDCOM(0X0c);
    Delay(3000);
    LCDCOM(0x01);//清屏

    }

    //======================
    //名称:USARTinit()
    //功能:串行通信初始化,设置引脚功能,波特率,通信方式
    //波特率=fosc/16(ubrr+1)
    //======================
    void USARTinit()
    {
    UBRRL=25; //波特率2400 //UCSRA 正常波特率
    //UBRRH=0x00;
    UCSRA=0X0;
    UCSRB=0X0;
    //UCSRA=RXC|TXC|UDRE|FE|DOR|PE|U2X|MPCM(10100001)
    UCSRA=0X0;//接收数据  
    //UCSRC=URSEL|UMSEL|UPM1|UPM0|USBS|UCSZ1|UCSZ0|UCPOL
    UCSRC|=0x86 ;     //设置数据位
    //UCSRB=RXCIE|TXCIE\UDRIE|RXEN|TXEN|UCSZ2|RXB8|TXB8(10011000)
    UCSRB=0X9c; //引脚功能设为TXD与RXD,发送地址//UCSZ2=1即9位数据

    MCUCR|=0x00; // 开中断(MCU控制寄存器)
    GICR=0x00;   通用中断控制器
    TIMSK=0x00;  //定时计数据中断屏蔽寄存器
    //总中断必须是最后使能
    SREG|=0x80;  //开中断
    }


    //========================
    //名称:发送地址函数
    //功能:寻找从机
    //========================
    void SEND(unsigned char mydata)
    {
    DDRD|=0X08; //MAX485允许输出
    PORTD|=0X08;
    UCSRB|=0x01; //TXB8=0发地址
    Delay(1000);
    while(!UDRE);
    UDR=mydata;
    Delay(1000); //必有
    PORTD&=~0X08; //发送后立即转为接收等从机发来数据
      
    }
    //==分解数
    void TOLCD(unsigned char LCDP) //发送变量数据给LCD
    {   
       
      LCDA=LCDP/100;
      LCDA=(int)LCDA;
      LCDB=(LCDP%100)/10;
      LCDB=(int)LCDB;
      LCDC=(LCDP%100)%10;
      LCDC=(int)LCDC;
      LCDTATA(LCDASC[LCDA]);
      LCDTATA(LCDASC[LCDB]);
      LCDTATA(LCDASC[LCDC]);
    }
    //======================
    //名称:接收中断
    //功能:接收数据
    //======================
    void uartrupt()
    {  
      temp=UDR; //读数据
    //第一行显示:IP01 IP02 IP03
    //各从机数据在LCD的第二行,不同位置显示
    //IP01 IP02 IP03
    //1.2V 2.3V 3.6V
    //显示如上,控制显示位置是下面这几句:
    if(adr==1){LCDCOM(0xc0);TOLCD(temp); }  
    if(adr==2){LCDCOM(0xc0+5);TOLCD(temp);}
    if(adr==3){LCDCOM(0xc0+10);TOLCD(temp);}

    }


    //======================
    //名称:主函数
    //======================
    void main()
    {unsigned char str;
    DDRD|=0X08;   //MAX485允许输出
    PORTD|=0X08;
    USARTinit();
    LCDinit();
    DDRB |= 0X03;  //PORTB OUT
    Delay(4000);
    Delay(4000);
    //液晶第一行:IP1 IP2 IP3
    LCDCOM(0x80); //第一行
    while(LCD[str]!='\0') //字符串是否完成
       {
       LCDTATA(LCD[str]);
       str++;//
       }
       str=0;   //跳出来之后清空str=0切记!切记!
    //液晶第一行

      while(1)
    {
    LDelay(2);
    //RRRRRRRRRRRRRRRRRRRRRRRR读数据
    for(adr=1;adr<4;adr++)
    {
      SEND(adr); //发送地址寻找从机,地址ADR从01-03
      LDelay(20); //延时
      }
    //RRRRRRRRRRRRRRRRRRRRRRRR读数据
    }

    }



    从机程序:
    #include
    #include
    #pragma interrupt_handler uartrupt:12
    unsigned char temp; //接收临时变量
    unsigned char sendtata=123;
    //QQQQQQQQQQQQQQQQQQQ
    //名称:Delay()
    //功能:延时程序
    //QQQQQQQQQQQQQQQQQQQ
    void Delay(int t)
    {
    while(t--);
    }
    void LDelay(int t) //延时程序(时间较长)
    {
    for(;t>0;t--)
    {
      Delay(4000);
    }
       
    }
    //AD转换
    #define ADC_REF_AVCC 0x40
    #define  MUX_ADC0    0x00

    unsigned char ADC_Value;
    void AD_Init(void)
    {
       //CLI();
       ACSR |= (1<    ADCSRA &=~(1<    ADMUX &= 0x20;//清参考电压, ADCn输入端
       ADMUX |=0X40|MUX_ADC0|(1<    ADCSRA |= (1<    ADCSRA |= (1<    ADCSRA |=0x01;//2分频
       SFIOR = 0X00;
       ADCSRA |= (1<    ADCSRA |= (1< }

    unsigned char Read_ADC(void)
    {
       unsigned char  ADC_dat;
       ADCSRA |= (1<    while(ADCSR&(1<    ADC_dat = ADCH;
       return (ADC_dat);
    }

    //======================
    //名称:USARTinit()
    //功能:串行通信初始化,设置引脚功能,波特率,通信方式
    //波特率=fosc/16(ubrr+1)
    //======================
    void USARTinit()
    {
    UBRRL=25;        //波特率2400
    //UBRRH=0x00;
    UCSRA=0X0;
    UCSRB=0X0;
    //UCSRA=RXC|TXC|UDRE|FE|DOR|PE|U2X|MPCM(10100001)
    UCSRA|=0X01;     //只接收地址,从机CPCM=1
    //UCSRC=URSEL|UMSEL|UPM1|UPM0|USBS|UCSZ1|UCSZ0|UCPOL(10000110)
    UCSRC|=0x86;     //设置数据位
    //UCSRB=RXCIE|TXCIE\UDRIE|RXEN|TXEN|UCSZ2|RXB8|TXB8(10011000)
    UCSRB|=0x9c;     //引脚功能设为TXD与RXD
      
    MCUCR|=0x00; //开中断
    GICR=0x00;
    TIMSK=0x00;
    //最后才开总中断
    Delay(1000);
    SREG=0x80;//开中断
    DDRD|=0X08;      //
    PORTD&=~0X08;    //未收到主机命令禁止MAX485输出
    }
    //========================
    //名称:发送数据函数
    //功能:给主机发数据
    //========================
    void SEND(unsigned char mydata)
    {
    DDRD|=0X08; //MAX485允许输出
    PORTD|=0X08;
    Delay(1000);
      UDR=mydata;
    //while(!UDRE);
    Delay(1000);   //Delay(100)可发s
      PORTD&=~0X08; //发送后立即转为接收
    }


    //======================
    //名称:接收中断
    //功能:接收地址
    //======================
    void uartrupt()
    {  
        temp=UDR; //接收地址
    if(temp==0x02)
    {
    //sendtata=Read_ADC();
      DDRB|=0x01;
      PORTB |= 0X01;//LED
      SEND(sendtata); //发送数据
      }
      
    }


    //======================
    //名称:主函数
    //======================
    void main()
    {
    unsigned char adr;
      Delay(4000);
      DDRB |= 0X03;//PORTB OUT
      USARTinit();
       AD_Init();
       
      while(1)
      {
       LDelay(100);   
       PORTB |= 0X01;//LED
       sendtata=Read_ADC();
      }

    }
    更多相关内容
  • 实现STM32F4 基于FreeRtos的多机485串口通讯
  • 在STM32F429下移植了FreeRTOS与RS485,方便别人减少工作量,快速下载。并且集成多机通信。方便别人减少工作量,快速下载。
  • rs485多机通信程序

    2015-06-03 21:41:57
    rs485多机通信程序,包括主机和从机的代码。
  • 多机通信系统的可靠性。 主要步骤是:假设组成系统的电子元件的使用寿命、故障类型和解决方案。 然后利用蒙特卡罗方法进行算法研究和仿真实验,最终得到维修次数、无故障运行时间、无重大故障运行时间等重要参数。 ...
  • RS485多机通信,Keil C51源程序,Proteus仿真!适合初学者与项目参考!
  • RS485一主机两个下位,上位机通过发送下位地址查询下位两个按钮的状态,仿真时同时在P1口和P2口显示按钮状态一、原理图(原文件名:1.jpg)二、程序1、上位机程序#include "main_host.h"/* 延时t毫秒 */void ...

    RS485一主机两个下位机,上位机通过发送下位机地址查询下位机两个按钮的状态,仿真时同时在P1口和P2口显示按钮状态

    一、原理图

    thread-5051630-1-1.html

    (原文件名:1.jpg)

    二、程序

    1、上位机程序

    #include "main_host.h"

    /* 延时t毫秒 */

    void delay(uint t)

    {

    uint i;

    while(t--)

    {

    /* 对于11.0592M时钟,约延时1ms */

    for (i=0;i<125;i++)

    {}

    }

    }

    void SendCMD(unsigned char Dbyte)//UART0发送一个字节

    {

    RS487wr=1;

    TI = 0;

    TB8 = 0;                                        // 发送数据帧

    SBUF = Dbyte;                                        // 发送长度

    while(!TI);

    TI = 0;

    }

    void SendADDR(unsigned char Dbyte)//UART0发送一个字节

    {

    RS487wr=1;

    TI = 0;

    TB8 = 1;                                        // 发送地址帧

    SBUF = Dbyte;                                        // 发送长度

    while(!TI);

    TI = 0;

    }

    uchar ReciveUart(void)

    {                uchar temp;

    RS487wr=0;

    REN=1;

    RI = 0;

    while(!RI);

    temp = SBUF;

    RI = 0;

    return temp;

    }

    void init_serial()

    {         TMOD = 0x20;

    SCON = 0xd0;

    TH1 = 0xfd;

    TL1 = 0xfd;

    TR1 = 1;

    PCON = 0x00;                                                // SMOD=0

    }

    /* 主程序 */

    void main()

    {

    uchar i = 0;

    uchar addr_tmp;

    uchar data_tmp;

    init_serial();                                // 串口初始化

    EA = 1;                                                // 开所有中断

    /* 发送地址帧并接收应答信息,如果接收的信号与发送的地址信息不同,则重新发送地址帧 */

    while(1)                                                //这段程序无效

    {

    addr=BASE_ADDR;            //下位机地址初值(第一个下位机地址)

    addr_tmp = addr-1;

    while(addr_tmp!=addr)

    {

    /* 发送从机地址 */

    SendADDR(addr);

    /* 接收从机应答 */

    addr_tmp=ReciveUart();

    }

    SendCMD(DataCMD);          //给下位机发送 传输端口状态信息

    data_tmp=ReciveUart();//接收下位机端口信息

    P1=        data_tmp;

    addr=BASE_ADDR+1;            //下位机地址2初值(第2个下位机地址)

    addr_tmp = addr-1;

    while(addr_tmp!=addr)

    {

    /* 发送从机地址 */

    SendADDR(addr);

    /* 接收从机应答 */

    addr_tmp=ReciveUart();

    }

    SendCMD(DataCMD);          //给下位机发送 传输端口状态信息

    data_tmp=ReciveUart();//接收下位机端口信息

    P2=data_tmp;

    }

    }

    2)下位机程序

    #include "main_host.h"

    /* 延时t毫秒 */

    void delay(uint t)

    {

    uint i;

    while(t--)

    {

    /* 对于11.0592M时钟,约延时1ms */

    for (i=0;i<125;i++)

    {}

    }

    }

    void SendCMD(unsigned char Dbyte)//UART0发送一个字节

    {

    RS487wr=1;

    TI = 0;

    TB8 = 0;                                        // 发送数据帧

    //        delay(20);

    SBUF = Dbyte;                                        // 发送长度

    while(!TI);

    TI = 0;

    }

    void SendADDR(unsigned char Dbyte)//UART0发送一个字节

    {

    RS487wr=1;

    TI = 0;

    TB8 = 1;                                        // 发送地址帧

    delay(20);

    SBUF = Dbyte;                                        // 发送长度

    while(!TI);

    TI = 0;

    }

    uchar ReciveUart(void)

    {                uchar temp;

    RS487wr=0;

    REN=1;

    RI = 0;

    //                delay(20);

    while(!RI);

    temp = SBUF;

    RI = 0;

    //                delay(20);

    return temp;

    }

    /* 串口初始化函数 */

    void init_serial()

    {

    TMOD = 0x20;

    SCON = 0xd0;

    TH1 = 0xfd;

    TL1 = 0xfd;

    TR1 = 1;

    PCON = 0x00;                                                // SMOD=0

    }

    /* 主程序 */

    void main()

    {

    uchar i = 0;

    uchar addr_tmp;

    uchar data_tmp;

    init_serial();                                // 串口初始化

    EA = 0;                                                // 关闭所有中断

    /* 发送地址帧并接收应答信息,如果接收的信号与发送的地址信息不同,则重新发送地址帧 */

    P0=0xff;

    addr=P0;            //下位机地址初值(第一个下位机地址)

    P1=addr;

    /* 进入设备应答 */

    while(1)

    {

    SM2 = 1;                                // 只接收地址帧

    /* 如果接收到的地址帧不是本机地址,则继续等待 */

    addr_tmp = addr-1;

    while (addr_tmp!=addr)

    {

    addr_tmp=ReciveUart();

    }

    /* 发送本机地址作为应答信号,准备接收数据 */

    SendCMD(addr);

    SM2 =0;    ///接受命令

    data_tmp=ReciveUart();

    if(data_tmp==DataCMD)

    {

    SendCMD(P2);

    }

    else              //错误信息的话进入地址监听

    {

    SendCMD(0xff);

    }

    }

    }                                if(addr==BASE_ADDR)

    P1=        data_tmp&0x03;

    else

    P2=        data_tmp&0x03;

    }

    addr++;

    }

    }

    }

    3)main_host.h文件程序

    #ifndef        _main_houst_H                 // 防止.h被重复引用

    #define        _main_houst_H

    #include

    #include

    #define uchar unsigned char

    #define uint unsigned int

    /* 握手信号宏定义 */

    #define DataCMD 0x55                // 接收成功

    #define ERR 0xaa                // 接收错误

    #define BASE_ADDR    0x51   //下位机地址基址

    #define LOWMCU              2            //下位机节点数量   ,则下位机的地址范围:0x51~0x53

    uchar addr;

    #define RS485w     1

    #define RS485r         0

    sbit RS487wr=P3^2;

    sbit LED1=P2^3;

    #endif

    展开全文
  • 用PIC16F877A作为主机,8个PIC16作为从。从的站号用拨号盘输入,要求8个号码不能相同,且只在上电时由单片机PIC16F688一次读入号码,运行后修改无效。每一个从都用了一个电位器作为输入。当上位机发送命令65时...
  • V5-343-FreeRTOS实验_ FreeRTOS+RS485多机通信
  • 硬件设计 (末尾附文件) 代码设计 #include<reg51.h> #include<string.h>...//主机与从之间通信标志 unsigned char temp=0xff; unsigned char Buff[20];//数据缓冲区 unsigned char reciv

    硬件设计

    (末尾附文件)
    在这里插入图片描述

    代码设计

    #include<reg51.h>
    #include<string.h>
    #include "lcd.h"
    #define _SUCC_   0x0f//数据传送成功
    #define _ERR_    0xf0//数据传送失败
    unsigned char aa=0xff;//主机与从机之间通信标志
    unsigned char temp=0xff;
    unsigned char Buff[20];//数据缓冲区
    unsigned char recive[6];	 //用于保存从机发送的数据
    sbit KEY1=P1^3;
    sbit KEY2=P1^2;
    sbit KEY3=P1^1;
    sbit KEY4=P1^0;
    sbit KEY5=P3^2;
    sbit KEY6=P3^3;
    
    //sbit KEY5=P1^4;
    //sbit KEY6=P1^5;
    //延时1ms函数
    void delay_1ms(unsigned int i)
    {
         unsigned int x,y;
         for(x=i;x>0;x--)
             for(y=110;y>0;y--);
    }
    //串口初始化函数
    void init()
    {
         TMOD=0x20; //定时器1工作于方式2
         TH1=0xfd;  
         TL1=0xfd; //波特率为9600
         PCON=0;
         SCON=0xd0;  //串口工作于方式3
         TR1=1;  //开启定时器
         TI=0;
         RI=0;
    }
    
    
    //发送数据函数
    void SEND_data(unsigned char *Buff)
    {
         unsigned char i,lenth,check;
         lenth=strlen(Buff);      //计算数据长度
         check=lenth;
         TI=0;         //发送数据长度
         TB8=0;       //发送数据帧
         SBUF=lenth;
         while(!TI);
         TI=0;
             
         for(i=0;i<lenth;i++)  //发送数据
        {
            check=check^Buff[i];
            TB8=0;
            SBUF=Buff[i];      
            while(!TI);
            TI=0;
        }
          TB8=0;      //发送校验字节
          SBUF=check;    
          while(!TI);
          TI=0;     
    }
    
    //接收数据函数
    unsigned char RECE_data(unsigned char *Buff)
    {
         unsigned char i;
         unsigned char lenth;
         unsigned char check;
         RI=0;     //接收数据长度
         while(!RI);
         if(RB8==1)
    	 {
    	 	RI = 0;    
         	return 0xfe;  //若接收到地址帧,则返回0xfe
    	 }
         lenth=SBUF;
         RI=0;     
         check=lenth;
         for(i=0;i<lenth;i++) //接收数据
        {
            while(!RI);
            if(RB8==1)   //若接收到地址帧,则返回0xfe
            return 0xfe;
            Buff[i]=SBUF;   
            check=check^(Buff[i]);
            RI=0;
        }
         while(!RI);    //接收校验字节
         if(RB8==1)    //若接收到地址帧,则返回0xfe
         return 0xfe;
         temp=SBUF;
         RI=0;
         check=temp^check;  //将从主机接收到的校验码与自己计算的校验码比对
         if(check!=0)   //校验码不一致,表明数据接收错误,向主机发送错误信号,函数返回0xff
         {
            TI=0;
            TB8=0;
            SBUF=_ERR_;
            while(!TI);
            TI=0;
            return 0xff;
         }
         TI=0;           //校验码一致,表明数据接收正确,向主机发送成功信号,函数返回0x00
         TB8=0;
         SBUF=_SUCC_;	     
         while(!TI);
         TI=0;
         return 0;
    } 				
    
    //发送从机地址
    void ADDR_data(unsigned addr)
    {
     while(temp!=addr) //主机等待从机返回其地址作为应答信号
     {
      TI=0;    //发送从机地址
      TB8=1;    //发送地址帧
      SBUF=addr;
      while(!TI);
      TI=0; 
      
      RI=0;
      while(!RI);
      temp=SBUF;
      RI=0;
     }
    }
    
     void keyscan()
     {
      
      if(KEY1==0)
      {
         LcdWriteCom(0x01);  //清屏
         delay_1ms(5);
         if(KEY1==0)
        {
          while(!KEY1);
          ADDR_data(0x01);//发送从机地址
          temp=_ERR_;   //主机等待从机数据接收成功信号
          while(temp!=_SUCC_)
          {
              unsigned char Buff[]={0xfe};
              SEND_data(Buff);//发送数据
              RI=0;
              while(!RI);
              temp=SBUF;
              RI=0;
          }
    	  SM2=0;       //接收数据帧
          aa=0xff;    //从机接收数据,并将数据保存到数据缓冲区
          while(aa==0xff)
          {
              aa=RECE_data(Buff);
    		  P0 = 0xff;
          }
    	  P0 = 0xfe;
          recive[0] = Buff[0];
    	  recive[1] = Buff[1];
    	  recive[2] = Buff[2];
    	 
        }
      }
    
      if(KEY2==0)
      {
         LcdWriteCom(0x01);  //清屏
         delay_1ms(5);
         if(KEY2==0)
         {
            while(!KEY2);
            ADDR_data(0x01);
            temp=_ERR_;   //主机等待从机数据接收成功信号
            while(temp!=_SUCC_)
           {
              unsigned char Buff[]={0xff};
              SEND_data(Buff);
              RI=0;
              while(!RI);  
              RI=0;
    		  temp=SBUF;
           }
         }
      }
    
      if(KEY3==0)
      {
         LcdWriteCom(0x01);  //清屏
         delay_1ms(5);
         if(KEY3==0)
         {
             while(!KEY3);
             ADDR_data(0x02);
    	     temp=_ERR_;   //主机等待从机数据接收成功信号
             while(temp!=_SUCC_)
            {
               unsigned char Buff[]={0xfe};
               SEND_data(Buff);
               RI=0;
               while(!RI);
               temp=SBUF;
               RI=0;
            }
    		SM2=0;       //接收数据帧
    		aa=0xff;    //从机接收数据,并将数据保存到数据缓冲区
    		while(aa==0xff)
    		{
    			aa=RECE_data(Buff);
    			P0 = 0xff;
    		}
    		P0 = 0xfe;
    		/*
    		recive[3] = Buff[0];
    		recive[4] = Buff[1];
    		recive[5] = Buff[2];
    		*/
    		recive[0] = Buff[0];
    		recive[1] = Buff[1];
    		recive[2] = Buff[2];
         }
      }
    
      if(KEY4==0)
      {
          LcdWriteCom(0x01);  //清屏
          delay_1ms(5);
          if(KEY4==0)
         {
             while(!KEY4);
             ADDR_data(0x02);
         	 temp=_ERR_;   //主机等待从机数据接收成功信号
             while(temp!=_SUCC_)
            {
                 unsigned char Buff[]={0xff};
                 SEND_data(Buff);
                 RI=0;
                 while(!RI);
                 temp=SBUF;
                 RI=0;
            }
         }
      }
    

    链接:https://pan.baidu.com/s/1O6FYzpRDkedPM2ZW6Uivuw
    提取码:5jpj

    展开全文
  • RS-485主机通信方式

    2020-10-21 04:55:28
    RS-485主机通信方式_孙汉华_武汉波仕电子有限公司传统的RS-485组网方式只允许一个主机,但是在许多情况下要求有台主机进行控制。
  • 多机串行通信控制网络是物理层采用RS 485通信接口所组成的多机串行通信工控设备网络,RS 485既是物理层的协议标准,也是串行通信接口的电气标准。这种通信接口可以十分方便地将许多设备组成一个控制网络。RS 485通信...
  • rs485多机通信 Proteus

    2009-04-23 15:35:42
    rs485多机通信,基于Proteus的,很生动详细,,看了就明白
  • 利用RS485进行串口通信,使用C++/mfc对其进行编程实现,适合于工业控制中模块的指令操作,可发送指令或接收指令,指令格式为字符char或字节BYTE等
  • 如何使用RS485实现多点双向通信电路的设计
  • 基于51单片机的RS-485多机通信

    热门讨论 2009-12-31 00:50:25
    使用51单片机的串行口,通过MAX485转换信号为RS485 实现单片机多机远距离通信,多机通信.这里有一个主机3个从机. 里面有PROTEUS仿真.和说明
  • 基于51单片机RS485多机通讯

    热门讨论 2008-11-07 09:09:51
    这是一个基于51单片机的RS485多机通讯,一台主机,三台主机,从机地址可通过拔码开关选择,如,主机要发送数据给从机,则将主机选中要发送的从机地址。然后对应的按键有对应的值。即可以送,有参考价格
  • 利用研旭DSP28335与上位机实现rs485通信,适合初学dsp的人使用学习
  • AT89C51+MAX487 RS485单数据通信实验proteus仿真源文件(含C程序),包含proteus工程源文件,单片机C语言程序。proteus8.6可正常打开,仿真。
  • 本资源为通信工程课程设计实验,题目为:基于51单片机的RS485系统设计,本资源包含了4代程序,功能完善,有较强的处理能力,并且包含硬件仿真电路,可以直接仿真测试,希望下载的同学可以好好思考。
  • 基于RS485总线的PC机与单片机的多机通信(单片机程序)
  • 现场应用要求: 1. 将5台RS232接口设备信号转换为RS485信号进行通信。 2. 通信距离最远1200米左右。 3. 通信速率在4800bps。。 4. 应用环境为地下矿井通信控制系统。
  • RS485多机通讯协议

    2018-01-06 15:55:00
    本文详细论述了基于Modbus协议的RS485总线通讯设计原理。虽然此主站的增加会使系统成本稍有上升,但它不仅可以使上位机从繁忙的通信工作中解放出来,更好地完成人交互、数据处理、动画播放等任务,而且还能够...
  • 如某引信系统的DSP电路,需要与内部两个组部件以及外部个系统进行接口或者信息交互,且总体要求采用异步串口方式进行通信。此类问题主要有三种解决方案:第一,在DSP的并行总线上扩展UART芯片,通过硬件转换实现,...
  • 基于RS485多机通信

    2012-01-09 20:40:28
    基于RS485多机通信,课程设计、强化训练、系统调试都可用的。从机还可以类推继续扩展。
  • 介绍一种通信总线RS485主从通信方式,提高RS485总线采集速度的方法,该方法解决了主从式通信慢的缺点,提高了通信速度,运行稳定、可靠。
  • 课程设计所用,本程序针对的51开发板所写的,读者可以根据自己设计的系统,进行改编即可工作
  • 针对现有煤矿安全监控系统的RS485总线采用主控对子通信节点轮询呼叫方式存在实时性差、无法实现即插即用功能、通信效率低的问题,设计了一种基于类令牌环的RS485多通信协议模块。令牌信息包含在每个数据帧的帧头,...
  • 使用ARM公司STM32F407单片机实现485通讯

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,579
精华内容 4,631
关键字:

rs485多机通信

友情链接: sort.rar