📄 slave_main.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 + -