首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

采用12C2052AD的一氧化碳浓度报警程序(中)

采用12C2052AD的一氧化碳浓度报警程序(中)

/*****************主程序***********************************************************/

Void Main()

{  



    Uint A=0;

PWM=1;

Pwm();

    Delayms(1000);//延时

    InitADC();

    Contrl=0;

    Delayms(600);

Ceshi();

Delayms(600);

Sound=0;

   OK=1;

    BAOJING=1;

START=0;

Contrl=1;//初次开机要先加热一分钟以上。在这里等待一分钟

     Wei1=0;//开启显示 数码管,做指示用

For(A=0;A<53;A++)

{

Delayms(1000);

ADC(6);

Sendchar();

      }

     Wei1=1;

Contrl=0;//关闭5V,成为1.5V低电平加热90S

Wei2=0;

  For(A=0;A<80;A++)

{

Delayms(1000);

      }

     Wei2=1;

A=0;

   While(1)

   {



     ADC(6);

Contrl=0;

Run_t0();



  If(START)

  {

  Delayms(5);

     }

A++;

     If(A==6235)

  {

  A=0;

  Sendchar();

  }

   }



}

//  

Void  Run_t0()

{

Cnt=0;

High=1;//首次启动加热5V高电平。标志位置1

Low=0;//低电平1.5V加热标志

TMOD=0x01;

TH0=-(50000/256);

TL0=-(50000%256);

ET0=1;

EA=1;

Contrl=1;//首次启动定时开启5V

TR0=1;



}

//  

Void  Time0()  Interrupt  1//Using **

{

  Cnt++;

  TR0=0;

  If((Cnt==120)&&High) //5V加热达到60S,这里加括号为了阅读方便。但是有时候要注意优先级。==比&就高得多

  {

  TR0=0;

  TH0=-(50000/256);

  TL0=-(50000%256);

  ADC(6);

  }

  If((Cnt==600)&&High) //5V加热达到60S,这里加括号为了阅读方便。但是有时候要注意优先级。==比&就高得多

  {

  TR0=0;

  TH0=-(50000/256);

  TL0=-(50000%256);

  ADC(6);

  }

  If((Cnt==1200)&&High) //5V加热达到60S,这里加括号为了阅读方便。但是有时候要注意优先级。==比&就高得多

  {

  TR0=0;

  Contrl=0;//开启1.5V,即关闭5V

  Cnt=0;

  High=0;//停止加热高5V后清标志位

  Low=1;

  TH0=-(50000/256);

  TL0=-(50000%256);

  ADC(6);

  }

    If((Cnt==180)&&Low)//1.5V加热达到90S

  {

  TH0=-(50000/256);

  TL0=-(50000%256);

  ADC(6);

  }

    If((Cnt==1000)&&Low)//1.5V加热达到90S

  {

  TH0=-(50000/256);

  TL0=-(50000%256);

  ADC(6);

  }

  If((Cnt==1800)&&Low)//1.5V加热达到90S

  {

  Contrl=1;//开启5V     

  Cnt=0;

  Low=0;

  High=1;//  

  TH0=-(50000/256);

  TL0=-(50000%256);

  ADC(6);

  }

  TR0=1;

}

//   

Void Pwm()



{

   CR=0;

   START=0;



    //PCA模块工作于PWM模式 C程序   



   CMOD = 0x02; //用定时器0溢出做PCA脉冲      

   CL = 0x00; //PCA定时器低8位 地址:E9H   

   CH = 0x00; //PCA高8位 地址 F9H   

   CCON=0x00;



   CCAP0L = TimeL; //PWM模式时他俩用来控制占空比   

   CCAP0H = TimeH; //0xff-0xc0=0x3f  64/256=25% 占空比(溢出)     



   CCAPM0 = 0x42; //0100,0010 Setup PCA Module 0 In PWM Mode

               // ECOM0=1使能比较 PWM0=1 使能CEX0脚用作脉宽调节输出

/*********************

PCA 模块工作模式设置 (CCAPMn 寄存器 N= 0-3四种)

7     6        5        4       3       2     1      0

-   ECOMn   CAPPn     CAPNn   MATn     TOGn   PWMn   ECCFn

选项: 0x00 无此操作

       0x20 16位捕捉模式,由 CEXn上升沿触发

       0x10 16位捕捉模式,由CEXn下降沿触发

       0x30 16位捕捉模式,由CEXn的跳变触发

       0x48 16位软件定时器

       0x4c 16位高速输出

       0x42  8位PWM输出

每个PCA模块另外还对应两个寄存器:CCAPnH和CCAPnL 。  捕获或者比较时,它们用来

保存16位计数值,当工作于PWM模式时,用来控制占空比   

*******************************/      



   CR=1; //Start PCA Timer.



}
返回列表