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

📄 slave_main.c

📁 多点烟雾,温度探测报警程序 基于MSP430F247,485总线.
💻 C
字号:
#include<msp430x24x.h>
#include"System_Init.h"
#include"DS18B20.h"
#include"LED.h"
#include"AD.h"

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

#define Num_of_results 10
unsigned int AD_results[Num_of_results];

unsigned char Tready;         //数据已经准备好的标志
unsigned char Slave_address;  //本机地址
unsigned char Temp_low_Buf;
unsigned char Temp_high_Buf;
char Smoke_low_Buf;
char Smoke_high_Buf;



unsigned char Get_address(void);
void Slave_Seng_Byte(unsigned char Tx_data);

main()
{
 WDTCTL=WDTPW+WDTHOLD;
 
 Slave_Init_CLK();    //系统时钟初始化
 Slave_Init_Port();   //系统端口初始化
 AD_Init();           //AD初始化
 Temp_mcuinit();      //DS18B20初始化
  _EINT();            //开总中断
  
 LED_Green_on();      //打开绿灯
 Slave_address=Get_address();//取得本机地址
 
 Tready=0;//先让标志为0(未准备好)
 while(1)
 {
   P5DIR |=BIT5;// enable p3.5 OUT
   _485_Receive_EN;
   _BIS_SR(CPUOFF+GIE); //进入低功耗
 }
}
/**接收中断,进入中断后将数据发送出去*********/
#pragma vector=USCIAB1RX_VECTOR
__interrupt void USCI1RX_ISR(void)
{ 
 unsigned char Command1;
 unsigned char Command2;
 unsigned char Receive_addr;
 
 UC1IFG &=~UCA1RXIFG; //清掉接收中断标志
 UC1IE  &=~UCA1RXIE;  //关闭接收中断使能
 
 //下面为在中断里面,去的烟雾,温度数据
 //取得烟雾数据
  ADC12CTL0 |=ADC12SC;               //开始转换
  static unsigned int index =0;
  static unsigned int  sum;
  AD_results[index]= ADC12MEM0;      //取走数据,清除IFG标志
  index =(index+1)%Num_of_results;
 if (index ==9)                     //进行10次取得数据后,滤波一下
 {
  sum =AD_Filter(AD_results);
  Smoke_low_Buf=(sum&0x00FF);
  Smoke_high_Buf=(sum&0xFF00);
 }
 
 //取得温度数据
 GetTemp(Temp_low_Buf, Temp_high_Buf);
 
 Tready=1;//告诉从机,数据已经准备好
 
 
 
 //下面为接收中断里面,将烟雾,温度的数据发送出去  
 Receive_addr=UCA1RXBUF;
 
 if( Receive_addr!=Slave_address){UCA1STAT|=UCADDR;UC1IE |=UCA1RXIE;}//地址不符,等待     
 
 
 UCA1STAT&=~UCADDR; //告诉从机,下面接到的是数据
 
  _485_Drive_EN;
 UCA1TXBUF=Slave_address; //从机将本机地址返回给主机
 while(!(UC1IFG&UCA1TXIFG)); UC1IFG&=~UCA1TXIFG; //等待地址发送完毕
 
 _485_Receive_EN;
 while(!(UC1IFG&UCA1RXIFG)); UC1IFG&=~UCA1RXIFG; //等待从机返回地址
 
 Command1=UCA1RXBUF;     //接主机发过来的命令
 if(Command1==0xFF){UCA1STAT|=UCADDR;UC1IE |=UCA1RXIE;} //收到复位信号,等待
 
 if(Command1==0x02) //如果是发送数据命令
   {
    _485_Drive_EN;
    if(Tready==1)UCA1TXBUF=0x02;
    else UCA1TXBUF=0x00;
    while(!(UC1IFG&UCA1TXIFG)); UC1IFG&=~UCA1TXIFG; //等待地址发送完毕
    
    _485_Receive_EN;
    while(!(UC1IFG&UCA1RXIFG)); UC1IFG&=~UCA1RXIFG; //等待主机返回地址
    
    Command2=UCA1RXBUF;
    if(Command2==0xFF){UCA1STAT|=UCADDR;UC1IE |=UCA1RXIE;} //收到主复位信号,等待
    
    //发送烟雾数据
    Slave_Seng_Byte(Smoke_low_Buf);
    Slave_Seng_Byte(Smoke_high_Buf);
    
    //发送温度数据
    Slave_Seng_Byte(Temp_low_Buf);
    Slave_Seng_Byte(Temp_high_Buf);
    UC1IE |=UCA1RXIE; //发完后,开接收中断使能
  }
 else                        //如果街道的是非法命令
   { 
    _485_Drive_EN;
    UCA1TXBUF=0x80;          //则继续进入等待状态
    while(UC1IFG&UCA1TXIFG);UC1IFG&=~UCA1TXIFG;
    UC1IE |=UCA1RXIE;       
   }
}
/***********************************
*名   称
*功   能:从机取得由拨码开关分配的地址
*参   数
*描   述    
************************************/
unsigned char Get_address(void)
{
  unsigned char addr;
  P2DIR=0xE7;       //让P2.4,P2.5为输入
  addr=(P2IN&0x18);
  return addr;
}
/************************************
函数名称:
功    能:从机发送一个字节数据子函数
参    数:Tx_data 为要发送的字节数据
返回 值 :
***********************************/
void Slave_Seng_Byte(unsigned char Tx_data)
{
 unsigned char p;
 unsigned char i;
 Tready=0;    //第一步,清除数据准备好的标志
  do
  {
   p=0;        //清校验和
   for(i=0;i<1;i++)
    {
     UCA1TXBUF=Tx_data;
     p+=Tx_data;
     while(!(UC1IFG&UCA1TXIFG)); UC1IFG&=~UCA1TXIFG;//等待地址发送完毕
    }
  
  UCA1TXBUF=p;       //发送校验和
  while(!(UC1IFG&UCA1TXIFG)); UC1IFG&=~UCA1TXIFG;//等待地址发送完毕
  while(!(UC1IFG&UCA1RXIFG)); UC1IFG&=~UCA1RXIFG;//等待从机返回地址
  }
    while(!(UC1IFG&UCA1TXIFG)); //如果主机接收不正确,则从新发送
    
}

⌨️ 快捷键说明

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