火灾自动报警器 烟雾传感器MQ-2 温度传感器DS18B20 ADC0832 LED...

2019-07-16 03:55发布

本帖最后由 weizhi689 于 2012-11-8 21:42 编辑

火灾自动报警器 烟雾传感器MQ-2 温度传感器DS18B20 ADC0832  LED显示 硬件已经接好了 主要问题是浓度不显示 温度显示 一接上蜂鸣器就响 程序请大家帮忙看看
STC89C52单片机  11.0592HZ
#include<reg52.h>
#include<intrins.h>
#define  uchar unsigned char
#define  uint  unsigned int
sbit DQ=P1^7;   // DS18b20 引脚
sbit Do=P1^5;    //ADC0832管脚定义
sbit Di=P1^5;
sbit clk=P1^4;
sbit cs=P2^0;
sbit led=P1^0;    //报警灯
sbit buzzer=P1^1;// 蜂鸣器
uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
uchar value_DS,value_AD;
void delay(uchar x)  //延时函数
{while(x--); }

//初始化函数      DS18B20
Init_DS18B20()
{
    uchar x=0;
    DQ = 1;  //DQ复位
    delay(8);  //稍做延时
    DQ = 0;  //单片机将DQ拉低
    delay(80);  //精确延时 大于 480us
    DQ = 1;  //拉高总线
    delay(14);
    x=DQ;  //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
    delay(20);
}

//读一个字节
uchar ReadOneChar(void)
{
    uchar i=0;
    uchar dat = 0;
    for (i=8;i>0;i--){
        DQ = 0; // 给脉冲信号
        dat>>=1;
        DQ = 1; // 给脉冲信号
        if(DQ)  dat|=0x80;
        delay(4);
        }
    return(dat);
}

//写一个字节
void WriteOneChar(uchar dat)
{
    uchar i=0;
    for (i=8; i>0; i--)
    {
        DQ = 0;
        DQ = dat&0x01;
        delay(5);
        DQ = 1;
        dat>>=1;
        }
}

ReadTemperature()
{
    uchar a=0;
    uchar b=0;
    uint t=0;
    float tt=0;
    Init_DS18B20();
    WriteOneChar(0xCC); // 跳过读序号列号的操作
    WriteOneChar(0x44); // 启动温度转换
    Init_DS18B20();
    WriteOneChar(0xCC); //跳过读序号列号的操作
    WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
    a=ReadOneChar();
    b=ReadOneChar();
    t=b;
    t<<=8;
    t=t|a;
    tt=t*0.0625; //将温度的高位与低位合并
    t= tt*10+0.5; //对结果进行4舍5入
    return(t);
}

//ADC0832 子程序
Init_ADC0832 ()     //初始化
{
   clk=0;
   cs=1;
   Di=1;   
}
uchar read_ADC0832(uchar SGL,uchar ODD)   
{
   uchar i,data1=0,data2=0;
  Di=1;_nop_();_nop_();          //起始信号
  clk=0;_nop_();_nop_();
  cs=0;_nop_();_nop_();

  clk=1;_nop_();_nop_();
  clk=0;_nop_();_nop_();   //第1个下升沿
  
  Do=SGL;_nop_();_nop_();  //通道选择1
  clk=1;_nop_();_nop_();
  clk=0;_nop_();_nop_();  //第2个下升沿
  
  Do=ODD;_nop_();_nop_(); //通道选择2
  clk=1;_nop_();_nop_();
  clk=0;_nop_();_nop_();   //第3个下升沿
  
  for(i=0;i<8;i++)         //从高到低取数据
  {
    clk=1;_nop_();_nop_();
    clk=0;_nop_();_nop_();  //第4个下升沿
    data1=data1>>1;
    if(Do)data1=data1|0x80;


  }

for(i=0;i<8;i++)         //  从低到高取数据
  {
    clk=1;_nop_();_nop_();
    clk=0;_nop_();_nop_();  
    data2=data2<<1;
    if(Do)data2=data2|0x01;
   }
   clk=0;cs=1;Di=1;          //初始状态
   if(data1=data2)return data1;      //校验数据
                                                                                   
}  



void desplay()
{
   uchar i,value_AD,temp[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
   uchar  value_DS,dis[]={0,0,0,0,0,0,0,0};
  while(1)
  {
         value_DS=ReadTemperature();  //温度
      dis[5]=table[value_DS/100];
      dis[6]=table[value_DS%100/10];
      dis[7]=table[value_DS%10];

      value_AD=read_ADC0832(1,0);  // ADC0832烟雾浓度数据
      dis[0]=table[value_AD/100];
      dis[1]=table[value_AD%100/10];
      dis[2]=table[value_AD%10];
      
      
      for(i=5;i<8;i++)      //温度显示
      {
           P2=temp; //    位选
         P0=dis ;    //    段选
         
         if(i==6)P0=P0&0x7f;  //显示小数点
         delay(100);         
        
      }
      for(i=0;i<3;i++)  //浓度显示
      {
           P2=temp; //    位选
         P0=dis ;    //    段选
          delay(100);         
        
      }

  }
}
void baojing()
{
   if(value_DS>=50||value_AD>=25)   //温度大于50 浓度大于25 报警
   {
       led=0;
      delay(200);
      led=1;
      delay(200);

      buzzer=0;
      delay(200);
      buzzer=1;
      delay(200);
}
}
void main()
{
  Init_ADC0832();
  Init_DS18B20();
  desplay();//   显示
  baojing();     //报警
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
d7wangping
1楼-- · 2019-07-17 07:11
果断下载                                            
DLK
2楼-- · 2019-07-17 11:00
 精彩回答 2  元偷偷看……
ST_Lover
3楼-- · 2019-07-17 11:28
傻逼啊,谁帮你看程序啊 !!!!!!!!!!!
·愿··Y·
4楼-- · 2019-07-17 13:52
能把原理图发出来看看么?
heishe1989
5楼-- · 2019-07-17 17:59
最起码你的主程序是有问题的,应将初始化操作放在一个无限循环里面啊,要不然一直初始化;还有搞单片机最重要的就是软硬结合,没有电路原理图,程序什么也说明不了的。好好加油啊,少年!!
A670521546
6楼-- · 2019-07-17 22:48
MQ-2烟雾传感器制作过程,能够显示实时空气中的烟雾含量(包含代码)
http://bbs.elecfans.com/jishu_496551_1_1.html

一周热门 更多>