|
请尊重原创,引用本文发表者,请注明出处.
作者:彬
联系电话:15914326550
qq:243280383 870035775
邮箱: 870035775@QQ.COM
博客: http://blog.sina.com.cn/vision243280383
基于DS18B20的单点温度测量 (2008-09-14 16:34:59)
去年搞了一个测量温度的设计,在这里和大家一起分享下:
关于DS18B20温度测量的单片机设计
#include <reg51.h> // 调用头文件 sbit BAI =P2^3; // 数码管是四位的(三位显示整数,一位显示小数),有四个电源使能端,BAI驱动百位 SHI驱动十位 sbit SHI =P2^2; // GE驱动个位 sbit GE =P2^1; // sbit XIAO=P2^0; // XIAO驱动小数位 sbit dp=P0^5; // 小数点标致 sbit beng=P2^4; // 驱动鸣声器 sbit DQ =P2^5; //定义通信端口 //延时函数 static unsigned char HT,LT; //定义用于存放温度值的高位 unsigned char tab[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28}; //0, 1, 2 3 4 5 6 7 8 9
void delay(unsigned int i) // { while(i--); }
void delayms(unsigned int i) //延时 1MS
{ unsigned char j=0; for (;i>0;i--) { for (j=0;j<125;j++) {;} } }
//DB18B20初始化函数 Init_DS18B20(void) { unsigned char x=0; DQ = 1; //DQ复位 delay(8); //稍做延时 DQ = 0; //单片机将DQ拉低 delay(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay(14); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(20); } //读一个字节 ReadOneChar(void) { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; // 逐位右移 DQ = 1; // 给脉冲信号 if(DQ) //DQ为1 时,表示收到高电平1 dat|=0x80; // 把收到的高电平置给DAT的最高位 delay(4); } return(dat); // } //写一个字节 WriteOneChar(unsigned char dat) { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; //把要发送的高电平或者低电平给DQ 发送出去 delay(5); DQ = 1; dat>>=1; //逐位右移 } delay(4); } //读取温度 void ReadTemperature() { unsigned char a=0; unsigned char b=0;
Init_DS18B20(); //调用初始化函数 WriteOneChar(0xCC); // 跳过读序号列号的操作 //不需要验证序列号。 WriteOneChar(0x44); // 发送温度转换命令 启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); // a=ReadOneChar(); //读取温度值低位 b=ReadOneChar(); //读取温度值高位 LT=(a&0xF0)?5:0; // HT=b<<4; // HT+=(a&0xF0)>>4; //
} void display_tempmain( ) //主程序温度显示函数 { static char k; if (HT>99) // { P0=tab[1]; BAI=0; SHI=1; GE =1; XIAO=1; delay(600); } if (HT<1) // 如果温度低于1度 { P0=0x7f; //数码管百显示"-",表示零下温度 BAI =0; //驱动百位数码管,屏蔽其他位数码管 SHI=1; GE=1; XIAO=1; delay(600);
}
P0=tab[LT]; // BAI =1; SHI=1; GE =1; XIAO=0; // delay(600);
P0=tab[HT/10]; // 显示十位温度值,屏蔽其他位 BAI=1; SHI=0; GE=1; XIAO=1; delay(600);
if(k!=tab[HT%10]) // { if(beng) {beng=0; delayms(350); // 个位温度值发生变化,短鸣一声,告示 beng=1; } } P0=tab[HT%10]; //显示各位温度值 k=tab [HT%10]; SHI=1; //一定要把各位放在最后面,因为要确保个位的后面的小数点被点亮 GE =0; XIAO=1; delay (600);
}
void main(void) { P2=0xff; while(1) //主循环 { dp=0; //点亮小数点 ReadTemperature(); //读取温度值 display_tempmain(); //对读到的温度值进行处理 if(HT>37|HT<20) // 判断温度范围 {beng=0;} // 如果温度高于37度或者低于20度,则报警告示 else beng=1; } }
|