仿真图proteus 8.9
程序编译器:keil 4/keil 5
编程语言:C语言
设计编号:C0073
主要功能:
结合实际情况,基于51单片机设计一个二氧化碳(CO2)监测报警系。该系统应满足的功能要求为:
二氧化碳传感器,运行状态LED显示、独立键盘、蜂鸣器报警。
C0073 51单片机二氧化碳(CO2)气体浓度监测报警系统
①二氧化碳传感器测得二氧化碳数据后经过单片机处理,由LCD1602实时显示,第一行显示测得的浓度值,第二行显示报警阈值;
②可通过按键设置二氧化碳报警阈值,开始之后预设值闪烁,按键+预设值+10,按键减按下预设值-10;
③测得的二氧化碳浓度在正常范围时,绿灯亮,超过报警阈值时,红灯亮,蜂鸣器响,开始声光报警。
以下为本设计展示图:
主图
开始仿真
开始仿真显示检测值C02为1260ppm,初始化报警值为1500ppm。
按下调整按键后,系统暂停工作,报警值十位数闪烁,按下报警上限+按键,报警值+10,按下按下报警上限-按键,报警值-10。设置完成后,再按一下调整按键,确定调整的报警值,系统正常工作。
在仿真中,可以通过箭头调整CO2气体传感器数值,图示设置为2050ppm,超出了设置的报警值1480,超出上限开始报警,蜂鸣器持续短鸣,红灯闪烁。
/****************************************************************************
函数功能:AD转换子程序
入口参数:CH
出口参数:dat
****************************************************************************/
unsigned char adc0832(unsigned char CH)
{
unsigned char i,test,adval;
adval = 0x00;
test = 0x00;
Clk = 0; //初始化
DATI = 1;
_nop_();
CS = 0;
_nop_();
Clk = 1;
_nop_();
if ( CH == 0x00 ) //通道选择
{
Clk = 0;
DATI = 1; //通道0的第一位
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 0; //通道0的第二位
_nop_();
Clk = 1;
_nop_();
}
else
{
Clk = 0;
DATI = 1; //通道1的第一位
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 1; //通道1的第二位
_nop_();
Clk = 1;
_nop_();
}
Clk = 0;
DATI = 1;
for( i = 0;i < 8;i++ ) //读取前8位的值
{
_nop_();
adval <<= 1;
Clk = 1;
_nop_();
Clk = 0;
if (DATO)
adval |= 0x01;
else
adval |= 0x00;
}
for (i = 0; i < 8; i++) //读取后8位的值
{
test >>= 1;
if (DATO)
test |= 0x80;
else
test |= 0x00;
_nop_();
Clk = 1;
_nop_();
Clk = 0;
}
if (adval == test) //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉
dat = test;
nop_();
CS = 1; //释放ADC0832
DATO = 1;
Clk = 1;
return dat;
}
获取的值需要进行校准
void AlcoholCalibration(void) //CO2浓度初始化校准函数
{
sum = 0;
for(m=0;m<50;m++) //读50次AD值
{
sum = adc0832(0)+sum; //读到的AD值,将读到的数据累加到sum
}
temp=sum/50; //跳出上面的for循环后,将累加的总数除以50得到平均值temp
K_ZERO = 500 * temp / 256; //8位ADC,首先得到电压值,单位10毫伏
Display_1602(0,WARNING); //显示AD数值和报警值
}
void main() //主函数
{
Init1602(); //初始化液晶函数
init(); //初始化定时器
while(1) //进入循环
{
for(m=0;m<50;m++) //读50次AD值
sum = adc0832(0)+sum; //读到的AD值,将读到的数据累加到sum
temp=sum/50; //跳出上面的for循环后,将累加的总数除以50得到平均值temp
if (temp > K_ZERO)
temp = temp - K_ZERO; //首先减去零点漂移,一般是130mV
else
temp= 0;
sum=0; //平均值计算完成后,将总数清零
if(set==0) //set为0,说明现在不是设置状态
Display_1602(temp,WARNING); //显示AD数值和报警值
if(temp<WARNING&&set==0) //AD数值小于报警值
{
flag=0; //关闭报警
}
else if(temp>WARNING&&set==0)//AD值大于报警值
{
flag=1; //打开报警
}
Key(); //调用按键函数
}
}
资料下载链接
搜索设计编号:C0073