问:利用数字温度传感器DS18B20与单片机结合来测量温度。利用数字温度传感器DS18B20测量温

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-07-19
问:利用数字温度传感器DS18B20与单片机结合来测量温度。利用数字温度传感器DS18B20测量温

利用数字温度传感器DS18B20与单片机结合来测量温度。利用数字温度传感器DS18B20测量温度信号,计算后在7段显示器LED数码管上显示相应的温度值。其温度测量范围为−55℃~125℃,精确到0.5℃。数字温度计所测量的温度采用数字显示,控制器使用51单片机,测温传感器使用DS18B20,用4位共阳极LED数码管实现温度显示

程序比较长:
#include
#define uchar unsigned char
#define uint unsigned int
sbit DS=P2^2; //define interface
uint temp; // variable of temperature
uchar flag1; // sign of the result positive or negative
sbit dula=P2^6;
sbit wela=P2^7;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef};
void delay(uint count) //delay
{
uint i;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
void dsreset(void) //send reset and initialization command 18B20复位,初始化函数

{
uint i;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}
bit tmpreadbit(void) //read a bit 读1位数据函数
{
uint i;
bit dat;
DS=0;i++; //i++ for delay
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return (dat);
}
uchar tmpread(void) //read a byte date 读1字节函数
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();//22
dat=(j>1); //23 读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
void tmpwritebyte(uchar dat) //write a byte to ds18b20 向1820写一个字节数据函数
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0; //write 0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
void tmpchange(void) //DS18B20 begin change 开始获取数据并转换
{
dsreset();
delay(1);
tmpwritebyte(0xcc); // address all drivers on bus 写跳过读ROM指令
tmpwritebyte(0x44); // initiates a single temperature conversion 写温度转换指令
}
uint tmp() //get the temperature 读取寄存器中存储的温度数据
{
float tt;
uchar a,b;
dsreset();
delay(1);
tmpwritebyte(0xcc); // address all drivers on bus 写跳过读ROM指令
tmpwritebyte(0xbe);//从ram中读数据
a=tmpread(); //读低8位
b=tmpread(); //读高8位
temp=b;
temp<<=8; //two byte compose a int variable 两个字节组合为1个字
temp=temp|a;
tt=temp*0.0625; //温度在寄存器中是12位,分辨率是0.0625
temp=tt*10+0.5; //乘10表示小数点后只取1位,加0.5是四折五入
return temp;
}
void display(uint temp)//显示程序
{
uchar A1,A2,A2t,A3,ser;
ser=temp/10;
SBUF=ser;
A1=temp/100;
A2t=temp%100;
A2=A2t/10;
A3=A2t%10;
dula=0;
P0=table[A1];//显示百位
dula=1;
dula=0;
wela=0;
P0=0x7e;
wela=1;
wela=0;
delay(1);
dula=0;
P0=table1[A2];//显示十位
dula=1;
dula=0;
wela=0;
P0=0x7d;
wela=1;
wela=0;
delay(1);
P0=table[A3];//显示个位
dula=1;
dula=0;
P0=0x7b;
wela=1;
wela=0;
delay(1);
}
void main()
{
uchar a;
do
{
tmpchange();
// delay(200);
for(a=10;a>0;a--)
{ display(tmp());
}
} while(1);
}

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcd_rs=P2^0;
sbit lcd_rw=P2^1;
sbit lcd_en=P2^2;
sbit tempt=P3^4;
uchar code disp[]="0123456789";
uchar code disp2[]="Temperature:";
uchar code disp3[]="^C";
uint u_tempt;
float f_tempt;
void delay(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<130;j++);
}
void write_command(uchar com)
{
lcd_rs=0;
P0=com;
delay(5);
lcd_en=1;
delay(5);
lcd_en=0;
delay(5);
}
void write_data(uchar date)
{
lcd_rs=1;
P0=date;
delay(5);
lcd_en=1;
delay(5);
lcd_en=0;
delay(5);
}
void lcd_init()
{
lcd_en=0;
lcd_rw=0;
write_command(0x38);
write_command(0x0c);
write_command(0x06);
write_command(0x01);
}
void display_tempt(uint date)
{
uchar i,j,k;
i=date/100;
j=date%100/10;
k=date%100%10;
write_command(0xc0+5);
write_data(disp[i]);
write_data(disp[j]);
write_data('.');
write_data(disp[k]);
}
void reset_tempt()
{
uint i;
tempt=0;
i=90;
while(i>0)
i--;
tempt=1;
i=4;
while(i>0)
i--;
}
bit read_bit()
{
uint i;
bit dat;
tempt=0;
i++;
tempt=1;
i++;
i++;
dat=tempt;
i=8;
while(i>0)
i--;
return dat;
}
uchar read_tempt()
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=read_bit();
dat=(j<<7)|(dat>>1);
}
return dat;
}
void write_byte(uchar dat)
{
uint i;
uchar j;
bit testbit;
for(j=1;j<=8;j++)
{
testbit=dat&0x01; //每次写一位数据
dat=dat>>1;
if(testbit)
{
tempt=0;
i++;
tempt=1;
i=8;
while(i>0)i--;
}
else
{
tempt=0;
i=8;
while(i>0)i--;
tempt=1;
i++;
i++;
}
}
}
void convert_tempt()
{
reset_tempt();
delay(1);
write_byte(0xcc);
write_byte(0x44);
}
uint get_tempt()
{
uchar a=0,b=0;
//uint t=0;
reset_tempt();
write_byte(0xcc);
write_byte(0x44);
reset_tempt();
write_byte(0xcc);
write_byte(0xbe);
a=read_tempt();
b=read_tempt();
u_tempt=b;
u_tempt<<=8;
u_tempt=u_tempt|a;
f_tempt=u_tempt*0.0625;
u_tempt=f_tempt*10;
return u_tempt;
}
void display()
{
uchar i,j;
write_command(0x80+3);
for(i=0;i<11;i++)
{
write_data(disp2[i]);
}
write_command(0xc0+10);
for(j=0;j<2;j++)
{
write_data(disp3[j]);
}
}
void main()
{
uchar i;
lcd_init();
display();
while(1)
{
convert_tempt();
for(i=0;i<10;i++)
{
display_tempt(get_tempt());
}
}
}

