问答

使用温度传感器DS18B20设计一温控系统,当温度超过35度或低于20度时,LED红灯闪烁,蜂鸣器发出报警声。

提问者:lina57av2013-09-16 00:00

最佳答案

//这是我曾经做的一个温度控制系统,可以调节上下限温度,低于下限温度启动加热,高于上限停止加热。//温控系统控制程序//版本号:V1.0;2015.6.19//温度传感器:DS18B20//显示方式:LED#include #define uchar unsigned charsbit keyup=P1^0;sbit keydn=P1^1;sbit keymd=P1^2;sbit out=P3^7;//接控制继电器sbit DQ = P3^4;//接温度传感器18B20uchar t[2],number=0,*pt;//温度值uchar TempBuffer1[4]={0,0,0,0};uchar Tmax=18,Tmin=8;uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0xfe,0xf7};uchar dismod=0,xiaodou1=0,xiaodou2=0,currtemp;bit flag;void t0isr() interrupt 1{TH0=(65536-5000)/256;TL0=(65536-5000)%256;switch(number){case 0: P2=0x08; P0=distab[TempBuffer1[0]]; break;case 1: P2=0x04; P0=distab[TempBuffer1[1]]; break;case 2: P2=0x02; P0=distab[TempBuffer1[2]]&0x7f; break;case 3: P2=0x01; P0=distab[TempBuffer1[3]]; break;default: break;}number++;if(number>3)number=0;}void delay_18B20(unsigned int i){while(i--);}/**********ds18b20初始化函数**********************/void Init_DS18B20(void) { bit x=0;do{ DQ=1; delay_18B20(8); DQ = 0; //单片机将DQ拉低 delay_18B20(90); //精确延时 大于 480us DQ = 1; //拉高总线 delay_18B20(14); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败,继续初始化}while(x); delay_18B20(20);}/***********ds18b20读一个字节**************/unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delay_18B20(4); }return(dat);}/*************ds18b20写一个字节****************/void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){ DQ = 0;DQ = dat&0x01; delay_18B20(5);DQ = 1; dat>>=1;}}/**************读取ds18b20当前温度************/unsigned char *ReadTemperature(unsigned char rs){unsigned char tt[2]; delay_18B20(80); Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0x44); //启动温度转换 delay_18B20(80); Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度tt[0]=ReadOneChar(); //读取温度值低位tt[1]=ReadOneChar(); //读取温度值高位return(tt);}void covert1(void)//将温度转换为LED显示的数据{ uchar x=0x00,y=0x00; t[0]=*pt; pt++; t[1]=*pt; if(t[1]&0x080) //判断正负温度 { TempBuffer1[0]=0x0c; //c代表负t[1]=~t[1]; /*下面几句把负数的补码*/t[0]=~t[0]; /*换算成绝对值*********/x=t[0]+1;t[0]=x;if(x==0x00)t[1]++; } else TempBuffer1[0]=0x0a;//A代表正 t[1]<<=4;//将高字节左移4位 t[1]=t[1]&0xf0; x=t[0];//将t[0]暂存到X,因为取小数部分还要用到它 x>>=4;//右移4位 x=x&0x0f;//和前面两句就是取出t[0]的高四位 y=t[1]|x;//将高低字节的有效值的整数部分拼成一个字节 TempBuffer1[1]=(y%100)/10; TempBuffer1[2]=(y%100)%10; t[0]=t[0]&0x0f;//小数部分 TempBuffer1[3]=t[0]*10/16; //以下程序段消去随机误检查造成的误判,只有连续12次检测到温度超出限制才切换加热装置if(currtemp>Tmin)xiaodou1=0;if(y12){out=0;flag=1;xiaodou1=0;}if(currtempTmax){xiaodou2++;currtemp=y;xiaodou1=0;}if(xiaodou2>12){out=1;flag=0;xiaodou2=0;}out=flag;}void convert(char tmp){uchar a;if(tmp<0){TempBuffer1[0]=0x0c;a=~tmp+1;}else {TempBuffer1[0]=0x0a;a=tmp;}TempBuffer1[1]=(a%100)/10;TempBuffer1[2]=(a%100)%10;}void keyscan( ){uchar keyin;keyin=P1&0x07;if(keyin==0x07)return;else if(keymd==0){dismod++;dismod%=3;while(keymd==0);switch(dismod){case 1: convert(Tmax); TempBuffer1[3]=0x11; break;case 2: convert(Tmin); TempBuffer1[3]=0x12; break;default: break;}}else if((keyup==0)&&(dismod==1)){Tmax++;convert(Tmax);while(keyup==0);}else if((keydn==0)&&(dismod==1)){Tmax--;convert(Tmax);while(keydn==0);}else if((keyup==0)&&(dismod==2)){Tmin++;convert(Tmin);while(keyup==0);}else if((keydn==0)&&(dismod==2)){Tmin--;convert(Tmin);while(keydn==0);}xiaodou1=0;xiaodou2=0;}main(){TMOD=0x01;TH0=(65536-5000)/256;TL0=(65536-5000)%256;TR0=1;ET0=1;EA=1;out=1;flag=0;ReadTemperature(0x3f); delay_18B20(50000);//延时等待18B20数据稳定 while(1){pt=ReadTemperature(0x7f); //读取温度,温度值存放在一个两个字节的数组中if(dismod==0)covert1();keyscan();delay_18B20(30000);}}

回答者:wenziang20112016-09-16 00:00

DS 5相关问题

相关阅读

DS 5频道

报价:21.99-34.59
级别:中型车
排量:1.6T 1.8T 
变速箱:-

车友关注

最新标签

按字母分类:
ABCDEFGHIJKLMNOPQRSTWXYZ0-9