智能温度控制器程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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]; //取实际温度整数部分