采用12C2052AD的一氧化碳浓度报警程序(下)
- UID
- 852722
|
采用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++)
{;}
}
} |
|
|
|
|
|