📄 master_main.c
字号:
#include<msp430x24x.h>
#include"System_Init.h"
#include"485_master.h"
#include"LCD.h"
#include"LED.h"
//温度模块的变量
#define positive 0x0f //正温系数
unsigned char symbol = 1 ; //温度正负符号
float Temper=0.0; //真正有效温度值
unsigned char Rx_BUF[4];
char Temp_high; //注意,DS18B20地位数据先发送
char Temp_low;
int temperature=0; //读取两字节温度数据
unsigned char Smoke_high;
unsigned char Smoke_low;
unsigned int Smoke_all; //两个字节的烟雾数据合成一个
unsigned char number_table[10] = {'0','1','2','3','4','5','6','7','8','9'};
unsigned char DS18B20_temp_display [8] = {'x','0','0','0','.','0','0','\0'};
unsigned char AD_result_display[]={0x00,0x00,0x00,0x00,0x00,0x00,0xff};
void Temp_display_number(float f_data); //温度数据变换子函数
void data_converter(unsigned char *p,unsigned int value); //从机AD过来的数据变换
main()
{
WDTCTL = WDTPW +WDTHOLD; //关闭看门狗
Master_Init_CLK(); //系统时钟初始化
Master_Init_Port(); //所有I/O口初始化
Master_Init_TimerA(); //定时器A初始化,定时在250MS
Master_Init_UART1(); //UART端口初始化
LCD_init(); //液晶初始化
_EINT(); //打开总中断使能
for(;;) //进入循环,在低功耗模式等待
{
_BIS_SR(CPUOFF+GIE);
}
}
//**定时器A中断,定时发送命令给从机,让从机把数据发过来*
/*****************************
*从机发送数据的顺序:
*1。温度的低8位
*2。温度的高8位
*3。烟雾的全16位
*所以,依次接3帧数据
********************************/
#pragma vector = TIMERA0_VECTOR
__interrupt void TimerA_ISR(void)
{
CCR0 +=4000;
Rs485_master(0x00,0x02,3,Rx_BUF);
Smoke_low=Rx_BUF[0];
Smoke_high=Rx_BUF[1];
Temp_low=Rx_BUF[2];
Temp_low=Rx_BUF[3];
//烟雾处理模块
Smoke_all=Smoke_high; //取得烟雾的高八位
Smoke_all<<=8; //将低八位放在高八位
Smoke_all |=Smoke_low;
data_converter(AD_result_display,Smoke_all);
LCD_write_string(0,0,"S:"); //LCD显示烟雾结果
LCD_write_char(2,0, AD_result_display[0]);
LCD_write_char(3,0, AD_result_display[1]);
LCD_write_char(4,0, AD_result_display[2]);
LCD_write_char(5,0, AD_result_display[3]);
//温度处理模块
if((Temp_high|positive)==positive)
symbol=1; //测到的温度为正
else
symbol=0; //测到的温度为负
temperature=(Temp_high&0x0f); //屏蔽高4位
temperature<<=8; //将temp_high部分数据移到temperature高8位
temperature|=Temp_low; //将高低两字节内部合并成一个16位数据
if(symbol==0) //是否为负温度
{
temperature = (~temperature)+1; //将其取反后加1
}
Temper=temperature*0.0625; //计算真实温度值
Temp_display_number(Temper); //数据变换成显示数据
//温度的正负处理
if(symbol==1)
DS18B20_temp_display[0] = '+'; //处理正负符合
else
DS18B20_temp_display[0] = '-';
LCD_write_string(7,0,"T:");
LCD_write_char(9,0, DS18B20_temp_display[0]); //LCD显示温度结果
LCD_write_char(0x0a,0, DS18B20_temp_display[1]);
LCD_write_char(0x0b,0, DS18B20_temp_display[2]);
LCD_write_char(0x0c,0, DS18B20_temp_display[3]);
LCD_write_char(0x0d,0, DS18B20_temp_display[4]);
LCD_write_char(0x0e,0, DS18B20_temp_display[5]);
LCD_write_char(0x0f,0, DS18B20_temp_display[6]);
Rs485_master(0x01,0x02,3,Rx_BUF);
Smoke_low=Rx_BUF[0];
Smoke_high=Rx_BUF[1];
Temp_low=Rx_BUF[2];
Temp_low=Rx_BUF[3];
//烟雾处理模块
Smoke_all=Smoke_high; //取得烟雾的高八位
Smoke_all<<=8; //将低八位放在高八位
Smoke_all |=Smoke_low;
data_converter(AD_result_display,Smoke_all);
LCD_write_string(0,1,"S:"); //LCD显示烟雾结果
LCD_write_char(2,1, AD_result_display[0]);
LCD_write_char(3,1, AD_result_display[1]);
LCD_write_char(4,1, AD_result_display[2]);
LCD_write_char(5,1, AD_result_display[3]);
//温度处理模块
if((Temp_high|positive)==positive)
symbol=1; //测到的温度为正
else
symbol=0; //测到的温度为负
temperature=(Temp_high&0x0f); //屏蔽高4位
temperature<<=8; //将temp_high部分数据移到temperature高8位
temperature|=Temp_low; //将高低两字节内部合并成一个16位数据
if(symbol==0) //是否为负温度
{
temperature = (~temperature)+1; //将其取反后加1
}
Temper=temperature*0.0625; //计算真实温度值
Temp_display_number(Temper); //数据变换成显示数据
//温度的正负处理
if(symbol==1)
DS18B20_temp_display[0] = '+'; //处理正负符合
else
DS18B20_temp_display[0] = '-';
LCD_write_string(7,1,"T:");
LCD_write_char(9,1, DS18B20_temp_display[0]); //LCD显示温度结果
LCD_write_char(0x0a,1, DS18B20_temp_display[1]);
LCD_write_char(0x0b,1, DS18B20_temp_display[2]);
LCD_write_char(0x0c,1, DS18B20_temp_display[3]);
LCD_write_char(0x0d,1, DS18B20_temp_display[4]);
LCD_write_char(0x0e,1, DS18B20_temp_display[5]);
LCD_write_char(0x0f,1, DS18B20_temp_display[6]);
Rs485_master(0x02,0x02,3,Rx_BUF);
Smoke_low=Rx_BUF[0];
Smoke_high=Rx_BUF[1];
Temp_low=Rx_BUF[2];
Temp_low=Rx_BUF[3];
//烟雾处理模块
Smoke_all=Smoke_high; //取得烟雾的高八位
Smoke_all<<=8; //将低八位放在高八位
Smoke_all |=Smoke_low;
data_converter(AD_result_display,Smoke_all);
LCD_write_string(0,2,"S:"); //LCD显示烟雾结果
LCD_write_char(2,2, AD_result_display[0]);
LCD_write_char(3,2, AD_result_display[1]);
LCD_write_char(4,2, AD_result_display[2]);
LCD_write_char(5,2, AD_result_display[3]);
//温度处理模块
if((Temp_high|positive)==positive)
symbol=1; //测到的温度为正
else
symbol=0; //测到的温度为负
temperature=(Temp_high&0x0f); //屏蔽高4位
temperature<<=8; //将temp_high部分数据移到temperature高8位
temperature|=Temp_low; //将高低两字节内部合并成一个16位数据
if(symbol==0) //是否为负温度
{
temperature = (~temperature)+1; //将其取反后加1
}
Temper=temperature*0.0625; //计算真实温度值
Temp_display_number(Temper); //数据变换成显示数据
//温度的正负处理
if(symbol==1)
DS18B20_temp_display[0] = '+'; //处理正负符合
else
DS18B20_temp_display[0] = '-';
LCD_write_string(7,2,"T:");
LCD_write_char(9,2, DS18B20_temp_display[0]); //LCD显示温度结果
LCD_write_char(0x0a,2, DS18B20_temp_display[1]);
LCD_write_char(0x0b,2, DS18B20_temp_display[2]);
LCD_write_char(0x0c,2, DS18B20_temp_display[3]);
LCD_write_char(0x0d,2, DS18B20_temp_display[4]);
LCD_write_char(0x0e,2, DS18B20_temp_display[5]);
LCD_write_char(0x0f,2, DS18B20_temp_display[6]);
Rs485_master(0x03,0x02,3,Rx_BUF);
Smoke_low=Rx_BUF[0];
Smoke_high=Rx_BUF[1];
Temp_low=Rx_BUF[2];
Temp_low=Rx_BUF[3];
//烟雾处理模块
Smoke_all=Smoke_high; //取得烟雾的高八位
Smoke_all<<=8; //将低八位放在高八位
Smoke_all |=Smoke_low;
data_converter(AD_result_display,Smoke_all);
LCD_write_string(0,3,"S:"); //LCD显示烟雾结果
LCD_write_char(2,3, AD_result_display[0]);
LCD_write_char(3,3, AD_result_display[1]);
LCD_write_char(4,3, AD_result_display[2]);
LCD_write_char(5,3, AD_result_display[3]);
//温度处理模块
if((Temp_high|positive)==positive)
symbol=1; //测到的温度为正
else
symbol=0; //测到的温度为负
temperature=(Temp_high&0x0f); //屏蔽高4位
temperature<<=8; //将temp_high部分数据移到temperature高8位
temperature|=Temp_low; //将高低两字节内部合并成一个16位数据
if(symbol==0) //是否为负温度
{
temperature = (~temperature)+1; //将其取反后加1
}
Temper=temperature*0.0625; //计算真实温度值
Temp_display_number(Temper); //数据变换成显示数据
//温度的正负处理
if(symbol==1)
DS18B20_temp_display[0] = '+'; //处理正负符合
else
DS18B20_temp_display[0] = '-';
LCD_write_string(7,3,"T:");
LCD_write_char(9,3, DS18B20_temp_display[0]); //LCD显示温度结果
LCD_write_char(0x0a,3, DS18B20_temp_display[1]);
LCD_write_char(0x0b,3, DS18B20_temp_display[2]);
LCD_write_char(0x0c,3, DS18B20_temp_display[3]);
LCD_write_char(0x0d,3, DS18B20_temp_display[4]);
LCD_write_char(0x0e,3, DS18B20_temp_display[5]);
LCD_write_char(0x0f,3, DS18B20_temp_display[6]);
}
/************************************
函数名称:
功 能:将温度值转换成可显示十进制值,/取数范围整数3位,小数点后3位.
参 数:
返 回 值 :
************************************/
void Temp_display_number(float f_data)
{
unsigned long value;
float n;
n=f_data *1000;
value = (unsigned long int)n;
DS18B20_temp_display[1] = number_table[value/100000]; //100位
value = value%100000;
DS18B20_temp_display[2] = number_table[value/10000]; //10位
value = value%10000;
DS18B20_temp_display[3] = number_table[value/1000]; //1位
value = value%1000;
DS18B20_temp_display[5] = number_table[value/100]; //0.1位
value = value%100;
DS18B20_temp_display[6] = number_table[value/10]; //0.01位
value = value%10;
}
/************************************
函数名称:
功 能:对AD转换的数据变换
参 数:
返 回 值 :
*************************************/
void data_converter(unsigned char *p,unsigned int value)
{
unsigned int m,n,j;
p[0]=number_table[value/1000];
m=value%1000;
p[1]=number_table[m/100];
n=m%100;
p[2]=number_table[n/10];
j=n%10;
p[3]=number_table[j/1];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -