谁给我编个应用于烟雾报警的单片机小程序,是基于51单片机的

就是那种很简单的设定一个阀值,有单片机来控制,到了那个温度点蜂鸣器就报警,端口随便,反正到时候我稍微改下就行,有的话尽快,差不多,我就给分,急用!... 就是那种很简单的设定一个阀值,有单片机来控制,到了那个温度点蜂鸣器就报警,端口随便,反正到时候我稍微改下就行,有的话尽快,差不多,我就给分,急用! 展开
 我来答
匿名用户
2013-12-02
展开全部
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6; //开显示的段
sbit wela=P2^7; //开显示的位
sbit beep=P3^6; //蜂鸣器
uchar i;
uchar tempL,tempH,temperature;
sbit DQ=P3^7; //温度传感器
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0};
void delay2(uint k)
{
uint n;
n=0;
while(n < k)
{n++;}
return;
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}Init_DS18B20(void)
{
unsigned char x=0;
DQ=1; //DQ先置高
delay2(8); //延时
DQ=0; //发送复位脉冲
delay2(85); //延时(>480ms)
DQ=1; //拉高数据线
delay2(14); //等待(15~60ms)
}/****************************************************************************
函数功能:向DS18B20读一字节数据
入口参数:
出口参数:dat
****************************************************************************/
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat=0;
for (i=8;i>0;i--)
{
DQ=1;
delay2(1);
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay2(4);
}
return(dat);
}
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay2(5);
DQ=1;
dat>>=1;
}
delay(4);
}
ReadTemperature(void)
{
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0x44); //启动温度转换
delay2(125); //转换需要一点时间,延时
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)
tempL=ReadOneChar(); //读出温度的低位LSB
tempH=ReadOneChar(); //读出温度的高位MSB
//温度转换,把高低位做相应的运算转化为实际温度
temperature=((tempH*256)+tempL)*0.0625;
delay2(200);
return(temperature);
}
void display(uint j)
{
dula=1;
P0=table[j/10];
dula=0;
P0=0x00;
wela=1;
P0=0xfe;
wela=0;
delay(1); dula=1;
P0=table[j%10];
dula=0;
P0=0x00;
wela=1;
P0=0xfd;
wela=0;
delay(1);}
void main()
{
while(1)
{
i=ReadTemperature() ;
if(i==X)//X是自己设定的温度值,这里你自己设定
beep=1;
else beep=0;//如果你想设定多个温度值,可以用switch语句
display(i);
}
}
//这个程序最关键的是怎样写好温度传感器的时序程序
//主要是下面的这个程序,显示你可以改成你自己的电路的显示
/*
void delay2(uint k) //这个延时一般不要改动他的时间
{
uint n;
n=0;
while(n < k)
{n++;}
return;
}
Init_DS18B20(void)
{
unsigned char x=0;
DQ=1; //DQ先置高
delay2(8); //延时
DQ=0; //发送复位脉冲
delay2(85); //延时(>480ms)
DQ=1; //拉高数据线
delay2(14); //等待(15~60ms)
}/****************************************************************************
函数功能:向DS18B20读一字节数据
入口参数:
出口参数:dat
****************************************************************************/
/*ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat=0;
for (i=8;i>0;i--)
{
DQ=1;
delay2(1);
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay2(4);
}
return(dat);
}
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay2(5);
DQ=1;
dat>>=1;
}
delay(4);
}
ReadTemperature(void)
{
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0x44); //启动温度转换
delay2(125); //转换需要一点时间,延时
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)
tempL=ReadOneChar(); //读出温度的低位LSB
tempH=ReadOneChar(); //读出温度的高位MSB
//温度转换,把高低位做相应的运算转化为实际温度
temperature=((tempH*256)+tempL)*0.0625;
delay2(200);
return(temperature);
} *///希望对你有所帮助,有什么不懂得可以问我。
成都智安周界科技有限公司_
2023-07-11 广告
脉冲电子围栏的工作原理是:脉冲主机通电后,会每隔1.5秒发出一个脉冲电压,这个脉冲电压会持续0.1秒左右。当脉冲电压沿着前端围栏传递时,如果前端围栏没有遭到破坏,脉冲主机就会通过接收端口接收反馈回来的脉冲信号。如果前端围栏由于某些原因(例如... 点击进入详情页
本回答由成都智安周界科技有限公司_提供
匿名用户
2013-12-02
展开全部
就是只要做个温度高于设定温度就会报警的电路及代码是吗?可以装个可调与热敏电阻串联分压,再通过比较器,如果温度超过,比较器会变为另一个状态,0,1,用单片机读取就可以知道了......
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式