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

📄 master_main.c

📁 多点烟雾,温度探测报警程序 基于MSP430F247,485总线.
💻 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 + -