温度上限报警
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#define uint unsigned int //*****************************************DS1820端口设置 **************************************** sbit DS=P0^4; uint temp; uint stemp=220; uint xtemp=180;//上下限温度值 //延时函数 void delay1(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void dsreset(void) //send reset and initialization command { uint i; DS=0; i=103; while(i>0)i--; DS=1; i=4; while(i>0)i--; } bit tmpreadbit(void) //read a bit { uint i; bit dat; DS=0;i++; //i++ for delay DS=1;i++;i++; dat=DS; i=8;while(i>0)i--; return (dat); } uchar tmpread(void) //read a byte date
{ uchar i,j,dat; dat=0; for(i=1;i<=8;i++) { j=tmpreadbit(); dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字 节在DAT里 } return(dat); } void tmpwritebyte(uchar dat) //write a byte to ds18b20 { uint i; uchar j; bit testb; for(j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if(testb) //write 1 { DS=0; i++;i++; DS=1; i=8;while(i>0)i--; } else { DS=0; //write 0 i=8;while(i>0)i--; DS=1; i++;i++; } }
} } void distemp(uchar add,uint temp) { uchar bai,shi,ge; bai=temp/100; shi=temp%100/10; ge=temp%100%10; write_com(0x80+0x40+add); write_data(bai|0x30); write_data(shi|0x30); write_data(0x2e); write_data(ge|0x30); write_data(0x43); display[2]=(bai<<4)|(shi); display[1]=ge; display[0]=0x22; } void main() //主函数 { init(); diszifu(0x40+4,"temp:"); while(1) { tmpchange(); distemp(9,tmp()); if(tmp()>=300) //当温度超过30度时蜂鸣器报警 bell=0; else bell=1; } } #include <reg52.h> #include <intrins.h> #define uchar unsigned char
/******************************************************** 温度上限报警 操作方法:将POWER SUPPLY SWITCH 中的DS18B20、1602和 BUZZ开关打开,将JUMP LINE HAT中的跳线帽取 1个将DS18B20部分的P04与DS连接起来,用一个 跳线帽将BUZZER部分的IN和单片机的P05连接起 来,插上1602液晶,然后观看实验现象 ********************************************************/ #include <reg52.h> #include <ds18b20.h> sbit rs=P2^0; sbit wr=P2^1; sbit lcden=P2^2; sbit bell=P0^5; //蜂鸣器控制端 bit flag0; uchar display[2]; void delayus(unsigned int s) { unsigned int i; for(i=0; i<s; i++); for(i=0; i<s; i++); } void delay(uint z) //延时函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void write_com(uchar com) //液晶写指令 { rs=0; P1=com; lcden=0; delay(5); lcden=1 ; delay(5); lcden=0;
} void tmpchange(void) //DS18B20 begin change { dsreset(); delay1(1); tmpwritebyte(0xcc); // address all drivers on bus tmpwritebyte(0x44); // initiates a single temperature conversion } uint tmp() //get the temperature { float tt; uchar a,b; dsreset(); delay1(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe); a=tmpread(); b=tmpread(); temp=b; temp<<=8; //two byte compose a int variable temp=temp|a; tt=temp*0.0625; temp=tt*10+0.5; return temp; } //**********************************结束 ********************************************//
} void write_data(uchar date) //液晶写数据 { rs=1; P1=date; lcden=0; delay(5); lcden=1; delay(5); lcden=0; } void init() //液晶初始化 { wr=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80); } void distwo(uchar add,uchar temp) //液晶显示两位数字 { uchar shi,ge; shi=temp/10; ge=temp%10; write_com(0x80+add); write_data(shi|0x30); write_data(ge|0x30); } void diszifu(uchar add,uchar *temp) { uchar i; write_com(0x80+add); for(i=0;temp[i]!='\0';i++) { write_data(temp[i]); delay(5);
Biblioteka Baidu