火灾自动报警器 烟雾传感器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();     //报警
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。