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

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

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

//AD转换初始化 ----打开ADC电源,设置AD口开漏状态

Void InitADC()

{

ADC_CONTR|=0x80;

Delayms(12);

//这两个寄存器用来设置 P1口四种状态,每一位对应一个P1引脚 ,按状态组合操作



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

P1M0 和P1M1 寄存器位  7      6     5    4     3      2     1     0

                     P1.7  P1.6  P1.5  P1.4  P1.3  P1.2  P1.1  P1.0

同理P3M0  P3M0 也是。因为STC12C2052AD只有两个P口,所以只有这俩组  STC12C5410AD还多P2M0 P1M0 有三组   

  P1M0   P1M1                 高

    0   0     普通I0口 (准双向)      P1寄存器位  7      6     5    4     3      2     1     0

0      1     强推挽输出 (20MA电流 )尽量少用      P1.7  P1.6  P1.5  P1.4  P1.3  P1.2  P1.1  P1.0

1  0     仅做输入  A/D转换时可用此模式     

1      1    开漏 ,A/D转换时可用此模式





  例如:

  要设置P1.1为 AD 输入口

  则 P1M0=0X02 ;

     P1M1=0X02;   开漏即可

  当不用AD时,最好 关闭ADC电源 ,恢复为IO口状态

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

P1M0=0x40;//这两个寄存器用来设置 P1口四种状态,每一位对应一个P1引脚 ,按状态组合操作

P1M1=0x40;//P1.6位AD输入端

Delayms(12);

}







// AD转换程序

Void  ADC(Uchar Port)

{

    Uint V0;



    ADC_DATA   = 0; //清除结果



    ADC_CONTR = 0x60;      //转换速度设置  0x60  最快速度



    ADC_CONTR = 0xe0;               //1110,0000 清 ADC_FLAG, ADC_START 位和低 3 位



    ADC_CONTR |= Port;           //选择 A/D 当前通道   P1.6

   // Delayms(1);                       //使输入电压达到稳定

    ADC_CONTR |= 0x08;              //0000,1000 令 ADCS = 1, 启动A/D转换,  



    While(!(ADC_CONTR & 0x10)); //!的优先级比&高太多了  

   //养成经常加括号的习惯 ,没坏处 。也不浪费速度

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

这里While 不能改成While(ADC_CONTR & 0x10==0) ;就错误了,因为优先级 ==比&高 ,所以要加括号

  While( (ADC_CONTR & 0x10)  ==0)    或者非一下  While(!(ADC_CONTR & 0x10)); //!的优先级比&高太多了  

  While()

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

     ADC_CONTR &= 0xE7;     //1111,0111 清 ADC_FLAG 位, 关闭A/D转换,  



    V0=  ADC_DATA; //返回 A/D



    Voltage=V0*100.0/256.0*5.0;//注意每一步计算要考虑是否超了左边变量的范围,如果5.0放前面就有可能溢出

Xianshi[0]=Vol/1000;

Xianshi[1]=Vol%1000/100;

Xianshi[2]=Vol%100/10;

Xianshi[3]=Vol%10;



      If(Voltage<399.0)//危险浓度以下

    {

      OK=0;

     BAOJING=1;//报警灯灭

START=1;

Sound=0;//声音控制脚灭

    }



       If( Voltage>399.0)//C0浓度过高

    {

     BAOJING=0;//报警灯亮

OK=1;

START=1;

Sound=1;//声音报警

    }



}

//  延时

Void Delayms(Uint K)

{

Uint Data I,J;

For(I=0;I<K;I++)

  {

    For(J=0;J<200;J++)

     {;}

   }

}
返回列表