基于单片机的火灾报警系统设计(7)

2019-04-21 20:30

附录 delay_uint(10); //110us

q = dq; //读取18b20初始化信号 delay_uint(20); //200us dq = 1; //把总线拿高 释放总线 }

/*************************写18b20内的数据*************************/ void write_18b20(uchar dat) { uchar i; for(i=0;i<8;i++) { //写数据是低位开始 dq = 0; //把总线拿低写时间隙开始 dq = dat & 0x01; //向18b20总线写数据了 delay_uint(5); // 60us dq = 1; //释放总线 dat >>= 1; } }

/************************读取18b20内的数据*************************/ uchar read_18b20() {

uchar i,value; for(i=0;i<8;i++) { dq = 0; //把总线拿低读时间隙开始 value >>= 1; //读数据是低位开始 dq = 1; //释放总线 if(dq == 1) //开始读写数据 value |= 0x80; delay_uint(5); //60us 读一个时间隙最少要保持60us的时间

} return value; //返回数据 }

/*******************读取温度的值 读出来的是小数*********************/ uint read_temp() { uint value;

—27—

附录 uchar low; //在读取温度的时候如果中断的太频繁了,

就应该把中断给关了,否则会影响到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; //转换到温度值 return value; //返回读出的温度 }

/***********************读数模转换数据******************************/ //请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的 unsigned char ad0832read(bit SGL,bit ODD) { unsigned char i=0,value=0,value1=0; CLK=0; DO=1; CS=0; //开始 CLK=1; //第一个上升沿 CLK=0; DO=SGL;

CLK=1; //第二个上升沿 CLK=0; DO=ODD; CLK=1; //第三个上升沿 CLK=0; //第三个下降沿 DO=1;

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

—28—

附录

{

CLK=1; CLK=0; //开始从第四个下降沿接收数据 value<<=1; if(DO) value++; }

for(i=0;i<8;i++) { //接收校验数据 value1>>=1; if(DO)

value1+=0x80;

CLK=1; CLK=0; } CS=1; CLK=1; if(value==value1) //与校验数据比较,正确就返回数据,否则返回0 return value; return 0; }

/*********************** **数码显示函数*****************************/ void display() { uchar i; P1 = 0xff; //消隐 P2 = smg_we[i]; //位选 P1 = dis_smg[i]; //段选 i ++; if(i >= 4) //4位数码管显示 i = 0; }

/*************************定时器0初始化程序************************/ void time_init() { EA = 1; //开总中断

—29—

附录 TMOD = 0X01; //定时器0、定时器1工作方式1

ET0 = 1; //开定时器0中断 TR0 = 1; //允许定时器0定时 }

/*****************************独立按键程序**************************/ uchar key_can; //按键值

void key() //独立按键程序 { static uchar key_new; key_can = 20; //按键值还原 }

P2 |= 0x0f;

if((P2 & 0x0f) != 0x0f) //按键按下 { delay_1ms(1); //按键消抖动 if(((P2 & 0x0f) != 0x0f) && (key_new == 1)) { //确认是按键按下 key_new = 0; switch(P2 & 0x0f) { case 0x0e: key_can = 4; break; //得到k1键值 } else

}

}

case 0x0d: key_can = 3; break; case 0x0b: key_can = 2; break; case 0x07: key_can = 1; break;

//得到k2键值

//得到k3键值 //得到k4键值

//按键松开 key_new = 1;

/************************按键处理数码管显示函数*********************/ void key_with() { if(key_can == 4) //紧急报警键 手动报警 { if(menu_1 == 0) shoudong = 1;

—30—

附录

}

if(key_can == 1) //设置键 { menu_1 ++; if(menu_1 >= 3) { menu_1 = 0; } }

if(menu_1 == 0) {

if((key_can == 2) || (key_can == 3)) shoudong = 0; //取消手动报警 }

if(menu_1 == 1) //设置高温报警 { if(key_can == 2) { s_temp ++ ; //高温报警值加1 if(s_temp > 99) s_temp = 99;

}

if(key_can == 3) { s_temp -- ; //高温报警值减1 if(s_temp <= 10) s_temp = 10 ; }

dis_smg[0] = smg_du[s_temp % 10]; //取个位显示 dis_smg[1] = smg_du[s_temp / 10 % 10]; //取十位显示

dis_smg[2] = 0xbf; dis_smg[3] = smg_du[10]; //显示A write_eeprom(); //保存数据 }

if(menu_1 == 2) //设置烟物报警 { if(key_can == 2)

—31—


基于单片机的火灾报警系统设计(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:体育节通知章程

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: