凑,成本低廉,可靠性高。在电路中,对电容C1和C2的值要求不是很严格,如果使用高质的晶振,则不管频率为多少,C1、C2通常都选择30pF。
定时/计数器:STC89C52单片机内含有2个16位的定时器/计数器。
RAM:高于7FH内部数据存储器的地址是8位的,也就是说其地址空间只有256字节,但内部RAM的寻址方式实际上可提供384字节。的直接地址访问同一个存储空间,高于7FH的间接地址访问另一个存储空间。
SFR:SFR是具有特殊功能的所有寄存器的集合,共含有22个不同寄存器,它们的地址分配在80H~FFH中。
中断系统:STC89C52单片机有6个中断源,中断系统主要由中断允许寄存器IE、中断优先级寄存器IP、优先级结构和一些逻辑门组成。IE寄存器用于允许或禁止中断;IP寄存器用于确定中断源的优先级别;优先级结构用于执行中断源的优先排序;有关逻辑门用于输入中断请求信号。 3.3其他单元电路设计 A/D转换电路设计
在此用的A/D转换电路中的AD是ADC0832,ADC0832 为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。芯片转换时间仅为32μS,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。通过DI 数据输入端,可以轻易的实现通道功能的选择。
天然气传感器
天然气传感器用的是MQ-2烟雾传感器模块。可以用于家庭和工厂的气体泄漏监测装置,适宜于液化气、丁烷、丙烷、甲烷、酒精、烟雾等的探测;它灵敏度可调,工作电压5V 使用前,供电至少预热2分钟以上,传感器稍微发烫属于正常现象,输出形式有模拟量电压输出和数字开关量输出(0和1)。
显示模块设计
设计采用1602液晶显示进行显示,1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
1602LCD 液晶具有如下的特性: 3.3V或5V工作电压,对比度可调。
提供各种控制命令,如:清屏、光标闪烁、显示移位等多种功能。 有80字节显示数据存储器DDRAM。
内建有192个5X7点阵的字型的字符发生器CGROM。 8个可由用户自定义的5X7的字符发生器CGRAM。 按键调整系统模块设计
按键采用3个独立的按键,一个设置键、一个加按键、一个减按键通过这三个按键可以来合理的设置天然气浓度上限的调整。
4 程序流程框图
4.1主程序流程框图
单片机开始执行程序后,首先进行数据初始化,并判断是否高于天然气上限值。如果是,则进行蜂鸣器报警程序;如果否,则进行判断是否需要修改天然气上限值,如果是则就行修改,如果否则进行读取ADC中转化的天然气浓度并且进行数据分离,然后显示直到程序结束。
开始 初始化 判断是否高于天然气上限值? 是 蜂鸣器报警 否 判断是否要修改天然气上限值? 是 按键修改上限值 否 读取ADC中的天然气浓度转化后的数值 分离天然气浓度并进行显示 显示子程序 返回
图3主程序流程框图
4.2 A/D转换流程图
A/D转换时首先进行端口初始化,然后进行通道的选择,然后单片机读取A/D端口
的数据,读取完成后,延迟,等待下一个A/D数据的读取。
开始 A/D端口初始化 选择进行转换的通道 读取A/D端口数值 读取完成 返回
图4 A/D主程序流程框图
仿真电路图:
程序源代码: #include
/******lcd1602显示***********/ uchar tabel[10]=%uchar tabel1[12]=%uchar tabel2[13]=%uchar temp,i,set_temp,flag;
uchar CH=0x02;
sbit lcden=P1^2; sbit lcdrs=P1^0; sbit lcdrw=P1^1;
sbit k1=P3^0; sbit k2=P3^1; sbit k3=P3^2;
sbit CS=P1^7; //使能。 sbit CLK=P1^5;//时钟 sbit Do=P1^6; // 数据输出 sbit Di=P1^6;//数据输入
sbit beep=P1^3;//蜂鸣器
uchar A_D(void) {
uchar i;
uchar data_f=0,data_c=0; Di=1; CS=1;
_nop_(); CS=0;
Di=1; //芯片使能之前的初始化。第一个下降沿 CLK=1; _nop_(); _nop_();
/****************************************/ CLK=0; // 确定通道模式、第2个下降沿 _nop_(); _nop_(); CLK=1;
Di=(bit)(0x02&CH); //设定通道初始化 _nop_(); CLK=0; _nop_(); _nop_(); CLK=1;
Di=(bit)(0x01&CH); //设定通道初始化 .第3个下降沿 _nop_(); _nop_();
CLK=0; //AD转化的初始化完成。 Di=1; CLK=1; _nop_(); _nop_(); CLK=0; _nop_(); CLK=1;
for(i=8;i>0;i--)//得到一个正常排序的8位数据 { data_f|=Do; data_f<<=1; CLK=1;