火灾自动报警系统设计
}
}
if(Temp==2) {
switch(j) {
case 1:shiwei--;if(shiwei<0)shiwei=9;break; case 2:gewei--;if(gewei<0)gewei=9;break;
case 3:xiaoshu--;if(xiaoshu<0)xiaoshu=9;break; } }
toplimit=shiwei*100+gewei*10+xiaoshu; // display_num(toplimit);
Disp1Char(12,1,shiwei+'0'); Disp1Char(13,1,gewei+'0'); Disp1Char(14,1,'.');
Disp1Char(15,1,xiaoshu+'0'); }
/****************************************************************** ** 文件名: ds18b20.c
** Copyright 成都理工大学工程技术学院电计系 ** 创建人: 石坚 ** 日 期: 2012.2.1 ** 修改人: Mr.zhang
** 日 期: 2013.10.13
** 描 述: DS18B20相关底层驱动函数 **
** 全局变量:待显示十进制数组
******************************************************************/ #include \#include \#include %uchar Disp_Dec[8]; int compare;
code uchar DitTab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; //温度的
31
火灾自动报警系统设计
小数数组
uchar TempData[2]={0x00,0x00}; sbit DQ=P0^0;
/********************************************************** 函数名称: Delay11us 功 能: 11us延时函数 参 数: 无参数 返回值 : 无
***********************************************************/ void Delay11us(uint t) {
for(;t>0;t--);}
/********************************************************** 函数名称: Ds18b20_Rst
功 能: DS18B20复位函数 参 数: 无参数 返回值 : 无
***********************************************************/ void Ds18b20_Rst(void) {
uchar presence=1; //定义存在脉冲 EA=0;
while(presence) {
while(presence) {
DQ=1;_nop_();_nop_(); _nop_();_nop_(); DQ=0;
Delay11us(255); //延时550us DQ=1;
Delay11us(50); presence=DQ; }
Delay11us(205); //延时500us presence=~DQ; }
DQ=1; EA=1;
32
火灾自动报警系统设计
}
/********************************************************** 函数名称: Read_byte
功 能: DS18B20读一个字节的函数 参 数: 无参数
返回值 : 返回读取的字节value
***********************************************************/ uchar Read_byte(void) {
uchar i;
uchar value=0;
for(i=8;i>0;i--) {
EA=0;
DQ=1;_nop_();_nop_(); value>>=1; DQ=0;
_nop_();_nop_();_nop_();_nop_(); //4us _nop_(); DQ=1;
_nop_();_nop_();_nop_();_nop_(); //4us
// _nop_();_nop_();_nop_();_nop_(); //4us if(DQ) value|=0x80; Delay11us(55); EA=1; }
DQ=1;
return(value); }
/********************************************************** 函数名称: Write_byte
功 能: DS18B20写一个字节的函数 参 数: 8位命令val 返回值 : 返回读取的字节
***********************************************************/ void Write_byte(uchar val) { unsigned char i;
33
火灾自动报警系统设计
for(i=8;i>0;i--)
{
EA=0;
DQ=1;_nop_();_nop_(); _nop_();_nop_();
DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_(); //5us DQ=val&0x01; Delay11us(55); val=val/2; EA=1; }
DQ=1;
Delay11us(15); }
/********************************************************** 函数名称: ReadTemp
功 能: 读取温度函数函数 参 数: 无 返回值 : 无
***********************************************************/
void ReadTemp(void) {
Ds18b20_Rst(); //总线复位
Write_byte(0xcc); //发skim Rom命令 Write_byte(0xbe); //发读命令
TempData[0]=Read_byte(); //存放温度低8位 TempData[1]=Read_byte(); //存放温度高8位 Ds18b20_Rst();
Write_byte(0xcc); //发skim Rom命令,启用存储器操作命令前跳过64位Rom编码命令
Write_byte(0x44); //启动一次温度转换 }
/********************************************************** 函数名称: TempProc
功 能: 处理温度数据的函数 参 数: 无 返回值 : 无
34
火灾自动报警系统设计
***********************************************************/
void TempProc(void) {
uchar n=0; //负温度数据标志 uchar TemTemp; if(TempData[1]>127) {
TempData[1]=(255-TempData[1]); //高位字节直接取反
TempData[0]=(256-TempData[0]);n=1; //低位字节取反加1,并标志负温度数据
} TemTemp=TempData[0]&0x0f; Disp_Dec[6]='C'; Disp_Dec[5]='o';
Disp_Dec[4]=DitTab[TemTemp]+'0'; //取低位字节的小数位,并通过查表转换为十进制数
Disp_Dec[3]='.';
TemTemp=((TempData[0]&0xf0)>>4)|((TempData[1]&0x0f)<<4); Disp_Dec[2]=(TemTemp0)+'0'; Disp_Dec[1]=(TemTemp0)/10+'0'; Disp_Dec[0]=TemTemp/100+'0';
Disp_Dec[7]='\\0';
if(!(TemTemp/100)) //如果最高位为0 {
Disp_Dec[0]='+'; if(!Disp_Dec[1]) {Disp_Dec[1]=' ';} }
if(n){Disp_Dec[0]='-';} //如果为负温度 compare=TemTemp*10+DitTab[TempData[0]&0x0f];
}
#include \bit TempTimems=0;
/********************************************************** 函数名称:Timer0
功 能: 定时器T0中断服务程序,为LED、数码管提供时间基数 参 数: 无参数 返回值 : 无
35