基于单片机的智能火灾报警系统设计源程序代码.docx

上传人:b****3 文档编号:2952523 上传时间:2022-11-16 格式:DOCX 页数:18 大小:19.18KB
下载 相关 举报
基于单片机的智能火灾报警系统设计源程序代码.docx_第1页
第1页 / 共18页
基于单片机的智能火灾报警系统设计源程序代码.docx_第2页
第2页 / 共18页
基于单片机的智能火灾报警系统设计源程序代码.docx_第3页
第3页 / 共18页
基于单片机的智能火灾报警系统设计源程序代码.docx_第4页
第4页 / 共18页
基于单片机的智能火灾报警系统设计源程序代码.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

基于单片机的智能火灾报警系统设计源程序代码.docx

《基于单片机的智能火灾报警系统设计源程序代码.docx》由会员分享,可在线阅读,更多相关《基于单片机的智能火灾报警系统设计源程序代码.docx(18页珍藏版)》请在冰豆网上搜索。

基于单片机的智能火灾报警系统设计源程序代码.docx

基于单片机的智能火灾报警系统设计源程序代码

#include//调用单片机头文件

#defineucharunsignedchar//无符号字符型宏定义变量围0~255

#defineuintunsignedint//无符号整型宏定义变量围0~65535

#include

#include"lcd1602.h"

#include"eeprom52.h"

sbitCS=P2^4;//CS定义为P2口的第4位脚,连接ADC0832CS脚

sbitSCL=P2^3;//SCL定义为P2口的第3位脚,连接ADC0832SCL脚

sbitDO=P2^2;//DO定义为P2口的第2位脚,连接ADC0832DO脚

sbitdq=P2^0;//18b20IO口的定义

sbitbeep=P3^2;//蜂鸣器IO口定义

uinttemperature,s_temp;//温度的变量

ucharyanwu,s_yanwu;//烟物等级

ucharshoudong;//手动报警键

 

bitflag_300ms;

ucharkey_can;//按键值的变量

ucharmenu_1;//菜单设计的变量

bitkey_500ms;

ucharphone1_i=0;//是多少位

ucharphone2_i=0;//是多少位

ucharphone1_call[11]={""};

ucharphone2_call[11]={""};

uchardis_smg[11];

 

/***********************1ms延时函数*****************************/

voiddelay_1ms(uintq)

