一块温度传感器ds18b20和一块单片机就行了(欢迎提问) /********************************************************************* 文件名 : 温度采集ds18b20.c* 描述 : 该文件实现了用温度传感器件ds18b20对温度的采集,并在液晶1602 上显示出来。* 创建人 : hsy2011,2011年1月10日***********************************************************************/#include<reg52.h>#define uchar unsigned char#define uint unsigned int #define jump_rom 0xcc#define start 0x44#define read_eerom 0xbe sbit dq = p2^3; //ds18b20数据口 unsigned char tmph,tmpl; sbit e=p2^7; //1602使能引脚sbit rw=p2^6; //1602读写引脚 sbit rs=p2^5; //1602数据/命令选择引脚 /********************************************************************* 名称 : delay()* 功能 : 延时,延时时间大概为140us。* 输入 : 无* 输出 : 无***********************************************************************/ void delay_1(){ int i,j; for(i=0; i<=10; i++) for(j=0; j<=2; j++);} /********************************************************************* 名称 : enable(uchar del)* 功能 : 1602命令函数* 输入 : 输入的命令值* 输出 : 无***********************************************************************/ void enable(uchar del){ p0 = del; rs = 0; rw = 0; e = 0; delay_1(); e = 1; delay_1();} /********************************************************************* 名称 : write(uchar del)* 功能 : 1602写数据函数* 输入 : 需要写入1602的数据* 输出 : 无***********************************************************************/ void write(uchar del){ p0 = del; rs = 1; rw = 0; e = 0; delay_1(); e = 1; delay_1();} /********************************************************************* 名称 : l1602_init()* 功能 : 1602初始化,请参考1602的资料* 输入 : 无* 输出 : 无***********************************************************************/void l1602_init(void){ enable(0x01); enable(0x38); enable(0x0c); enable(0x06); enable(0xd0);} /********************************************************************* 名称 : l1602_char(uchar hang,uchar lie,char sign)* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下 l1602_char(1,5,'b')* 输入 : 行,列,需要输入1602的数据* 输出 : 无***********************************************************************/void l1602_char(uchar hang,uchar lie,char sign){ uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; enable(a); write(sign);} /********************************************************************* 名称 : l1602_string(uchar hang,uchar lie,uchar *p)* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下 l1602_string(1,5,"ab cd ef;")***********************************************************************/void l1602_string(uchar hang,uchar lie,uchar *p){ uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; enable(a); while(1) { if(*p == '\0') break; write(*p); p++; }} /********************************************************************* 名称 : delay()* 功能 : 延时函数***********************************************************************/void delay(uint n){ int i; for(i=0; i<n; i++) ;} /********************************************************************* 名称 : reset()* 功能 : 复位ds18b20* 输入 : 无* 输出 : 无***********************************************************************/uchar reset(void){ uchar deceive_ready; dq = 0; delay(29); dq = 1; delay(3); deceive_ready = dq; delay(25); return(deceive_ready);} /********************************************************************* 名称 : read_bit()* 功能 : 从ds18b20读一个位值* 输入 : 无* 输出 : 从ds18b20读出的一个位值***********************************************************************/uchar read_bit(void){ uchar i; dq = 0; dq = 1; for(i=0; i<3; i++); return(dq);} /********************************************************************* 名称 : write_bit()* 功能 : 向ds18b20写一位* 输入 : bitval(要对ds18b20写入的位值)* 输出 : 无***********************************************************************/void write_bit(uchar bitval){dq=0;if(bitval==1)dq=1;delay(5);dq=1;} /********************************************************************* 名称 : read_byte()* 功能 : 从ds18b20读一个字节* 输入 : 无* 输出 : 从ds18b20读到的值***********************************************************************/uchar read_byte(void){ uchar i,m,receive_data; m = 1; receive_data = 0; for(i=0; i<8; i++) { if(read_bit()) { receive_data = receive_data + (m << i); } delay(6); } return(receive_data);} /********************************************************************* 名称 : write_byte()* 功能 : 向ds18b20写一个字节* 输入 : val(要对ds18b20写入的命令值)* 输出 : 无***********************************************************************/void write_byte(uchar val){ uchar i,temp; for(i=0; i<8; i++) { temp = val >> i; temp = temp & 0x01; write_bit(temp); delay(5); }} /********************************************************************* 名称 : main()* 功能 : 主函数***********************************************************************/void main(){ float tt; uint temp; p2 = 0x00; l1602_init(); l1602_string(1,1," ds18b20 test "); l1602_string(2,1,"temperature:00`c"); while(1) { reset(); write_byte(jump_rom); write_byte(start); reset(); write_byte(jump_rom); write_byte(read_eerom); tmpl = read_byte(); tmph = read_byte(); temp = tmph; temp <<= 8; temp = temp | tmpl; tt = tmpl * 0.0625; temp = tmpl / 16 + tmph * 16; l1602_char(2,13,temp/10%10 + 48); l1602_char(2,14,temp%10 + 48); }}