本帖最后由 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(); //报警
}
拿回去慢慢看
一周热门 更多>