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

📄 x20gdnzh1.c

📁 51的典型应用于传感器程序编程架构
💻 C
📖 第 1 页 / 共 5 页
字号:
//*************************************************************************
//输出频率确定   通过遥控器设置改变存储器中0x16 ~15单元中的参数来选择信号制
//*************************************************************************
void inout(void)
{
 union {                           //共用体:几种不同的变量存放在同一个地址开始的内存单元中,编码相同
        float y;
        unsigned char a[4];
        unsigned int  b[2];
        unsigned int  i;
       }z;
 unsigned char j;
 out=reade(0x16);                  //输出频率选择
 j=0x20+out*10;                    //out的取值范围是0~19  j=0x20+19*10=0xDE
 z.i=reade(j);                     //写入分配的内存的前两个字节变量
 fpb=z.a[0];                       //分频参数选择;分频参数写在分配的4个字节内存中的第一个字节
 if(z.a[1]>=0x20) {                //高浓瓦斯和高低浓瓦斯通道选择标志写在第2个字节内存单元中
                   gdn=1;          //高浓瓦斯
                   GN=1;
                   DN=0;
                   adchange=1;     //选择AD通道 即传感头选择
                  }
 else              gdn=0;          //高低浓瓦斯
 if((z.a[1]&0x0f)==1) onetwo=0;    //频率输出1段
 else                 onetwo=1;    //频率输出两段
 z.b[0]=reade(j+1);
 z.b[1]=reade(j+2);
 fd=z.y;              //低浓频率对应值
 z.b[0]=reade(j+3);
 z.b[1]=reade(j+4);
 fj1=z.y;             //低浓频率对应基值
 z.b[0]=reade(j+5);
 z.b[1]=reade(j+6);
 fg=z.y;              //高浓频率对应值
 z.b[0]=reade(j+7);
 z.b[1]=reade(j+8);
 fj2=z.y;             //高浓频率对应基值
 timebc1=reade(j+9);
}
// ************************************************
//显示“0AA”
//*************************************************
void dirout(void)
{
 tbuffer2=26;tbuffer3=out/10;tbuffer4=out%10;
 led2p=0;led3p=0;
}
//-----------------------------------------------
//显示低浓零点EEPROM 01H.00H
void dirld(unsigned int i)
{
 i*=0.09156;
 i=HEX2BCD(i);
 tbuffer2=i>>8;
 tbuffer3=(i&0x00f0)>>4;
 tbuffer4=i&0x000f;
 led2p=0;led3p=0;
 led2c=0;led3c=0;led4c=0;
}
//-----------------------------------------------
//低浓放大显示
void dirkw(unsigned char i)
{
 unsigned int j;
 j=HEX2BCD(i);
 tbuffer2=j>>8;
 tbuffer3=(j&0x00f0)>>4;
 tbuffer4=j&0x000f;
 led2p=1;led3p=0;
 led2c=0;led3c=0;led4c=0;
 delay(38500);//延时500ms
 dog();
 dirb();
 delay(18500);//延时xxxms
 dog();
 led2c=0;led3c=0;led4c=0;
 delay(38500);//延时500ms
 dog();
}
//-----------------------------------------------
//非线性EEPROM 05H.04H
void inunline(void)
{
 uline=reade(4);
 if(uline>127)     linezp=1;//非线性正负标志  =1负 =0正
 else              linezp=0;
}
//-----------------------------------------------
//***********************************************
//显示非线性
//***********************************************
void dirunline(void)
{
 if(!linezp) {
               tbuffer2=0;//显示'0'
               tbuffer3=(uline*100/256)/10;
               tbuffer4=(uline*100/256)%10;
             }
 else        {
               tbuffer2=20;//显示'-'
               tbuffer3=(~uline*100/256)/10;
               tbuffer4=(~uline*100/256)%10;
             }
 led2p=1;led3p=0;
 led2c=0;led3c=0;led4c=0;
}
//-----------------------------------------------
//显示高浓非线性1
void dirulineg(unsigned char i,unsigned char j)
{
 unsigned int k;
 tbuffer2=i;//显示'-'
 k=HEX2BCD(j*100/256);
 tbuffer3=k>>4;
 tbuffer4=k&0x000f;
 led2p=1;led3p=0;
 led2c=0;led3c=0;led4c=0;
}
//-----------------------------------------------
//显示报警点
void dir(unsigned char i,unsigned int j)
{
 tbuffer2=i;
 led2p=0;
 if(j>=1000){
             //tbuffer2=i;//'A'
             tbuffer3=j/1000;
             tbuffer4=(unsigned int)(j/100)%10;
             //led2p=0;
             led3p=0;
            }
 else       {
             // tbuffer2=i;//'A'
             tbuffer3=j/100;
             tbuffer4=(j/10)%10;
             //led2p=0;
             led3p=1;
            }
}
//***********************************************
//频率输出
//***********************************************
void plout(float i)
{
  unsigned int k;
  if((unsigned char)i>=timebc1)   i=timebc1;       //timebc1:低浓
  if(!gdzh&&!gdn) {                                //低浓频率输出
                   //timebc=timebc1;
                   //timebc=14;
                   if(dnegpos) {                   //dnegpos:低浓瓦斯正负标志 =1浓度为负 =0浓度正
                                i=0.01; BJ=0; DD=0;//BJ=P2_7  DD=P3_2  i=瓦斯浓度
                               }                   //浓度为负输出当前频率低限
                   if(fpb>=10) {                    //分频超过20Hz单元 0.4%,0.2%,10%
                                if(i>=20) {        //fd:每单位瓦斯浓度对应的频率值  fj1:低浓对应频率基值如200HZ~1000HZ中的200HZ就是基值
                                           i=(0x10000-0xe1000/((i*fd+fj1)*2));   //+timebc;//10000H-#0E1000H/[(浓度)*160+200] 10个周期补偿
                                           fp=0;
                                          }
                                else      {
                                           i=(0x10000-0xe1000/((i*fd*64+fj1)*2));//+timebc;//10000H-#0E1000H/[(浓度)*160+200] 10个周期补偿
                                           fp=1;
                                          }
                               }
                   else        {
                                if((out!=10)&&(i>=fpb*0.1)) {
                                                             i=(0x10000-0xe1000/((i*fd+fj1)*2));//+timebc;//10000H-#0E1000H/[(浓度)*160+200] 10个周期补偿
                                                             fp=0;
                                                            }
                                else                        {
                                                             if(i<=0.01)   i=0.01;
                                                             i=(0x10000-0xe1000/((i*fd*64+fj1)*2));//+timebc;//10000H-#0E1000H/[(浓度)*160+200] 10个周期补偿
                                                             fp=1;
                                                            }
                               }
                 }
  else           {//高浓频率输出
                  //timebc=timebc2;
                  //timebc=14;
                  if(gnegpos) {                 //dnegpos:低浓瓦斯正负标志 =1浓度为负 =0浓度正
                               i=0.01;BJ=0;DD=0;
                              }                 //浓度为负输出当前频率低限
                  if(fpb>=10)
                              if((out!=10)&&(out!=17)&&(i>=20)) {
                                                                 i=(0x10000-0xe1000/((i*fg+fj2)*2));//+timebc;//10000H-#0E1000H/[(浓度)*160+200] 10个周期补偿
                                                                 fp=0;
                                                                }
                              else                              {
                                                                 i=(0x10000-0xe1000/((i*fg*64+fj2)*2));//+timebc;//10000H-#0E1000H/[(浓度)*160+200] 10个周期补偿
                                                                 fp=1;
                                                                }
                              else if(i>4)                      {
                                                                 if(onetwo) i-=4;
                                                                 i=(0x10000-0xe1000/((i*fg+fj2)*2));//+timebc;
                                                                 fp=0;
                                                                }
                  else       {
                              if(i>=fpb*0.1) {
                                              i=(0x10000-0xe1000/((i*fd+fj1)*2));//+timebc;//10000H-#0E1000H/[(浓度)*160+200] 10个周期补偿
                                              fp=0;
                                             }
                              else           {
                                              if(i<=0.01)  i=0.01;
                                              i=(0x10000-0xe1000/((i*fd*64+fj1)*2));//+timebc;//10000H-#0E1000H/[(浓度)*160+200] 10个周期补偿
                                              fp=1;
                                             }
                             }
                }
  k=(unsigned int)i;         //强制类型转换
  k+=14;                     //补偿周期
  timerl=k%256;timerh=k/256; //频率输出定时时间
}
//*********************************************
//断电判断
//*********************************************
void ddd(float i)
{
 float m;
 m=pout;                           //断电处理
 if(i>=(m/100)) {
                 DD=1;             //断电
                }
 else           {                  //判断复电
                 m=fout;           //复电处理
                 if(i<(m/100))DD=0;//复电
                }
}
//-----------------------------------------------
//报警判断
void bjj(float l)
{
 float m;
 m=alarm;                         //报警处理
 if(l>=(m/100)) alarmflag=1;      //>报警点进行报警
 else          {
                alarmflag=0;                //<报警点不进行报警
                BJ=0;
               }
}
//-----------------------------------------------
//遥控器输入
void inyk(void)
{
 unsigned int i;
 if(enyk){//有效按键
          enyk=0;//清有效按键标志
          if(gnflag==0){//功能码没有按下过
                        if(YKCODE==0xC0){//是功能码按下

⌨️ 快捷键说明

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