找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1958|回复: 4
打印 上一主题 下一主题
收起左侧

关于煤气报警系统的一些问题请教

[复制链接]
跳转到指定楼层
楼主
ID:225387 发表于 2017-8-7 10:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我还是新手,不会写程序,只能找网上已有的资料。
最近要做煤气报警系统,所以找了一份资料。我要用到的是MQ-2气敏传感器、stc89c52单片机开发板(包含了蜂鸣器和LED等)、DS18B20温度传感器。
下面是程序,我的问题是这个程序好像没有体现出气敏传感器的模数转换、以及蜂鸣器报警,是这样吗?我需要再把这个程序完善一下吗?特别是最后的主函数部分我看不大懂,有没有好心人能给我解读一下
程序:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^0;//定义18B20数据线引脚
sbit LED=P1^3;
sbit input=P1^1;
unsigned char flag;//负数标志
//行扫描数组
uchar code scan[4]={0xef,0xf7,0xfb,0xfd};
//数码管显示的段码表
uchar code table[13]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x39,0x00};//,-,C,kong
//小数部分显示查询表
uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
uchar dispbuf[8];//显示缓冲区
uchar temper[2];//存放温度数组
uchar TCNT;
//******************************
//延时函数
//******************************
void delay (unsigned int us)
{
  while(us--);
}
//******************************
//DS18B20复位函数
//******************************
void reset(void)
{
  uchar x=0;
  DQ=1;
  delay(80);
  DQ=0;
  delay(80);
  DQ=1;
  delay(14);
  x=DQ;
  delay(20);
}
//******************************
//DS18B20中读一个字节
//******************************
uchar readbyte(void)
{
uchar i=0;
uchar dat=0;
for(i=8;i>0;i--)
  {
     DQ=0;                 //拉低总线,启动输入
     dat>>=1;         //要返回的数据右移一位,先读出来的是低位
     DQ=1;
     if(DQ==1)         //当数据线为高时,证明该位数据为 1
     dat|=0x80;         //要传输数据的当前值置为 1,若不是,则为 0
     delay(4);
  }
    return (dat);
}
//******************************
//向DS18B20中写1个字节
//******************************
void writebyte(unsigned char dat)
{
  uchar i=0;
  for(i=8;i>0;i--)
{
   DQ=0;
   DQ=dat&0x01;          //把dat第0位的状态赋给DQ,其余位清零
   delay(5);
   DQ=1;
   dat>>=1;
}
  delay(4);
}
//******************************
//向DS18B20中读取实时温度值
//******************************
  void readtemp(void)
  {
    uchar a=0,b=0;
    reset();
    writebyte(0xCC);//跳过序列号、写指令:跳过rom检测
    writebyte(0x44);//启动温度转换         
    reset();
    writebyte(0xCC);//跳过序列号
    writebyte(0xBE);//读9个寄存器,前2个为温度
    a=readbyte();//低位
    b=readbyte();//高位
    if(b>0x0f)   //判断是否为负值  ;15
    {
     a=~a+1;
     if(a==0)
     b=~b+1;
     else b=~b;
     flag=10;         //标志某种状态
    }
     else flag=12;
     temper[0]=a&0x0f;
     a=a>>4;
     temper[1]=b<<4;
     temper[1]=temper[1]|a;
}
//******************************
//动态扫描显示函数
//******************************
void scandisp()
{
  unsigned char i,value;          //value指浓度值?
  for(i=0;i<4;i++)
  {
    P3=0xff;                // 255
    value=table[dispbuf[i]];
    if(i==2)
    value|=0x80;        //-128;10000000b;把变量value的值的最高位写成“1”,而不改变其它位的值
    P2=value;
    P3=scan[i];
    delay(90);
  }
}
//******************************
//定时中断函数
//******************************
void Timer0(void)interrupt 1 using 1
{
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  TCNT++;
  if(TCNT==6)
{
   TCNT =0;
   LED=~LED;   //若 LED = 0;低电平亮, ~取反 LED = 1;高电平LED灭
}
}
//******************************
//主函数
//******************************
void main()
{
  uchar temp,temp1;
  TCNT=0;
  TMOD=0x01;
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  IE=0x82;
  while(1)
   {
    if(input==0)
    TR0=1;
    else
     {
      TR0=0;
      LED=1;
     }
     readtemp();
     temp1=temper[0];
     temp=temper[1];
     dispbuf[3]=ditab[temp1];
     dispbuf[2]=temp%10;
     temp=temp/10;
     dispbuf[1]=temp%10;
     dispbuf[0]=flag;
     scandisp();
   }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:82765 发表于 2017-8-7 17:38 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

板凳
ID:225591 发表于 2017-8-7 20:30 | 只看该作者
delay 是延时函数
回复

使用道具 举报

地板
ID:225387 发表于 2017-8-8 09:13 | 只看该作者
cjjcjj1 发表于 2017-8-7 17:38
你好!你要把你的具体要求发出来。
然后根据你的要求去完善程序和原理图;
还有,你这个是要做出实物的吧

对的,要做实物。
我的要求是要让MQ-2传感器检测到设定的气体浓度后进行模数转换,然后通过单片机让蜂鸣器响和LED灯亮,即报警。但我找的这个程序主要是DS18B20温度传感器的程序,因为是新手,所以不清楚要怎么修改。
回复

使用道具 举报

5#
ID:82765 发表于 2017-8-8 12:17 来自手机 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表