智能温度控制器程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/**************************************************************************/ /*** 名称:智能温度控制器***/ /*** 功能:读取当前DS18B20温度,由五个八段数码管显示出来。***/ /*** 描述:选择DS18B20的最高精度——12位精度转换,增量为0.0625.使测温***/ /*** 温度有较高的精度, 五个数码管能实现00.000--99.999范内较高精度***/ /*** 的数值显示,可应用于对温度控制有较高要求的场合。***/ /*** 连线:DS18B20的2脚与单片机的P1.0口连接***/ /***************************************************************************/ #include

#define uchar unsigned char

uchar xdata wei _at_ 0x0ff20; //数码管的位选

uchar xdata duan _at_ 0x0ff21; //8255的PB口,数码管的段选

uchar xdata ctrl _at_ 0x0ff23; //写8255控制字

sbit M=P3^0;//接直流电机

sbit Y=P3^1;//接加热电器(黄色LED)

sbit R=P3^2;//接红色故障灯(红色LED)

sbit G=P3^3;//接温度正常指示灯(绿色LED)

sbit DQ =P1^0;//DS18B20数据线引脚通信接口

uchar code scan[5] = {0xdf,0xef,0xf7,0xfb,0xfd,};//位扫描数组

//数码管的显示段码表

uchar code table[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

};

uchar dispbuf[5];//数据显示缓冲区2位整数+3位小数

uchar temper[2];//存放温度的数组

float c,d; //中间量

/*****************************延时函数**************************/

void delay (unsigned int us)

{

while(us--)

;

}

/*****************************读写时序控制函数**************************/ void reset(void)

{

uchar x=0;

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;i>0;i--)

{

DQ = 0;

dat>>=1;

DQ = 1;

if(DQ)

dat|=0x80;

delay(4);

}

return(dat);

}

/*********向DS18B20写入一个字节,用于对DS18B20写入控制字*********/ void writebyte(unsigned char dat)

{

uchar i=0;

for (i=8; i>0; 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); // 启动温度转换

writebyte(0xCC);

writebyte(0xBE); //读9个寄存器,前两个为温度

a=readbyte(); //低位

b=readbyte(); //高位

temper[0]=a&0x0f;

a=a>>4; //低位右移4位,舍弃小数部分

temper[1]=b<<4; //高位左移4位,舍弃符号位

temper[1]=temper[1]|a;

c=temper[0];

d=temper[1]+c*0.0625;

}

/***************************数码管显示*************************/ void disp_Scan()

{ unsigned char i,value;

for(i=0;i<=4;i++)

{

value =table[dispbuf[i]]; //取显示数据段码

duan= value;

delay(200);

wei= scan[i]; //取位

delay(200); //延时50us

wei= 0xff; //关显示

}

}

/****************************主函数***************************/ main()

{

uchar temp;

float backbit;

ctrl=0x80;

while(1)

{

disp_Scan(); //显示扫描

readtemp(); //读18B20

backbit = temper[0]; //换成浮点数

backbit = backbit * 62.5; //小数点的后三位,乘以0.0625*1000

temp = backbit; //取低3位整数部分

dispbuf[4]=temp%10; //小数点第三位

temp=temp/10;

dispbuf[3] = temp%10 ; //小数点第二位

temp = temp/10;

dispbuf[2] = temp%10 ; //小数点第一位

temp = temper[1]; //取实际温度整数部分

相关文档
最新文档