然后呢? 能不能具体点你的问题。。。

  • 我有个单片机学习箱,可以用DHT11替代DS18B02吗
    答:不可以,DS18B02为温度传感器,DHT11为温湿度传感器,前者只有温度,后者温度湿度都有。如果直接拔下来换上,引脚不匹配。
  • DS18B20的数字温度传感器DS18B20介绍
    答:DS18BDS1822“一线总线”数字化温度传感器同DS1820一样,DS18B20也支持“一线总线”接口,测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。DS1822的精度较差为±2°C。DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的...
  • ds18b20温度传感器引脚
    答:ds18b20温度传感器工作原理DS18B20温度传感器是一种数字温度传感器,它采用1-Wire协议,可以提供9位到12位的温度测量精度。DS18B DS1822 “一线总线”数字化温度传感器 同DS1820一样,DS18B20也 支持“一线总线”接口,测量温度范围为 -55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。DS18...
  • protues运行出现:[DS18B22]RAM COMMAND UNSUPPORTED 是什么原因_百度知 ...
    答:你可以把数码管动态显示的延时改长一点,就不会有警告了,可能是读取得太快了,以致DS18B20还没来得及准备数据
  • 单片机与DS18B20并用LCD1602显示 c程序
    答://Init_DS18B20();//温度传感器DS18b2初始化子函数,在头文件中 flag=ReadTemperature();//将18b2头文件运行返回的函数结果送到变量FLAG中,用于显示 //读取秒时分周日月年七个数据(DS1302的读寄存器与写寄存器不一样): miao = BCD_Decimal(read_1302(0x81)); fen = BCD_Decimal(read_1302(0x83)); shi...
  • 基于51系列的单片机和DS1302时钟芯片以及液晶显示的lcd1602电子万年历毕...
    答://Init_DS18B20();//温度传感器DS18b2初始化子函数,在头文件中 flag=ReadTemperature();//将18b2头文件运行返回的函数结果送到变量FLAG中,用于显示 //读取秒时分周日月年七个数据(DS1302的读寄存器与写寄存器不一样):miao = BCD_Decimal(read_1302(0x81)); fen = BCD_Decimal(read_1302(0x83)); shi ...
  • 基于18B20的多点温度显示系统
    答:单总线温度传感器可以采用DALLAS公司生产的DS18B20系列,这类温度传感器直接输出数字信号,且多路温度传感器可以挂在1条总线上,共同占用单片机的1条I/O线即可实现接口。在提升单片机I/O线驱动能力的前提下,理论上可以任意扩充检测的温度点数。 比较两个方案后可以发现,方案二更适合于用作本系统的实施方案。尽管方案二不...
  • 请各位大侠,帮注释DS18B20温度传感器程序,注释uint read_temprature(vo...
    答:write_byte(0x44);/*启动DS1820进行温度转换,12位转换时最长为750ms(9位为93.75ms)。结果存入内部9字节RAM中。 */ delay(300);//写入命令需要时间反应 init_DS18B20(); //初始化 write_byte(0xcc);write_byte(0xbe);//读内部RAM中9字节的内容 a=read_byte();b=read_byte();temp=...
  • 急求一个 DS18B2O感温 然后 at89c51单片机控制2267发射信号的程序 及...
    答:不明白你的意思啊
  • Sensata公司的代理商有哪些?
    答:DS18B220温度传感器、薄膜电阻、油压差开关、液位监控开关、高温线缆、特密克Thermik热敏开关、热保护器、ABB变频器备件、西门子变频器备件、FANUC整机备件、施耐德整机备件、流量计、湿度传感器、触力传感器、热敏开关、进口电容器、电机防潮加热带、压力传感器、过载保护器、压缩机保护器、油压差控制开关、温度...