{

uinti,j;

for(i=0;i

for(j=0;j<120;j++);

}

#include"gsm.h"

 

/***************把数组清空**********************/

voidclear_shuzu(uchar*p,ucharnum)

{

for(i=0;i

p[i]='';

}

 

/******************把数据保存到单片机部eeprom中**写****************/

voidwrite_eeprom()//数据保存

{

SectorErase(0x2000);

for(i=0;i<11;i++)

byte_write(0x2000+i,phone1_call[i]);

byte_write(0x2012,phone1_i);

byte_write(0x2013,phone2_i);

byte_write(0x2014,s_temp);

byte_write(0x2015,s_yanwu);

byte_write(0x2016,a_a);

byte_write(0x2020,phone2_call[0]);

byte_write(0x2021,phone2_call[1]);

byte_write(0x2022,phone2_call[2]);

byte_write(0x2023,phone2_call[3]);

byte_write(0x2024,phone2_call[4]);

byte_write(0x2025,phone2_call[5]);

byte_write(0x2026,phone2_call[6]);

byte_write(0x2027,phone2_call[7]);

byte_write(0x2028,phone2_call[8]);

byte_write(0x2029,phone2_call[9]);

byte_write(0x2030,phone2_call[10]);

}

/******************把数据从单片机部eeprom中读出来**读***************/

voidread_eeprom()

{

for(i=0;i<11;i++)

phone1_call[i]=byte_read(0x2000+i);

phone1_i=byte_read(0x2012);

phone2_i=byte_read(0x2013);

s_temp=byte_read(0x2014);

s_yanwu=byte_read(0x2015);

a_a=byte_read(0x2016);

phone2_call[0]=byte_read(0x2020);

phone2_call[1]=byte_read(0x2021);

phone2_call[2]=byte_read(0x2022);

phone2_call[3]=byte_read(0x2023);

phone2_call[4]=byte_read(0x2024);

phone2_call[5]=byte_read(0x2025);

phone2_call[6]=byte_read(0x2026);

phone2_call[7]=byte_read(0x2027);

phone2_call[8]=byte_read(0x2028);

phone2_call[9]=byte_read(0x2029);

phone2_call[10]=byte_read(0x2030);

}

/**************开机自检eeprom初始化*****************/

voidinit_eeprom()

{

read_eeprom();//读

if(a_a!

=22)

{

a_a=22;

for(i=0;i<11;i++)

{

phone1_call[i]='';

phone2_call[i]='';

}

phone1_i=0;

phone2_i=0;

s_temp=50;

s_yanwu=60;

write_eeprom();//保存数据

}

}

/***********************18b20初始化函数*****************************/

voidinit_18b20()

{

bitq;

dq=1;//把总线拿高

delay_uint

(1);//15us

dq=0;//给复位脉冲

delay_uint(80);//750us

dq=1;//把总线拿高等待

delay_uint(10);//110us

q=dq;//读取18b20初始化信号

delay_uint(20);//200us

dq=1;//把总线拿高释放总线

}

/*************写18b20的数据***************/

voidwrite_18b20(uchardat)

{

uchari;

for(i=0;i<8;i++)

{//写数据是低位开始

dq=0;//把总线拿低写时间隙开始

dq=dat&0x01;//向18b20总线写数据了

delay_uint(5);//60us

dq=1;//释放总线

dat>>=1;

}

}

/*************读取18b20的数据***************/

ucharread_18b20()

{

uchari,value;

for(i=0;i<8;i++)

{

dq=0;//把总线拿低读时间隙开始

value>>=1;//读数据是低位开始

dq=1;//释放总线

if(dq==1)//开始读写数据

value|=0x80;

delay_uint(5);//60us读一个时间隙最少要保持60us的时间

}

returnvalue;//返回数据

}

/*************读取温度的值读出来的是小数***************/

uintread_temp()

{

uintvalue;

ucharlow;//在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序

init_18b20();//初始化18b20

write_18b20(0xcc);//跳过64位ROM

write_18b20(0x44);//启动一次温度转换命令

delay_uint(50);//500us

init_18b20();//初始化18b20

write_18b20(0xcc);//跳过64位ROM

write_18b20(0xbe);//发出读取暂存器命令

EA=0;

low=read_18b20();//读温度低字节

value=read_18b20();//读温度高字节

EA=1;

value<<=8;//把温度的高位左移8位

value|=low;//把读出的温度低位放到value的低八位中

value*=0.0625;//转换到温度值

returnvalue;//返回读出的温度

}

 

/***********读数模转换数据********************************************************/

//请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的

//100通道

//111通道

unsignedcharad0832read(bitSGL,bitODD)

{

unsignedchari=0,value=0,value1=0;

SCL=0;

DO=1;

CS=0;//开始

SCL=1;//第一个上升沿

SCL=0;

DO=SGL;

SCL=1;//第二个上升沿

SCL=0;

DO=ODD;

SCL=1;//第三个上升沿

DO=1;

for(i=0;i<8;i++)

{

SCL=1;

SCL=0;//开始从第四个下降沿接收数据

value<<=1;

if(DO)

value++;

}

for(i=0;i<8;i++)

{//接收校验数据

value1>>=1;

if(DO)

value1+=0x80;

SCL=1;

SCL=0;

}

CS=1;

SCL=1;

if(value==value1)//与校验数据比较,正确就返回数据,否则返回0

returnvalue;

return0;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1