《智能温度控制器程序(共4页).doc》由会员分享,可在线阅读,更多相关《智能温度控制器程序(共4页).doc(4页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上/*/* 名称: 智能温度控制器 */ /* 功能:读取当前DS18B20温度,由五个八段数码管显示出来。 */* 描述:选择DS18B20的最高精度 12位精度转换,增量为0.0625.使测温 */* 温度有较高的精度, 五个数码管能实现00.000-99.999范内较高精度 */* 的数值显示,可应用于对温度控制有较高要求的场合。 */* 连线:DS18B20的2脚与单片机的P1.0口连接 */*/#include#define uchar unsigned charuchar xdata wei _at_ 0x0ff20; /数码管的位选uchar xdata
2、duan _at_ 0x0ff21; /8255的PB口,数码管的段选uchar xdata ctrl _at_ 0x0ff23; /写8255控制字sbit M=P30;/接直流电机sbit Y=P31;/接加热电器(黄色LED)sbit R=P32;/接红色故障灯(红色LED)sbit G=P33;/接温度正常指示灯(绿色LED)sbit DQ =P10;/DS18B20数据线引脚通信接口uchar code scan5 = 0xdf,0xef,0xf7,0xfb,0xfd,;/位扫描数组/数码管的显示段码表uchar code table20 = 0xc0,/*0*/ 0xf9,/*1*
3、/ 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;uchar dispbuf5;/数据显示缓冲区2位整数+3位小数 uchar temper2;/存放温度的数组 float c,d; /中间量 /*延时函数*/void delay (unsigned int us) while(us-);/*读写时序控制函数*/void reset(void) u
4、char x=0; DQ = 1; delay(8); /稍做延时 DQ = 0; delay(80); /精确延时 大于 480us DQ = 1; /拉高总线 delay(14); x=DQ; delay(20);/*从DS18B20读一字节*/uchar readbyte(void) /读1字节 uchar i=0; uchar dat=0; for (i=8;i0;i-) DQ = 0; dat=1; DQ = 1; if(DQ) dat|=0x80; delay(4); return(dat); /*向DS18B20写入一个字节,用于对DS18B20写入控制字*/void write
5、byte(unsigned char dat) uchar i=0; for (i=8; i0; i-) DQ = 0; DQ = dat&0x01; delay(5); DQ = 1; dat=1; delay(4);/*读取温度值*/void readtemp(void) uchar a=0,b=0; reset(); writebyte(0xCC); / 跳过序列号 writebyte(0x44); / 启动温度转换 reset(); writebyte(0xCC); writebyte(0xBE); /读9个寄存器,前两个为温度 a=readbyte(); /低位 b=readbyte
6、(); /高位 temper0=a&0x0f; a=a4; /低位右移4位,舍弃小数部分 temper1=b4; /高位左移4位,舍弃符号位 temper1=temper1|a; c=temper0; d=temper1+c*0.0625; /*数码管显示*/void disp_Scan() unsigned char i,value; for(i=0;i=4;i+) value =tabledispbufi; /取显示数据段码 duan= value; delay(200); wei= scani; /取位 delay(200); /延时50us wei= 0xff; /关显示 /*主函数*
7、/main() uchar temp; float backbit; ctrl=0x80;while(1) disp_Scan(); /显示扫描 readtemp(); /读18B20 backbit = temper0; /换成浮点数 backbit = backbit * 62.5; /小数点的后三位,乘以0.0625*1000 temp = backbit; /取低3位整数部分 dispbuf4=temp%10; /小数点第三位 temp=temp/10; dispbuf3 = temp%10 ; /小数点第二位 temp = temp/10; dispbuf2 = temp%10 ; /小数点第一位 temp = temper1; /取实际温度整数部分 dispbuf1 = temp%10; /个位 dispbuf1+=10; /给数码管显示第二位后面加小数点 temp = temp/10; dispbuf0= temp%10; /十位 if(28.000d&d=30.000) M=1;Y=1;R=0;G=1;/温度过高时直流电机(相当于电风扇)开启,加快散热,并且故障灯点亮 if(d=28.000) M=0; Y=0; R=0; G=1; /温度过低时LED(相当于加热电器)开启,升温,并且故障灯点亮 专心-专注-专业
限制150内