#include #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7; sbit ds=P2^2 ; sbit beep=P2^3; uint temp; float tt; uint warn_11=270; uint warn_12=250; uint warn_h1=300; //定义整型的温度数据 //定义浮点型的温度数据 //定义温度下限 是温度值乘以10后的结果 // 定义温度上限制; uint warn_h2=320; //定义温度上限值; sbit led0=P1^0; //控制发光二极管; sbit led1=P1^1; //控制发光二极管; sbit led2=P1^2; sbit led3=P1^3; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f}; uchar code table1[]={ 0xbf,0x86,0xdb,0xcf, 0xe6,0xed,0xfd,0x87, 0xff,0xef}; //控制发光二极管; //控制发光二极管; //带小数点的0-9编码; //不带小数点的0-9编码; void delay(uint z) //延时函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void dsreset (void) { uint i; ds=0; i=103; while (i>0)i--; ds=1; //DS 18B20复位,初始化函数; i=4; while(i>0)i--; } bit tempreadbit(void) { uint i; bit dat; ds=0;i++; ds=1;i++;i++; dat=ds; i=8;while(i>0)i--; return (dat); } //读1位数据函数 ; //i++起延时左右 ; uchar tempread(void) //读一个字节数据函数; { uchar i,j,dat; dat=0; for(i=1;i<=8;i++) { j=tempreadbit(); dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在dat里; } return (dat); } void tempwritebyte(uchar dat) //向DS18B20写一个字节函数 { uint i; uchar j; bit testb; for(j=1;j<=8;j++) { testb=dat&0x01; dat>>=1; if(testb) { ds=0; i++;i++; ds=1; i=8;while(i>0)i--; //写1; } else { ds=0; //写0;i=8;while(i>0)i--; ds=1; i++;i++; } } } void tempchange(void) //DS18B20开始获取温度并转换; { dsreset(); delay(1); tempwritebyte(0xcc); tempwritebyte(0x44); } uint get_temp() { uchar a,b; dsreset(); delay(1); tempwritebyte(0xcc); tempwritebyte(0xbe); //写跳过读ROM指令 ; //写温度转换指令 ; //读取寄存器中存储的温度数据; a=tempread(); //读低八位 ; b=tempread(); //读高八位 ; temp=b; temp<<=8; temp=temp|a; tt=temp*0.0625; //温度在寄存器中为12位,分辨率为0.0625; temp=tt*10+0.5; //乘以10表示小数点后面只取一位,加0.5表示四舍五入; tt=tt+0.05; return temp; //temp是整型; } void display(uchar num,uchar dat) //数据显示程序; { uchar i; //num是第几个数码管,dat要显示的数字; dula=0; P0=table[dat]; dula=1; dula=0; wela=0; i=0xff; i=i&(~((0x01)<<(num))); P0=i; wela=1; wela=0; delay(1); } void dis_temp(uint t) //编码赋给P0口; //用i来存储位选数据,只有一位为0; //显示温度数值函数t传递的是整形的温度值; { uchar i; i=t/100; //除以100得到商为温度的十位; display(0,i); delay(1); //在第一个数码管上显示; i=t%100/10; //100取余再除以10,为温度的个位; display(1,i+10); delay(1); //在第二个数码管上显示; i=t%100%10 ; //100取余再用10取余,为温度的小数位; display(2,i); delay(1); //在第三个数码管上显示; } /*void dis_temp(uint temp1) { uchar shi,ge,wei; shi=temp1/100; ge=temp1%100/10; wei=temp1%10; P0=table[shi]; //十位 dula=1; dula=0; P0=0xff; P0=0xfe; wela=1; wela=0; delay(1); P0=table1[ge]; dula=1; dula=0; P0=0xff; P0=0xfd; wela=1; wela=0; delay(1); P0=table[wei]; dula=1; dula=0; P0=0xff; P0=0xfb; //个位 //小数点一位 wela=1; wela=0; delay(1); P0=0x39; //摄氏度 dula=1; dula=0; P0=0xff; P0=0xf7; wela=1; wela=0; delay(1); } */ void warn(uint s,uchar led) //蜂鸣器报警,灯闪烁; { uchar i; i=s; beep=0; P1=~(led); while(i--) { dis_temp(get_temp()); } beep=1; P1=0xff; i=s; while (i--) { //s控制音调,led控制灯; // 蜂鸣器响; //控制相应的灯亮; //用温度显示函数,起延时作用;//蜂鸣器不响; //控制相应的灯灭; dis_temp(get_temp()); //用温度显示函数,起延时作用; } } void deal(uint t) //温度处理函数; { uchar i; if((t>warn_12)&&(t warn(40,0x01); //第一个灯亮,蜂鸣器发出“滴”声; } else if(t<=warn_12) //小于25度; { warn(10,0x03); //第一个和第二个灯亮,蜂鸣器发出”滴“声 ; } else if((t { warn(40,0x04); } else if(t>=warn_12) { warn(10,0x0c); } else { i=40; while(i--) //第三个灯亮蜂鸣器发出”滴“声 ; //大于32度; //第三个和第四个灯亮,蜂鸣器发出”滴“声 ;//在27度和30度之间是只是调用显示函数; { dis_temp(get_temp()); } } } void init_com(void) { TMOD=0x20; PCON=0x00; SCON=0X50; TH1=0xfd; TL1=0xfd; TR1=1; //串口初始化函数;//波特率9600; } void comm(char*parr) { do { SBUF=*parr++; while(!T1) ; T1=0; } while(*parr); } void main() { //串口发送函数; //发送数据; //等待发送完成标志为1; //标志清0; //保持循环直到字符为'\\0' ; //主函数; uchar buff[4],i; dula=0; wela=0; init_com(); while(1) { tempchange(); //温度转换函数; for(i=10;i>0;i--) { dis_temp(get_temp()) ; //获取温度并显示; } deal(temp); //进行温度处理; sprintf(buff,\"%f\ //将浮点型字符格式化为字符型; for(i=10;i>0;i--) { dis_temp(get_temp()); } comm(buff); for(i=10;i>0;i--) { dis_temp(get_temp()); } } } //温度显示; //串口发送数据; //温度显示; 因篇幅问题不能全部显示,请点此查看更多更全内容