您好,欢迎访问三七文档
/**************************************************************************//***名称:智能温度控制器***//***功能:读取当前DS18B20温度,由五个八段数码管显示出来。***//***描述:选择DS18B20的最高精度——12位精度转换,增量为0.0625.使测温***//***温度有较高的精度,五个数码管能实现00.000--99.999范内较高精度***//***的数值显示,可应用于对温度控制有较高要求的场合。***//***连线:DS18B20的2脚与单片机的P1.0口连接***//***************************************************************************/#includereg51.h#defineucharunsignedcharucharxdatawei_at_0x0ff20;//数码管的位选ucharxdataduan_at_0x0ff21;//8255的PB口,数码管的段选ucharxdatactrl_at_0x0ff23;//写8255控制字sbitM=P3^0;//接直流电机sbitY=P3^1;//接加热电器(黄色LED)sbitR=P3^2;//接红色故障灯(红色LED)sbitG=P3^3;//接温度正常指示灯(绿色LED)sbitDQ=P1^0;//DS18B20数据线引脚通信接口ucharcodescan[5]={0xdf,0xef,0xf7,0xfb,0xfd,};//位扫描数组//数码管的显示段码表ucharcodetable[20]={0xc0,/*0*/0xf9,/*1*/0xa4,/*2*/0xb0,/*3*/0x99,/*4*/0x92,/*5*/0x82,/*6*/0xf8,/*7*/0x80,/*8*/0x90,/*9*/0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,//带小数点的0-9};uchardispbuf[5];//数据显示缓冲区2位整数+3位小数uchartemper[2];//存放温度的数组floatc,d;//中间量/*****************************延时函数**************************/voiddelay(unsignedintus){while(us--);}/*****************************读写时序控制函数**************************/voidreset(void){ucharx=0;DQ=1;delay(8);//稍做延时DQ=0;delay(80);//精确延时大于480usDQ=1;//拉高总线delay(14);x=DQ;delay(20);}/************************从DS18B20读一字节**********************/ucharreadbyte(void)//读1字节{uchari=0;uchardat=0;for(i=8;i0;i--){DQ=0;dat=1;DQ=1;if(DQ)dat|=0x80;delay(4);}return(dat);}/*********向DS18B20写入一个字节,用于对DS18B20写入控制字*********/voidwritebyte(unsignedchardat){uchari=0;for(i=8;i0;i--){DQ=0;DQ=dat&0x01;delay(5);DQ=1;dat=1;}delay(4);}/***************************读取温度值**************************/voidreadtemp(void){uchara=0,b=0;reset();writebyte(0xCC);//跳过序列号writebyte(0x44);//启动温度转换reset();writebyte(0xCC);writebyte(0xBE);//读9个寄存器,前两个为温度a=readbyte();//低位b=readbyte();//高位temper[0]=a&0x0f;a=a4;//低位右移4位,舍弃小数部分temper[1]=b4;//高位左移4位,舍弃符号位temper[1]=temper[1]|a;c=temper[0];d=temper[1]+c*0.0625;}/***************************数码管显示*************************/voiddisp_Scan(){unsignedchari,value;for(i=0;i=4;i++){value=table[dispbuf[i]];//取显示数据段码duan=value;delay(200);wei=scan[i];//取位delay(200);//延时50uswei=0xff;//关显示}}/****************************主函数***************************/main(){uchartemp;floatbackbit;ctrl=0x80;while(1){disp_Scan();//显示扫描readtemp();//读18B20backbit=temper[0];//换成浮点数backbit=backbit*62.5;//小数点的后三位,乘以0.0625*1000temp=backbit;//取低3位整数部分dispbuf[4]=temp%10;//小数点第三位temp=temp/10;dispbuf[3]=temp%10;//小数点第二位temp=temp/10;dispbuf[2]=temp%10;//小数点第一位temp=temper[1];//取实际温度整数部分dispbuf[1]=temp%10;//个位dispbuf[1]+=10;//给数码管显示第二位后面加小数点temp=temp/10;dispbuf[0]=temp%10;//十位if(28.000d&&d30.000){M=0;Y=1;R=1;G=0;}//温度正常时温度正常指示灯亮,否责不亮if(d=30.000){M=1;Y=1;R=0;G=1;}//温度过高时直流电机(相当于电风扇)开启,加快散热,并且故障灯点亮if(d=28.000){M=0;Y=0;R=0;G=1;}//温度过低时LED(相当于加热电器)开启,升温,并且故障灯点亮}}
本文标题:智能温度控制器程序
链接地址:https://www.777doc.com/doc-7386082 .html