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;
}
/*************定时器0初始化程序***************/
voidtime_init()
{
EA=1;//开总中断
TMOD|=0X01;//定时器0、定时器1工作方式1
ET0=1;//开定时器0中断
TR0=1;//允许定时器0定时
}
/********************独立按键程序*****************/
ucharkey_can;//按键值
voidkey()//独立按键程序
{
staticucharkey_new=0,key_l;
key_can=20;//按键值还原
P1=0x0f;
if((P1&0x0f)!
=0x0f)//按键按下
{
delay_1ms
(1);//按键消抖动
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;//得到按键值
}
//write_sfm2(1,0,key_can);
}
}
else
key_new=1;
}
/****************按键处理数码管显示函数***************/
voidkey_with()
{
if(key_can==1)//紧急报警键手动报警
{
if(menu_1==0)
shoudong=1;
}
if(key_can==12)//退出设置键
{
menu_1=0;
init_1602();//初始化显示
}
if(key_can==15)//设置键
{
menu_1++;
if(menu_1>=5)
{
menu_1=0;
init_1602();//初始化显示
}
if(menu_1==3)//输入第一个人的手机
{
write_string(1,0,"InputPhone1");
write_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,"InputPhone2");
write_string(2,0,"");
clear_shuzu(dis_smg,11);
for(i=0;idis_smg[i]=0x30+phone2_call[i];
write_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++;//高温报警值加1
if(s_temp>99)
s_temp=99;
}
if(key_can==13)
{
s_temp--;//高温报警值减1
if(s_temp<=10)
s_temp=10;
}
write_sfm2(1,8,s_temp);//显示温度
write_sfm2(2,8,s_yanwu);//显示烟物等级
write_(0x80+7);//将光标移动到第2行第到3位
write_(0x0f);//显示光标并且闪烁
write_eeprom();//保存数据
}
if(menu_1==2)//设置烟物报警
{
if(key_can==14)
{
s_yanwu++;//烟物报警值加1
if(s_yanwu>=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_(0x80+0x40+7);//将光标移动到第2行第到3位
write_(0x0f);//显示光标并且闪烁
write_eeprom();//保存数据
}
if(menu_1==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);//显示
lcd1602_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)
{
for(i=0;i<6;i++)
{
beep=~beep;//蜂鸣器叫3声
delay_1ms(100);
}
beep=1;//关闭蜂鸣器
value1=1;
if(phone