附录 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—
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库基于单片机的火灾报警系统设计(7)在线全文阅读。
相关推荐: