⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 485_master.c

📁 多点烟雾,温度探测报警程序 基于MSP430F247,485总线.
💻 C
字号:

#include<msp430x24x.h>
#include"485_master.h"

//硬件信息:P3.5口接485的使能端口
#define _485_Receive_EN P5OUT |=BIT5
#define _485_Drive_EN   P5OUT &=~BIT5


//0x02:请求从机想主机发送数据的命令
//0XFF:让从机复位的命令,注意:0XFF是作为地址发送的
//Slave_addresss,为从机的地址

/************************************
函数名称:
功    能:与从机通信
参    数:n为连续收的字节个数
描    述:注意,这里的command 一定要是0x02
***********************************/
void Rs485_master(unsigned char Slave_address,unsigned char command,
                                      unsigned char n,unsigned char Rx_BUF[3])
{
 P5DIR |=BIT5;  //让P3.5一直为输出
 unsigned char aa;
 unsigned char i;
 unsigned char p;
 
  _485_Drive_EN ;
  UCA1TXBUF=Slave_address; //第一步,将从机地址发送出去
  while(!(UC1IFG&UCA1TXIFG)); UC1IFG&=~UCA1TXIFG;//等待地址发送完毕
  
  _485_Receive_EN;
  while(!(UC1IFG&UCA1RXIFG)); UC1IFG&=~UCA1RXIFG;//等待从机返回地址
  
  if(UCA1RXBUF!=Slave_address)Rs485_error();   //如果从机返回的地址不符合,则命令这个从机继续等待
  
  else                   //如果从机返回的地址符合
    {
     _485_Drive_EN;
     UCA1CTL1 &=~UCTXADDR;   //告诉主机,下面的一桢为数据,而不是地址    
     UCA1TXBUF=command;      //将命令发送出去  
     
     while(!(UC1IFG&UCA1TXIFG)); UC1IFG&=~UCA1TXIFG;//等待地址发送完毕
      _485_Receive_EN;
     while(!(UC1IFG&UCA1RXIFG)); UC1IFG&=~UCA1RXIFG; //等待从机返回地址

     aa=UCA1RXBUF;            //将从机返回的数据赋给aa
     if((aa==0x80)){UCA1CTL1 |=UCTXADDR ;Rs485_error();} //如果从机返回的数据为0X80(非法命令),则让从机复位
     else
       { 
        if((command==0x02)&(aa==0x02)) //如果发送的命令为0x02,并且从机返回的也为0X02
            {
              while(1)
               {
                p=0;       //清校验和
                for(i=0;i<n;i++)   //下面将从机发过来的数据接收下来,放在Rx_data里面
                  {
                     _485_Receive_EN;
                    while(!(UC1IFG&UCA1RXIFG)); UC1IFG&=~UCA1RXIFG; //等待从机返回地址
                    Rx_BUF[i]=UCA1RXBUF;  
                    p+=Rx_BUF[i];
                   }
               while(!(UC1IFG&UCA1RXIFG)); UC1IFG&=~UCA1RXIFG;   //等待从机发校验和P过来
               if(p==UCA1RXBUF)           //如果校验和相同,则发送0X00
                {
                 _485_Drive_EN;
                 UCA1TXBUF=0x00;
                 while(!(UC1IFG&UCA1TXIFG)); UC1IFG&=~UCA1TXIFG;
                 break;
                }
                else                //如果校验和不同,则让从机复位
                {
                 _485_Drive_EN;
                 UCA1TXBUF=0xff;               
                 while(!(UC1IFG&UCA1TXIFG)); UC1IFG&=~UCA1TXIFG;
                 }
             
         UCA1CTL1 |=UCTXADDR ;  //接收完后,又要告诉主机,下面的为地址侦从而重复上面的过程
       
                }//while(1)
             }//if((aa&==0x02)&(command==0x02))
          }//else
      }//else    
}// Rs485_master

/************************************
函数名称:
功    能:DELAY函数
参    数:
返回 值 :
***********************************/
void Rs485__Delay(unsigned char n)
{
 unsigned char i;
 for(i=0;i<10;i++)
 {
  while(n!=0)
    n--;
 } 
}

/************************************
函数名称:
功    能:当发送或者接收出错时,error函数就给从机发送一个复位命令
参    数:
返回 值 :
***********************************/
void Rs485_error(void)
{
 _485_Drive_EN;
 UCA1TXBUF=0xff; ;    //0XFF为命令从机等待的命令,当从机收到OXFF的命令,则进入等待状态
 while(!(UC1IFG&UCA1TXIFG)); UC1IFG&=~UCA1TXIFG;	
}

































































 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -