怎么用单片机来设计温度传感器?

全部回答5
默认 最新
  • 资料比较多的是DS18B20 你也可以去电子市场问问,有其他的传感器的
    0 点赞
  • 一块温度传感器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);  }}
    0 点赞
  • 18B20可以,电源,地,信号就可以了.直接读内部数据.如果要求不高可以用NTC电阻.不过最好有AD的片子.仅用IO的片子要不相对麻烦多了.
    0 点赞
  • DS18B20是最简单的测温元件,像三极管一样,直接接单片机,网上多得是程序。有材料的半小时就能写出基本像样的程序。LM35测量温度也不错,不过这需要ADC才行。
    0 点赞
  • 用18b20这个芯片测温度,i2c控制。
    0 点赞

没有更多内容了

返回顶部
产品求购 求购