📄 main_h2s_3.c
字号:
#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 + -