(完整版)基于51单片机的温度报警器设计毕业设计 下载本文

内容发布更新时间 : 2024/12/23 5:53:22星期一 下面是文章的全部内容请认真阅读。

dat>>=1;

DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; Delay_DS18B20(4); }

return(dat); }

/*****写一个字节*****/ void WriteOneChar(uc dat) {

uc i=0;

for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; Delay_DS18B20(5); DQ = 1; dat>>=1; } }

/*****读取温度*****/ ui ReadTemperature(void) {

ui b=0;

ui t=0; ui a=0;

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0x44); //启动温度转换 Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器 a=ReadOneChar(); //读低8位 b=ReadOneChar(); //读高8位 t=b; t<<=8; t=t|a; tt=t*0.0625;

t= tt*10+0.5; //放大10倍输出并四舍五入 return(t); }

/*****延时子程序*****/ void Delay(ui num) {

while( --num ); }

/*****初始化定时器0*****/ void InitTimer(void) {

TMOD=0x01; TH0=0x3c;

TL0=0xb0; //50ms(晶振12M)

}

/*****读取温度*****/ void check_wendu(void) { ui f;

f=ReadTemperature()-5;

误差 if(f<0)f=0; if(f>999)f=999; bai=f/100;

shi=(f0)/10; ge=(f0);

}

/*****显示开机初始化等待画面*****/ void Disp_init(void) { P0 = ~0x80; //显示---- P2 = 0x7F; Delay(200); P2 = 0xDF; Delay(200);

P2 = 0xF7;

//获取温度值并减去DS18B20的温漂

//计算得到十位数字 //计算得到个位数字

//计算得到整数位

}

Delay(200); P2 = 0xFD; Delay(200);

P2 = 0xFF; //关闭显示

/*****显示温度子程序*****/

void Disp_Temperature(void) //显示温度 { }

/*****显示报警温度子程序*****/ void Disp_alarm(uc baojing)

P0 = ~0x98; //显示C P2 = 0x7F; Delay(400);

P0=~LEDData[ge]; //显示个位 P2 = 0xDF; Delay(400);

P0 =~LEDData[shi]; //显示十位 DIAN = 0; //显示小数点 P2 = 0xF7; Delay(400);

P0 =~LEDData[bai]; //显示百位 P2 = 0xFD; Delay(400);

P2 = 0xff; //关闭显示

{ }

/*****报警子程序*****/ void Alarm() {

P0 =~0x98; //显示C Delay(200);

P0 =~LEDData[baojing]; //显示十位 P2 = 0xDF; Delay(200);

P0 =~LEDData[baojing/10]; //显示百位 P2 = 0xF7; Delay(200);

if(set_st==1)P0 =~0xCE;

else if(set_st==2)P0 =~0x1A; //上限H、下限L标示 P2 = 0xFD; Delay(200);

P2 = 0xff; //关闭显示

if(x>=10){beep_st=~beep_st;x=0;} if((bai*10+shi)>=shangxian&&beep_st==1) { }

else if((bai*10+shi)>=shangxian&&beep_st==0)

BEEP=0; ALAM1=0;