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

📄 main_h2s_3.c

📁 就是一个模拟量检测并在超过危险界时报警的代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include  <msp430x13x.h>


typedef unsigned char  uint8;  
typedef signed   char  int8;   
typedef unsigned short uint16; 
typedef signed   short int16;  

const float fSWarnVoltage0=900;
const float fSDangerVoltage0=1500;

const float fSWarnVoltage1=900;
const float fSDangerVoltage1=1500;

const float fSWarnVoltage2=900;
const float fSDangerVoltage2=1500;

const float fSWarnVoltage3=900;
const float fSDangerVoltage3=1500;



 const uint8 icBCSCTL2=0x16;
 const uint16 icTACCR0=0x00FA;


 const uint8 icBA[8]=     {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
 const uint8 icNBA[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};


uint8 igS[4][2];
uint8 igV[4]={0,0,0,0};

uint8 tAC(void);

void COut(uint8 ipp,uint8 iTmp2);
uint8 Cget(uint8 ipp);

uint16 aget(uint8 idd);
uint16 agetx(uint8 idd);
float agetm(uint8 idd);

void SOut(uint8 ikk);
void RKg(uint8 ikk);

void LKg(uint8 iEE,uint8 ikk);

void InitData(void);
float jp_AbsF(float fIn);
void CxSin(uint8 idd);
void CXLkg(uint8 idd,uint8 iLL3,uint8 ikk);
void CxLstatus(uint8 idd,uint8 iss,uint8 iLLF);
void Lstatus(uint8 iss,uint8 iLLF);
void Pkg(uint16 iFF2,uint8 isKK);
void Delay100mS(uint16 iDelay);	

void j_Debug(void);
void j_Debug2(void);

uint8 cFin(uint8 iccx);
uint8 cFcheck(void);

uint8 iGTmp1;
uint16 i16GTmp1;

void main( void )
{
  uint16 iTmp;
  uint8 illFS=1;
  uint8 iCCpS;
  uint8 i;
  uint8 iss,iLLF;
  uint8 isKK;
  uint8 iskk_2=0;
  
  
  WDTCTL = WDTPW +WDTHOLD; 	//看门狗关闭

  DCOCTL=0x00;					//振荡器选择
  BCSCTL1=0xB0;
  BCSCTL2=icBCSCTL2;

  
  _BIS_SR(OSCOFF);				//主振荡器关闭
  _BIC_SR(GIE);					//关闭全局中断使能
  
  
  IE1=0x00;
  //port端口初始化
  P1SEL=0x00;			//P1口设定为高四位输出、低四位输入
 
  P1IE=0x00;
  P1IES=0x00;
  P1IFG=0x00;

  P1DIR=0xF0;
  P1OUT=0x00;

  P2SEL=0x00;			//P2口设定为高四位输出、低四位输入


  P2IE=0x00;
  P2IES=0x00;
  P2IFG=0x00;

  P2DIR=0xF0;
  P2OUT=0x00;

  P3SEL=0x00;			//P3口设定为输出
  P3DIR=0xFF;
  P3OUT=0x00;  
  
  P4SEL=0x00;			//P4口设定为高三位输入、低五位输出
  P4DIR=0x1F;
  P4OUT=0x00;    
  
  P5SEL=0x00;			//P5口设定为输入
  P5DIR=0x00;
  P5OUT=0x00;    

  P6SEL=0xFF;			//P6口设定为扩展功能(ADC12)
  P6DIR=0x00;
  P6OUT=0x00;    
    
  TACTL=0x02C0;			//TIME_A设定
  
  TACCTL0=0x2800;
  TACCR0=icTACCR0;

  TACCTL1=0x2800;
  TACCR1=0xFFFF;
  TACCTL2=0x2800;
  TACCR2=0xFFFF;

  TACTL=0x02C4; 
  TACTL=0x02D0; 

  
  LKg(0xFF,1);			//运行状态指示灯全亮
  CXLkg(0xFF,0,1);		//Sensor_Ext指示灯控制全开
  SOut(1);				//蜂鸣器打开
  
  cFcheck();
  InitData();    
  Pkg(11,1);
  
  while(1)
  {	//读取四路模拟转换值并处理成报警级别表
  	for(i=0;i<4;i++)
  	{
  	  	if(igV[i]==1)
  	  	{
  	  	  CxSin(i);
  	  	}
  	} // end for

	//报警级别显示
  	for(i=0;i<4;i++)
  	{
  	  if(igV[i]==1)
  	  	{
  	  	  iss=igS[i][0];		//获取报警级别
		  iLLF=igS[i][1];		//获取探头健康状态
                CxLstatus(i,iss,iLLF);

  	  	}
  	} // end for
  

	//测试代码,用LED1LED2LED3指示0路探头报警等级、探头故障
  	iss=igS[0][0];
  	iLLF=igS[0][1];
  	Lstatus(iss,iLLF);

//Spk
  	isKK=0;
  	for(i=0;i<4;i++)
  	{
  	  if(igV[i]==1)
  	  	{
  	  	  iss=igS[i][0];
		  iLLF=igS[i][1];
                if( (iss>0) || (iLLF>0) )
                	{
                	  isKK=1;
			  break;
                	}

  	  	}
  	} // end for
  	if(isKK==0)
  		SOut(0);
  	else
    {
		if(iskk_2==0)
			iskk_2=1;
	    else
	  	  	iskk_2=0;
	    SOut(iskk_2);
    }
  

   	iCCpS= cFcheck();
   	if(iCCpS>=10)
    	{
         Delay100mS(5);
	  cFcheck();
		 
	  InitData();
    	  Pkg(11,1);
    	}

   	if( (iCCpS>0) && (iCCpS<10) )
    {
    	Delay100mS(5);
	  	cFcheck();
		 
	  	InitData();
    	Pkg(2,1);
    }
	}
}
//读指定测量点的电源输出是否输出,有输出为1,无输出为0
uint8 cFin(uint8 iccx)
{

   uint8 iNums=5;
   uint8 ipp2[5];

   uint8 i,iTmp;

   if(iccx==0)
   	{
         for(i=0;i<iNums;i++)
	     ipp2[i]=Cget(43);//P53 //JConfig0
   	}
   
   if(iccx==1)
   	{
         for(i=0;i<iNums;i++)
	     ipp2[i]=Cget(44);//P54 //JConfig1
   	}

   if(iccx==2)
   	{
         for(i=0;i<iNums;i++)
	     ipp2[i]=Cget(45);//P55 //JConfig2
   	}

   if(iccx==3)
   	{
         for(i=0;i<iNums;i++)
	     ipp2[i]=Cget(46);//P56 //JConfig3
   	}

	//投票方式,5投三中即认为5V_Out有输出
   iTmp=0;
   for(i=0;i<iNums;i++)
   	iTmp+=ipp2[i];

   if(iTmp>=3)
   	return(1);
   else
   	return(0);

}
//检查传感器供电状况
//	如果供电状态不变则返回0
//	否则
//		如果变为供电则返回值加10
//		如果变为断电则返回值加1
uint8 cFcheck(void)
{

  uint8 iccpnew[4]={0,0,0,0};
  uint8 iLLCh=0;
  uint8 i;


  for(i=0;i<4;   i++)
  	iccpnew[i]=cFin(i);


  for(i=0;i<4;i++)
  	{
  	   if(igV[i] != iccpnew[i])
  	   	{
	   	  iLLCh++;
		  if(igV[i]==0)
		  	iLLCh+=10;
  	   	}
  	}
  
  for(i=0;i<4;i++)
  	{
  	   igV[i] = iccpnew[i];
  	}

  return(iLLCh);

}




uint8 tAC(void)
{
  uint16 iTemp;

  iTemp=TACCTL0;

  if( (iTemp & 0x0001)==0)
  	{
     	  return(0);
  	}
  else
  	{
  	  iTemp=iTemp & 0xFFFE;
	  TACCTL0=iTemp;
     	  return(1);
  	}

}
//向指定端口位写数据
void COut(uint8 ipp,uint8 iTmp2)
{
 uint8 ipixx,ippN;
   
 ippN=ipp/8;
 ipixx=ipp%8; 
 
 if(iTmp2==1)
  {
    switch (ippN)
            {
             case 1:
			   P1OUT=P1OUT | icBA[ipixx];
                        break;

             case 2:
			   P2OUT=P2OUT | icBA[ipixx];
                        break;

             case 3:
			   P3OUT=P3OUT | icBA[ipixx];
                        break;

             case 4:
			   P4OUT=P4OUT | icBA[ipixx];
                        break;
                        
             case 5:
			   P5OUT=P5OUT | icBA[ipixx];
                        break;
                   
             default:
                        break; // Error

           }  
  }
 else
  { 
    switch (ippN)
            {
             case 1:
			   P1OUT=P1OUT & icNBA[ipixx];
                        break;

             case 2:
			   P2OUT=P2OUT & icNBA[ipixx];
                        break;

             case 3:
			   P3OUT=P3OUT & icNBA[ipixx];
                        break;

             case 4:
			   P4OUT=P4OUT & icNBA[ipixx];
                        break;

             case 5:
			   P5OUT=P5OUT & icNBA[ipixx];
                        break;
                    
             default:
                        break;
           }  
  }
 }
//读取ipp指定端口位数据
uint8 Cget(uint8 ipp)
{
 uint8 iIOxPIN;
 uint8 ipixx,ippN;

 ippN=ipp/8;
 ipixx=ipp%8; 
 
 switch (ippN)
  {
   case 1:iIOxPIN=P1IN;
                    break;

   case 2:iIOxPIN=P2IN;
                    break;

   case 3:iIOxPIN=P3IN;
                    break;

   case 4:iIOxPIN=P4IN;
                    break;

   case 5:iIOxPIN=P5IN;
                    break;

   case 6:iIOxPIN=P6IN;
                    break;
                    
   default:
   	        return(0xFF);

  }

 if( (iIOxPIN & icBA[ipixx])==0 )
   return(0);
 else 
   return(1);  
}

//启动转换并等待转换结果,返回该路转换结果
//idd为转换通道选择
//计划改动为:启动转换,下一次主循环检测转换是否完毕。
uint16 aget(uint8 idd)
{
  uint16 iResult;


  ADC12CTL0 = ADC12ON+SHT0_2;
  ADC12CTL1 = SHP;           
  ADC12MCTL0 = idd;
  
  ADC12IE = 0x00;
  ADC12CTL0 |= ENC;
  
  ADC12CTL0 |= ADC12SC;      
  while ((ADC12IFG & BIT0)==0)
    ;
  
  iResult=ADC12MEM0;
  
  return(iResult);
}
//获取模拟读数
uint16 agetx(uint8 idd)
{
  return(aget(idd));

⌨️ 快捷键说明

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