仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单通道模拟量报警
比如:酒精报警器,检测浓度,然后浓度过限报警;通过按键设置报警值,同时报警值通过24C02保存
当然也可以改成别的名字,比如:甲烷报警、一氧化碳报警、天然气报警等。
程序流程图:
元件 型号
单片机 AT89C51
电容 10uf
电容 30pf
晶振 12MHZ
电阻 10k
按钮
存储器 24C02
模数芯片 ADC0832
电位器 1k
电阻 1k
三极管 PNP
蜂鸣器 有源
显示器 LCD1602
排阻 10k
单片机源程序如下:
- #include <reg51.h>
- #include <ADC0832.h>
- #include"i2c.h"
- #include "lcd1602.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit k1=P1^0;
- sbit k2=P1^1;
- sbit beep=P2^3;
- uchar disp1[]="Alcohol:000";
- uchar disp2[]="limit:050";
- uchar Alcohol=0;//酒精浓度
- uchar limit =50;//报警阀值
- uchar k=0;
- void delay(uint i) //延时
- {
- while(i--);
- }
- void main()
- {
- TMOD|=0X01;
- TH0=0X3C;
- TL0=0XB0;
- ET0=1;//打开定时器0中断允许
- EA=1;//打开总中断
- TR0=1;//打开定时器
- init_1602();
- limit=At24c02Read(0);//初始化存储
- if(limit>200)
- {
- limit=50;
- At24c02Write(0,limit);
- delay(10000);
- }
- write_string(1,0,disp1); //显示
- write_string(2,2,disp2);
- while(1)
- {
- if(Alcohol>limit)//报警判断
- beep=0;
- else
- beep=1;
- if(!k1)//加
- {
- if(limit<200)
- limit++;
- At24c02Write(0,limit);
- delay(10000);
- while(!k1);
- }
- if(!k2)//减
- {
- if(limit>0)
- limit--;
- At24c02Write(0,limit);
- delay(10000);
- while(!k2);
- }
- }
- }
- void Timer0() interrupt 1//定时器中断
- {
- TH0=0X3C;
- TL0=0XB0;
- if(k<10)
- k++;
- else
- {
- k=0;
- Alcohol=ADC();//测酒精
- disp1[8]=Alcohol/100+0x30;
- disp1[9]=Alcohol%100/10+0x30;
- disp1[10]=Alcohol%10+0x30;
- disp2[6]=limit/100+0x30;
- disp2[7]=limit%100/10+0x30;
- disp2[8]=limit%10+0x30;
- write_string(1,0,disp1); //显示
- write_string(2,2,disp2);
- }
- }
复制代码
所有资料51hei附件下载,注意仿真只能用Proteus7.8版本打开dsn文件:
报警器(1路模拟量,存储).rar
(617.99 KB, 下载次数: 66)
|