flag4=1; } break; case 2: //菜单二,显示温度 { LCD_pos(0); print(\ \ LCD_pos(0x40);
print(\ \ if(flagt==1)datadis[0]=0x2d; else datadis[0]=temp/1000+0x30; datadis[1]=temp/100+0x30; datadis[2]=temp/10+0x30; datadis[3]=0x2e; datadis[4]=temp+0x30; LCD_pos(0x49); print(datadis); LCD_pos(0x4e); //写入摄氏度符号 write_dat(0xdf); LCD_pos(0x4f); write_dat(0x43); }break; case 3: //菜单三,显示温度设置值 { LCD_pos(0); print(\ \ LCD_pos(0x40); print(\ TL= \ LCD_pos(0x43); write_dat(th1+0x30); LCD_pos(0x44); write_dat(th2+0x30); LCD_pos(0x45); //摄氏度符号 write_dat(0xdf); LCD_pos(0x46); write_dat(0x43); LCD_pos(0x4c); write_dat(th3+0x30); LCD_pos(0x4d); write_dat(th4+0x30); LCD_pos(0x4e); //摄氏度符号 write_dat(0xdf); LCD_pos(0x4f);
26
write_dat(0x43); flag1=1; }break; case 4: //菜单四,记录报警温度 { write_cmd(0x80); print(\ ALARM TEMP \ write_cmd(0xc0); print(\ RECORD: \ write_cmd(0xcb); write_dat(0xdf); write_cmd(0xcc); write_dat(0x43); flag2=1; }break; case 5: //菜单五,显示学号 { LCD_pos(0x00); print(\ //显示学号 LCD_pos(0x40); print(\ //显示学号 }break; default:break; } key_time(); key_lcd(); //菜单三中温度设置的按键扫描 alarm_beep(); //报警系统通过2402存储超出的温度,并记录 if(K5==0) //按下K5,就记录当前报警的温度 { delay(5); if(K5==0) { while(!K5); q=read_add(adder); } }; if(flag2==1&&k==4) //k一定不能掉,不然会在其他菜单里出现乱码,菜单四中需要显示存储的报警数据 { write_cmd(0xc9); write_dat(q/10+0x30); write_cmd(0xca); write_dat(q+0x30);
27
} } }
DS18B20.h文件:
#ifndef _ds18b20_h_ #define _ds18b20_h_
#define uchar unsigned char #define uint unsigned int //晶振22MHZ //延时//
sbit DQ=P3^7; bit flagt;
void delay_18b20(uint i) { while(i--); }
/*****初始化程序****/ void init_18b20() { uchar x=0; DQ=1; delay_18b20(8); DQ=0; delay_18b20(80); DQ=1; delay_18b20(15); x=DQ; delay_18b20(15); }
/** 读一个字节**/ uchar read_byte() { uchar i=0; uchar dat=0; for(i=0;i<8;i++) { DQ=0; dat>>=1; DQ=1; if(DQ)dat|=0x80; delay_18b20(5); }
28
return dat; }
/**写一个字节**/
void write_byte(uchar dat) { uchar i=0; for(i=0;i<8;i++) { DQ=0; DQ=dat&0x01; delay_18b20(5); DQ=1; dat>>=1; } }
/**温度转换并读取温度**/ uint read_temp() { uchar a=0; uchar b=0; uint t; init_18b20(); write_byte(0xcc); //跳过读序号列号的操作 write_byte(0x44); // 启动温度转换 // delay_18b20(100); init_18b20(); write_byte(0xcc); //跳过读序号列号的操作 write_byte(0xbe); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=read_byte(); //读第八位 b=read_byte(); //读高八位 if(b&0x80) //高八位的最高位于是否为1,若为1,则为负温度,若为0,则是0-128; { flagt=1; a=~a; b=~b; } else flagt=0; t=(b*256+a)*5; //也可以写成 t=(b*256+a)*0.625 ;return t; return (t>>3); //右移三位相当于5/8=0.625 返回温度有4位,千、百、十、个,转化后有一位小数位,没有千位 }
#endif
LCD1602.h文件:
29
#ifndef _lcd1602_h_ #define _lcd1602_h_ #include
#define LCD_DB P0 //定义LCD数据接口
sbit LCD_RS=P2^6; sbit LCD_RW=P2^5; sbit LCD_EN=P2^7;
/*测忙信号*/
bit LCD_check_busy() //检查LCD是否繁忙函数 { bit busy; LCD_EN=0; LCD_RS=0; LCD_RW=1; LCD_EN=1;
_nop_(); _nop_(); _nop_(); //_nop_(); busy=(bit)(P0 & 0x80); LCD_EN=0; return(busy); }
/*写数据*/
void write_dat(uchar dat) { while(LCD_check_busy()); LCD_DB=dat; LCD_RS=1; _nop_(); LCD_RW=0; _nop_(); LCD_EN=1; _nop_(); _nop_(); LCD_EN=0; }
/*写命令*/
void write_cmd(uchar cmd) {
30