/******************把数据保存到单片机内咅Beeprom中**写电话号码****************/
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;
//返回数据
〃初始化18b20
〃跳过64位ROM
〃启动一次温度转换命令
//500us
/*************
读取温度的值读出来的是小数***************/
uintread_temp()
{
uintvalue;
ucharlow;〃在读取温度的时候如果中断的太频繁了,就应该把中断给
关了,否则会影响到18b20的时序
init_18b20();
write_18b20(0xcc);
write_18b20(0x44);
delay_uint(50);
write_18b20(0xcc);write_18b20(0xbe);
〃跳过64位ROM
〃发出读取暂存器命令
EA=0;
low=read_18b20();value=read_18b20();
EA=1;
value<<=8;
value|=low;
value*=0.0625;returnvalue;
}
//读温度低字节
//读温度高字节
〃把温度的高位左移8位
〃把读出的温度低位放到value的低八位中
//转换到温度值
〃返回读出的温度
/***********
********************************************************/
〃请先了解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)
〃与校验数据比较,正确就返回数据,否则返回
returnvalue;
return0;
}
I*************定^时器^
voidtime_init()
{
0初始化程序***************/
EA=1;
TMOD|=0X01;
ET0=1;
TR0=1;
II开总中断
II定时器0、定时器1工作方式1
II开定时器0中断
II允许定时器0定时
I********************
ucharkey_can;
独立按键程序*****************/
II按键值
voidkey()
{
staticucharkey_new=0,key_l;
key_can=20;
P1=0x0f;
if((P1&0x0f)!
=0x0f)
{
delay_1ms
(1);
II独立按键程序
//按键值还原
II按键按下
II按键消抖动
if(((P1&0x0f)!
=0x0f)&&(key_new==1)){
key_new=0;key_l=(P1|0xf0);
P1=key_l;
switch(P1)
case0xee:
key_can=1;
break;
//得到按键值
case0xde:
key_can=4;
break;
//得到按键值
case0xbe:
key_can=7;
break;
//得到按键值
case0x7e:
key_can=10;
break;
〃得到按键值
case0xed:
key_can=2;
break;
〃得到按键值
case0xdd:
key_can=5;
break;
//得到按键值
case0xbd:
key_can=8;
break;
//得到按键值
case0x7d:
key_can=0;
break;
〃得到按键值
case0xeb:
key_can=3;
break;
〃得到按键值
case0xdb:
key_can=6;
break;
//得到按键值
case0xbb:
key_can=9;
break;
//得到按键值
case0x7b:
key_can=11;
break;
〃得到按键值
case0xe7:
key_can=15;
break;
//得到按键值
case0xd7:
key_can=14;
break;
//得到按键值
case0xb7:
key_can=13;
break;
〃得到按键值
case0x77:
key_can=12;
break;
//得到按键值
menu_1++;
if(menu_1>=5)
{
menu_1=0;
init_1602();II初始化显示
}
if(menu_1==3)
{
〃输入第一个人的手机号码
wnte_string(1,0,"InputPhone1write_string(2,0,"clear_shuzu(dis_smg,11);
for(i=0;idis_smg[i]=0x30+phone1_call[i];write_string_num(2,0,dis_smg,phone1_i);lcd1602_guanbiao(1,phone1_i+0x40);
”);
”);
//显示号码
〃开光标
}
if(menu_1==4)
{
write_string(1,0,"InputPhone2write_string(2,0,"clear_shuzu(dis_smg,11);
for(i=0;iwrite_string_num(2,0,dis_smg,phone2_i);lcd1602_guanbiao(1,phone2_i+0x40);
}
}
if(menu_1==0)
{
〃输入第二个人的手机号码
");
");
//显示号码
〃开光标
if((key_can==2)||(key_can==3))shoudong=0;
//取消手动报警
}
if(menu_1==1)
{
if(key_can==14)
{
s_temp++;if(s_temp>99)s_temp=99;
//设置高温报警
〃高温报警值加1
}
if(key_can==13)
{
s_temp--;
if(s_temp<=10)
s_temp=10;
II咼温报警值减1
}
write_sfm2(1,8,s_temp);write_sfm2(2,8,s_yanwu);write_com(0x80+7);write_com(0x0f);write_eeprom();
}
if(menu_1==2)
{
//设置烟物报警
if(key_can==14)
{
s_yanwu++:
if(s_yanwu
//烟物报警值加1
>=99)
s_yanwu=99;
}
if(key_can==13)
{
s_yanwu--;//烟物报警值减1
if(s_yanwu<=1)
s_yanwu=1;
}
write_sfm2(1,8,s_temp);//显示温度
write_sfm2(2,8,s_yanwu);
write_com(0x80+0x40+7);wnte_com(OxOf);
write_eeprom();
//保存数据
}
if(menu_1==3)
{
〃显示烟物等级
〃将光标移动到第2行第到3位
//显示光标并且闪烁
//设置第一个人短信号码
//只有数字键
if(key_can<10)
{
if(phone1_i<11)
{
phone1_call[phone1_i]=key_can;
dis_smg[phone1_i]=0x30+key_can;
phone1_i++;
if(phone1_i>11)
phone1_i=11;
write_string_num(2,0,dis_smg,phone1_i);//显示号码
lcd1602_guanbiao(1,0+phone1_i+0x40);//开光标
}
}
if(key_can==11)〃删除键
if(phone1_i!
=0)
{
phone1_i--;
phone1_call[phone1_i]='';
dis_smg[phone1_i]='';
write_string(2,0,"”);
write_string_num(2,0,dis_smg,phone1_i);
Icd1602_guanbiao(1,0+phone1_i+0x40);
//显示号码
〃开光标
}write_eeprom();
}
if(menu_1==4)
{
//保存数据
//设置第二个人短信号码
if(key_can<10)
{
//只有数字键
if(phone2_i<11){
phone2_call[phone2_i]=key_can;dis_smg[phone2_i]=0x30+key_can;
phone2_i++;
if(phone2_i>11)
phone2_i=11;
//显示号码
〃开光标
write_string_num(2,0,dis_smg,phone2_i);lcd1602_guanbiao(1,0+phone2_i+0x40);
}
if(key_can==11)〃删除键
{
if(phone2_i!
=0)
{
phone2_i--;
phone2_call[phone2_i]='';
dis_smg[phone2_i]='';
write_string(2,0,"");
//显示号码
〃开光标
write_string_num(2,0,dis_smg,phone2_i);lcd1602_guanbiao(1,0+phone2_i+0x40);
}
write_eeprom();
//保存数据
/****************扌艮警函***************/
voidclock_h_l()
{
staticucharvalue,value1;
//报警
if((yanwu>=s_yanwu)||(temperature>=s_temp)||(shoudong==1)){
value++;
if(value>=2)
{
value=10;
beep=~beep;//蜂鸣器报警
if(value1==0)
{
}
}else
{
//取
if((yanwu消报警
//取消报警
value=0;beep=1;value1=0;
主函*****************/
/***************
voidmain()
{
init_1602();//1602液晶初始化
temperature=read_temp();//读取温度值
beep=0;
delay_1ms(200);
P0=P1=P2=P3=0xff;
init_eeprom();
time_init();
init_uart();
delay_1ms(650);
init_1602();
init_gsm();
for(i=0;i<6;i++)
{
//开机蜂鸣器叫一声
//初始化10口
〃读eeprom数据
//初始化定时器
//串口初始化
〃1602液晶初始化
//手机模块初始化
beeP=-beep;delay_1ms(100);
〃蜂鸣器叫3声
}
beep=1;while
(1)
{
〃关闭蜂鸣器
key();
if(key_can<20)
{
key_with();
}
if(flag_300ms==1)
{
//独立按键程序
〃按键按下要执行的程序
flag_300ms=0;
temperature=read_temp();//读取温度值
clock_h_l();
yanwu=ad0832read(1,0);
yanwu=yanwu*99/255;
if(menu_1==0)
{
if(temperature>=99)temperature=99;
write_sfm2(1,8,temperature);write_sfm2(2,8,yanwu);
〃显示温度
//显示烟物等级
定时器0中断服务程序***************/
voidtime0_int()interrupt1{
/*************
staticucharvalue;
TH0=0x3c;
T