DS1820与单片机如何读取温度?

作者&投稿:蔽佳 (若有异议请与网页底部的电邮联系)
求用51单片机通过ds1820读取温度的C程序,望附电路图,谢谢~~

还不懂的话,我来帮帮你速度搞定吧

#include
#include
#define uchar unsigned char
#define uint unsigned intuchar code dscrc_table[] = {
0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220,
35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98,
190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7,
219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154,
101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36,
248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185,
140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139,
87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53
};bit in=0,LastDeviceFlag=0,search_result=0,Rbit, cmp_bit, search_direction,ED=0,state=0;/*ED为允许显示*/sbit n1=P1^0;
sbit n2=P1^1;
sbit n3=P1^2;
sbit n4=P1^3;sbit settemp=P3^1; /*设置温度*/
sbit ADD=P3^2; /*增加*/
sbit SUB=P3^3; /*减少*/
sbit port=P3^4;
sbit LE=P3^5; /*为零时送数,为1时锁存*/
sbit DS=P3^7; /*为零时消隐*/
sbit ARMING=P3^0;union {uint t_value;uchar ds1,ds2,ds3,ds4,ds5,ds6,time,var; uchar ROM_NO[8];}V={0};
union {uint t_value,t_arm;uchar TEMPH,TEMPL,ARMH,ARML,ID_Number,Flag ;uchar Lastdif,crc8,bit_number,last_zero,byte_number,byte_mask;}W={0};/* Lastdif 查找到的最大器件数量 CRC8 校验和 bit_number 码位ID last_zero最后的冲突个数 byte_number ROM字节位,
byte_mask 辅助标识位*/uchar ROM[9][8]={0},i,j;uchar docrc8( uchar value);
bit Ds18b20Int(void);
void DS18b20st(void);
void dly(uchar temp);
void delayms(void);
bit ReadBit(void);
uchar Readbyte(void);
void WriteBit(bit temp);
void WriteByte(uchar wb);
void readTemp(uchar id);
bit SEARCH(void);
bit OWFirst(void);
bit OWNext(void);
void dsp(uchar id,bit ds);
void dd(uchar id,uchar d);
//void readArm(uchar id);
void WriteArm(uchar id);
/*------------------------------主程序------------------------------------*/
void main()
{
i=0;
j=0;
Rbit=0;
dsp(0x10,0); /*初始化不成功,则一直显示4个点,表示当前没有任何器件在线上*/Ds18b20Int();if(OWFirst())
{
for(i=0;i<9;i++)
ROM[0][i]=V.ROM_NO[i];
dsp(0x11,0); /*显示器件号1秒*/
delayms();
while(OWNext())
{
j++;
ROM[j][i]=V.ROM_NO[i];
dsp(0x11+j,0);
delayms(); /*显示器件号1秒*/
if(j>7)
break;
}
W.ID_Number=j;
} W.ARMH=35; /*+35*/
W.ARML=0XB5; /*-35*/
for(i=0;i<W.ID_Number;i++) /*配置所有器件*/
WriteArm(i); /*----------------------------------主程序循环段----------------------------------*/
/* 可重用的变量:ID_Number,TEMPH,TEMPL ,ARMH,ARML,FLAG,ROM_NO[8]
重新定意:ID_Number 传感器数量
FLAG 当前处理的传感器
TEMPH 温度高字节
TEMPL 温度低字节
ARMH 警告高值
ARML 警告低值 */ V.time=0;
i=0;
j=0;
Rbit=1;
state=0; /*正常测量状态*/
W.Flag=0;
for(;;)
{

if(W.Flag>W.ID_Number)
{
DS18b20st();
W.Flag=0;
}
if(!state)
{
readTemp(W.Flag);
W.Flag++;
}
V.var=250; /*----- 显示1秒的时间------*/
while(V.var--)
dsp(W.Flag,0);
/*----------------------------------------以上循环显示各点温度----------------------------*/


P3=0XFF;

if(!settemp) /*设置报警温度,循环5次进入设置状态,再一次显示下一个,再一次,退出状态*/
{
V.time++;
if(V.time>5)
{
state=!state;
V.time=0;
}
if(state)
{
WriteArm(W.Flag-1);
readTemp(W.Flag);
W.Flag++;
V.time=4;
Rbit=1;
}
}
else
V.time=0;
if(state&!ADD) /*显示高值*/
Rbit=1;

if(state&!SUB) /*显示低值*/
Rbit=0;
}
if(state&!settemp&!ADD&Rbit) /*高值加*/
{
if(W.ARMH>0x80)
W.ARMH--;
else
W.ARMH++;
if(W.ARMH>183)
W.ARMH=183;

} if(state&!settemp&!SUB&Rbit) /*高值减*/
{
if(W.ARMH>0x80)
W.ARMH++;
else
W.ARMH--;
if(W.ARMH==0xff)
W.ARMH=0;
}
if(state&!settemp&!ADD&!Rbit) /*低值加*/
{
if(W.ARML>0x80)
W.ARML--;
else
W.ARML++;
if(W.ARML>183)
W.ARML=183;
}

if(state&!settemp&!SUB&!Rbit) /*低值减*/
{
if(W.ARML>0x80)
W.ARML++;
else
W.ARML--;
if(W.ARML==0xff)
W.ARML=0;
} if(state&!ADD&!SUB)
{
WriteArm(W.Flag-1);
state=0;
}

}

我来回答吧,上个学期, 我做的课程设计就是基于单片机的数据温度计。

以下是我写出一程序,如果看不懂的话,就发邮件给我,amwjie72@163.com

#include<reg52.h>
#include<intrins.h>
#include<math.h>
#include<absacc.h>

#define uint unsigned int
#define uchar unsigned char

uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; // 用于共阳 低电平有效 不带小数点
uchar table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; // 带小数点 用于第三位

sbit w1 =P2^7;
sbit w2 =P2^6;
sbit w3 =P2^5; //此处要用带小数点的共阳编码
sbit w4 =P2^4;
sbit dat=P3^5; //P3^5为DS18B20的数据线

void delay_ds18b20(uint t) reentrant; //用于ds18b20的延时程序
bit reset_ds18b20(void); //用于复位ds18b20
void wr_bit(bit i); //用于向ds18b20写入一个bit
void wr_byte(uchar d); //用于向ds18b20写入一个byte
uchar rd_bit(void); //用于从ds18b20读出一个bit
uchar rd_byte(void); //用于从ds18b20读出一个byte
void start_ds18b20(void) small; //用于启动ds18b20的温度转换
void read_temperature(); //用于读取ds18b20的温度
void shift(); //用于转换读取的温度值
void obtain_temp(); //更新一次温度值
void delay();

uchar temph; //保存温度高八位
uchar templ; //保存温度低八位
bit nagetiveflag; //如果此bit为1表示温度为负
uint integral; //转换温度的整数部分
uint radix_point; //转换温度的小数点部分

void main()
{

while(1)
{
if(nagetiveflag==1)
{
P0=0xbf;
}
else if(integral/100==0)
{
P0=0xff;
}
else
{
P0=table[integral/100];
}
w1=0;
delay();
w1=1;

if((integral%100)/10==0)
{
P0=0xff;
}
else
{
P0=table[(integral%100)/10];
}
w2=0;
delay();
w2=1;

P0=table1[integral%10];
w3=0;
delay();
w3=1;

P0=table[radix_point];
w4=0;
delay();
w4=1;

obtain_temp();

}

}
/*
///////////////////////////////
函数: delay_ds18b20
功能: ds18b20延时函数
参数: t 为定时时间长度
返回: 无
说明: 延时公式:15*t+15(近似),晶振12Mhz
//////////////////////////////
*/
void delay_ds18b20(uint t)reentrant
{
for( ;t>0;t--)
{
_nop_;_nop_;_nop_;_nop_;
}
_nop_;_nop_;
}

/*
///////////////////////////////
函数: reset_ds18b20
功能: 复位ds18b20
参数: 无
返回: 1:复位成功 0:复位失败
说明: 拉低总线至少480us;可用于检测ds18b20, 晶振12Mhz
//////////////////////////////
*/
bit reset_ds18b20()
{
bit ret=1;
dat=0; //拉低总线
delay_ds18b20(32); //为保险起见,延时495us
dat=1; //释放总线
delay_ds18b20(4); //需要等待15~60us ,这里延时75us,保证接收的是存在脉冲
ret=dat;
delay_ds18b20(14); //让ds18b20释放总线。
dat=1;
return(~ret);
}

/*
///////////////////////////////
函数: wr_bit
功能: 向ds18b20写入一个bit
参数: i
返回: 无
说明: 拉低总线至少1us;并在0~15us内向总线写入要写入的bit 持续60us, 晶振12Mhz
//////////////////////////////
*/
void wr_bit(bit i)
{
dat=0; //拉低总线产生写时序
_nop_();
_nop_();
dat=i; //延时大于1us,并在15us内写入数据
delay_ds18b20(3);//延时60us 等待ds18b20采样读取
dat=1; //释放总线
}
/*
///////////////////////////////
函数: wr_byte
功能: 向ds18b20写入一个byte
参数: d
返回: 无
说明: 通过调用wr_bit(bit i)从低往高位写
//////////////////////////////
*/
void wr_byte(uchar d)
{
uchar i=0;
while(i++<8)
{
wr_bit(d&0x01); //此处&为按位与,但结果会传给一个bit 所以不会产生错误
d>>=1;
}
}
/*
///////////////////////////////
函数: rd_bit
功能: 从ds18b20读出一个bit
参数: 无
返回: bit
说明: 总线从高拉低总线,持续至少1us以上,再释放总线。产生读时序
//////////////////////////////
*/
uchar rd_bit()
{
uchar retu;
dat=0; //拉低总线
_nop_;_nop_;
dat=1; //释放总线
_nop_;_nop_;
_nop_;_nop_;
retu=dat; //读取数据
delay_ds18b20(3);
dat=1; //释放总线
return retu;
}
/*
///////////////////////////////
函数: rd_byte
功能: 从ds18b20读出一个byte
参数: 无
返回: ucahr
说明: 通过调用8次rd_bit()达到读出一个byte
//////////////////////////////
*/
uchar rd_byte()
{
uchar i;
uchar da;
for(i=0;i<8;i++)
{
da>>=1; //选读最低位
if(rd_bit())//读出来的是0可不用做或运算
{
da|=0x80;
}
}
return da;
}

/*
///////////////////////////////
函数: start_ds18b20
功能: 启动ds18b20
参数: 无
返回: 无
说明: 复位后,写入0xcc跳过对rom的操作,并写入0x44来启动温度转换
//////////////////////////////
*/
void start_ds18b20() small
{
dat=1;
reset_ds18b20();
wr_byte(0xcc); //跳过对rom的操作
wr_byte(0x44); //启动温度转换
}
/*
///////////////////////////////
函数: read_temperature
功能: 读取温度
参数: 无
返回: 无
说明: 复位后,写入0xcc跳过对rom的操作,并写入0xbe来读取温度。读两个字节
//////////////////////////////
*/
void read_temperature()
{
int temp;
reset_ds18b20();
wr_byte(0xcc); //跳过对rom的操作
wr_byte(0xbe); //发读取命令
templ=rd_byte();
temph=rd_byte();
}
/*
///////////////////////////////
函数: shift
功能: 温度转换
参数: 无
返回: 无
说明: 在读出温度后,用来将温度信息转换为对应该的温度数值大小
radix_point为小数点部分 integral整数部分
//////////////////////////////
*/
void shift()
{
if(temph>15)
{
nagetiveflag=1;
}
else
{
nagetiveflag=0;
}
radix_point=((float)(templ&0x0f))/1.6;
integral=(temph&0x07)*16+(templ>>4);
}
/*
///////////////////////////////
函数: delay
功能: 动态扫描延时
参数: 无
返回: 无
说明: 无
//////////////////////////////
*/
void delay()
{
uint k,j;
for(k=50;k>0;k--)
for(j=5;j>0;j--);
}
/*
///////////////////////////////
函数: obtain_temp
功能: 复位DS18B20读取温度值并对其进行转换
参数: 无
返回: 无
说明: 更新radix_point(小数点部分) integral(整数部分)
//////////////////////////////
*/
void obtain_temp()
{
start_ds18b20();
read_temperature();
shift();
}

网上有很多这样的例程啊。给你一个STC的,STC的下载程序方便,上手也比较快

CPU:STC12C5A48S2

#include "18B20.h"
#include<intrins.h>
#include <math.h> //要用到取绝对值函数abs()
/**************************************
延时X微秒(STC12C5A60S2@12M)
不同的工作环境,需要调整此函数
此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
**************************************/
sbit DQ=P1^0; //定义18B20数据脚为P1.0端口

void DelayXus(uint n)
{
while (n--)
{
_nop_();
_nop_();
}
}
void getTmp_Update()
{
uint TPL,TPH,tmpvalue,value;
float t;

Room_tmep=0;
DS18B20_Reset(); //设备复位
DS18B20_WriteByte(0xCC); //跳过ROM命令
DS18B20_WriteByte(0x44); //开始转换命令

while (!DQ){}; //等待转换完成
DS18B20_Reset(); //设备复位
DS18B20_WriteByte(0xCC); //跳过ROM命令
DS18B20_WriteByte(0xBE); //读暂存存储器命令
TPL = DS18B20_ReadByte(); //读温度低字节
TPH = DS18B20_ReadByte(); //读温度高字节
tmpvalue = TPH;
tmpvalue <<= 8;
tmpvalue |= TPL;
value = tmpvalue;

t = value * 0.0625; //使用DS18B20的默认分辨率12位, 精确度为0.0625度, 即读回数据的最低位代表0.0625度
/* 如果将它放大100倍, 使显示时可显示小数点后两位, 并对小数点后第三进行4舍5入, 如t=11.0625, 进行计数后, 得到value = 1106, 即11.06 度,
如t=-11.0625, 进行计数后, 得到value = -1106, 即-11.06 度 */
Room_tmep= t; //得到最终温度
}
/**************************************
复位DS18B20,并检测设备是否存在
**************************************/
void DS18B20_Reset()
{
uchar i=0;
CY = 1;
while (CY)
{

DQ = 0; //送出低电平复位信号
DelayXus(240); //延时至少480us
DelayXus(240);
DQ = 1; //释放数据线
DelayXus(60); //等待60us
CY = DQ; //检测存在脉冲
DelayXus(240); //等待设备释放数据线
DelayXus(180);
i++;
if (i>50){AD_Error_code=1;return;}else{if (AD_Error_code==1) {AD_Error_code=0;}}
}
}
/**************************************
从DS18B20读1字节数据
**************************************/
uint DS18B20_ReadByte()
{
uchar i;
uchar dat = 0;
for (i=0; i<8; i++) //8位计数器
{
dat >>= 1;
DQ = 0; //开始时间片
DelayXus(1); //延时等待
DQ = 1; //准备接收
DelayXus(1); //接收延时
if (DQ) dat |= 0x80; //读取数据
DelayXus(60); //等待时间片结束
}
return dat;
}
/**************************************
向DS18B20写1字节数据
**************************************/
void DS18B20_WriteByte(uint dat)
{
uchar i;
for (i=0; i<8; i++) //8位计数器
{
DQ = 0; //开始时间片
DelayXus(1); //延时等待
dat >>= 1; //送出数据
DQ = CY;
DelayXus(60); //等待时间片结束
DQ = 1; //恢复数据线
DelayXus(1); //恢复延时
}
}

/*************************************************
程序功能:用DS18B20测量室温并在数码管上显示。
-------------------------------------------------
测试说明:观察显示温度数值。
*************************************************/
#include <msp430x16x.h>
#include "BoardConfig.h"
#include "DS18B20.h"

//包括要显示的4位温度数字
uchar dN[6];
//数码管七段码;0--f
uchar scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//数码管位选变量
uchar cnt = 0;

void Disp_Numb(uint temper);

/****************主函数****************/
void main(void)
{
uchar i;

WDTCTL=WDTPW+WDTHOLD;

/*------选择系统主时钟为8MHz-------*/
BCSCTL1 &= ~XT2OFF; //打开XT2高频晶体振荡器
do
{
IFG1 &= ~OFIFG; //清除晶振失败标志
for (i = 0xFF; i > 0; i--); //等待8MHz晶体起振
}
while ((IFG1 & OFIFG)); //晶振失效标志仍然存在?
BCSCTL2 |= SELM_2 + SELS; //MCLK和SMCLK选择高频晶振

BoardConfig(0x38);
P4DIR = 0xff;
P4OUT = 0xff;

BoardConfig(0x30); //打开数码管

//设置看门狗定时器,初始化控制数码管的IO
WDTCTL = WDT_ADLY_1_9;
IE1 |= WDTIE;
//P4DIR = 0xff;

//P4OUT = 0x00;

//设置DS18B20的IO状态
P2DIR |= BIT4;
P2OUT |= BIT4;
//计数时钟选择SMLK=8MHz,1/8分频后为1MHz
TACTL |= TASSEL_2 + ID_3;
//打开全局中断
_EINT();
//循环读数显示
while(1)
{
Disp_Numb(Do1Convert());
}
}
/*******************************************
函数名称:watchdog_timer
功 能:看门狗定时器中断服务函数,进行数码
管动态扫描
参 数:无
返回值 :无
********************************************/
#pragma vector = WDT_VECTOR
__interrupt void watchdog_timer(void)
{
BoardConfig(0x10);
P4OUT = 0x0f;
BoardConfig(0x10);
P4OUT &= ~(1<<cnt);
BoardConfig(0x20);
P4OUT = scandata[dN[5-cnt]];
if(cnt==1) P4OUT |= 0x80; //在第二位显示小数点

cnt++;
if(cnt == 4) cnt = 0;
}
/*******************************************
函数名称:Disp_Numb
功 能:将从DS18B20读取的11bit温度数据转换
成数码管显示的温度数字
参 数:temper--11bit温度数据
返回值 :无
********************************************/
void Disp_Numb(uint temper)
{
uchar i;

for(i = 0;i < 6;i++) dN[i] = 0; //初始化显示变量

//数值转换
if(temper & BIT0)
{
dN[0] = 5;
dN[1] = 2;
dN[2] = 6;
}
if(temper&BIT1)
{
dN[1] += 5;
dN[2] += 2;
dN[3] += 1;
}
if(temper & BIT2)
{
dN[2] += 5;
dN[3] += 2;
if(dN[2] >= 10)
{
dN[2] -= 10;
dN[3] += 1;
}
}
if(temper&BIT3)
{
dN[3] += 5;
}
if(temper & BIT4)
{
dN[4] += 1;
}
if(temper & BIT5)
{
dN[4] += 2;
}
if(temper & BIT6)
{
dN[4] += 4;
}
if(temper & BIT7)
{
dN[4] += 8;
if(dN[4] >= 10)
{
dN[4] -= 10;
dN[5] += 1;
}
}
if(temper & BIT8)
{
dN[4] += 6;
dN[5] += 1;
if(dN[4] >= 10)
{
dN[4] -= 10;
dN[5] += 1;
}
}
if(temper & BIT9)
{
dN[4] += 2;
dN[5] += 3;
if(dN[4] >= 10)
{
dN[4] -= 10;
dN[5] += 1;
}
}
if(temper & BITA)
{
dN[4] += 4;
dN[5] += 6;
if(dN[4] >= 10)
{
dN[4] -= 10;
dN[5] += 1;
}
if(dN[5] >= 10)
{
dN[5] -= 10;
}
}
}

通过编写程序控制DS18B20读与写而得到温度的,不懂的再来找我啦

去下载一个ds18b20的资料看看就知道了 这是一个单总线的温度测量元件


高分求单片机温度采集系统的课程设计
对DS1820的使用,多采用单片机实现数据采集。处理时,将DS1820信号线与单片机一位口线相连,单片机可挂接多片DS1820,从而实现多点温度检测系统。由于DS1820只有三个引脚,其中两根是电源线VDD和GND,另外两根用作总线DQ(Data In\/Out),由于其输出和输入均是数字信号且与TTL电平兼容,因此其可以与微处理器直接进行接...

DS18B20温度传感器接口设计报告
DS1820提供九位温度读数,构成多点温度检测系统而无需任何外围硬件。 本文给出了DS1820与89C51单片机接口的应用实例和DS1820组成温度检测系统的方法,并给出了对DS1820进行各种操作的软件流程图。 1DS1820的特性 ·单线接口:仅需一根口线与MCU连接 ·无需外围元件 ·由总线提供电...

单片机18b20的资料
DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以0.0625℃\/LSB形式表达,其中S为符号位。 这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温...

求高手帮我翻译一下这汇编语言每一句是什么意思!!!万分感谢!!!_百度...
扫了一下这程序,从入口命名来看似乎是从1820温度传感器读取温度并显示到数码管的小程序。这么长恐怕没人能给你一行一行加注释……楼主应当先自学,有不懂的地方再提问。像这样哗啦一下贴出整个程序要人逐句解释,比较容易招人反感……

基于18B20的多点温度显示系统
方案一:温度检测可以使用低温热偶或铂电阻,数据采集部分则使用带有A\/D通道的单片机。考虑到一般的A\/D输入通道都只能接收大信号,所以还应设计相应的放大电路。此方案的软件简单,但硬件复杂,且检测点数追加时,成本会有较大增长幅度。 方案二:使用单片机和单总线温度传感器构成。单总线温度传感器可以采用DALLAS公司生产的...

急需智能仪器课程设计·· 加急
总之,555相当于一个可用模拟电压来控制翻转的R-S触发器。图2.5就是用555构成的多谐振荡电路,产生的振荡脉冲信号经过三极管放大后驱动扬声器报警,由单片机的P1.5端口输出高电平发出报警。图2.5 报警电路第3章 软件设计该课程设计中主要利用了DS18B20芯片进行测温,该芯片是单总线器件,顾名思义单总线只有一根数据线,因此...

基于MCS-51单片机的精密温度控制系统的设计与实现
本检测系统硬件设计以AT89C51单片机为核心,用温度传感器DS18B20实现温度控制,用数码管显示实际温度和预设温度,制作数字温度计,并可以实现温度预警控制。 单片机系统的软件编程采用单片机汇编进行编程。应用软件采用KEIL和PROTEUS仿真软件模拟实现控制过程。 温度控制系统是基于单片机的计算机检测技术的软硬件开发和面向对象的高级...

急!简单的单片机控制DS18B20温度计,proteus仿真不行,图和汇编程序如下...
RST BIT P1.5;\/\/ DS1302片选,因这两芯片采用同一数据脚(SDA,SCL),所以我们要定义它,将DS1302片选关掉,否则发生冲突 L_DISPLAY EQU 30H L_TMPDATE1 EQU 38H ;秒 L_TMPDATE2 EQU 39H ;分 L_TMPDATE3 EQU 3AH ;时 L_TMPDATE4 EQU 3BH ;星期 L_TMPDATE5 EQU 3CH ;日 L_TMP...

51单片机 要求:数码管1、2位显示实际温度;4、5位显示设定温度;7、8位...
2011-08-12 利用51单片机,4个数码管设计一个计时器,要求在数码管上显示... 12 2014-05-20 单片机A显示完“1、2、3、4”;单片机B数码管显示“5、6... 2011-04-20 51单片机做的万年历两个8位数码管显示日期时间,一个两位数码... 2012-07-23 求一个51单片机汇编程序,让四个数码管动态显示1 2 3 ...

89s52单片机显示四位数码管汇编语言测温程序,,,温度可显示范围在-20...
LCALL WRITE_1820 NOP LCALL DELAY LCALL DELAY CBA:LCALL INIT_1820 JB FLAG1,ABC LJMP CBA ABC:LCALL DELAY1 MOV A,#0CCH ; 跳过ROM匹配 LCALL WRITE_1820 MOV A,#0BEH ; 发出读温度命令 LCALL WRITE_1820 LCALL READ_18200 ;或者 READ_1820 RET ;---读DS18B20的程序,从DS18B20中读出一...

仁寿县17389861312: 疑问???51单片机的某个I/O管脚怎样读取DS18B20采集的2字节的温度数据? -
诏永卡罗: 给你一段参考代码,我自己用过的,保证可用.ORG 0000H;单片机内存分配申明!TEMPER_L EQU 29H;用于保存读出温度的低8位 TEMPER_H EQU 28H;用于保存读出温度的高8位 FLAG1 EQU 38H;是否检测到DS18B20标志位 a_bit ...

仁寿县17389861312: 四路温度在巡回监测系统温度是怎样通过Ds18B20传到单片机内部的? -
诏永卡罗: DS18B20数字式温度传感器,1-wire单线连接,DALLAS承诺每个,可以使用单片机的一个GPIO接你说的4个18B20并根据其通信协议实现读取温度.串入并出的74LS164不知你要做什么用,如果仅仅是希望MCU得到温度数据的话,它没有用,如果是做显示的话,MCU获得数据后再传给74LS164好了.

仁寿县17389861312: 新手求教ds18b20如何正确显示正负温度值 -
诏永卡罗: #include #defineucharunsignedchar #defineuintunsignedint sbitDQ=P3^7;//ds18b20与单片机连接口 sbitRS=P2^6; sbitRW=P2^5; sbitEN=P2^7; unsignedcharcodestr1[]={"temperature:"}; unsignedcharcodestr2[]={" °C "}; uchardatadisdata[5]; ...

仁寿县17389861312: 如何用51单片机读取ds18b20的取负温度?求教. -
诏永卡罗: 判断是否是负,就是取高几位的读取值采用与的方式判断,比如(000) 11111 00001000,那么高5位可以这样弄,tempH&0x1f,如果这个值=1;说明是负的,否则就是正的啊,不过有一点,取反是对的,还要加1啊,记得哦. 至于在LCD中显示的,确实是按你说的那样,直接写上一个符号即可.

仁寿县17389861312: 谁能告诉我单片机从ds18b20中读取温度的原理,是怎样将ds18b20中输出的一位信号变为多位的. -
诏永卡罗: 首先,DS18B20输出的一位(1 bit)信号是不能被单片机变为多位的,一位就是一位,单片机需要连续多次读取DS18B20输出的一位信号,来合成它需要的信息.比如DS18B20的温度输出是16位数据,那么单片机就要读16次1 bit数据.读取温...

仁寿县17389861312: ds18b20如何正确显示零下温度 -
诏永卡罗: 你要去看这个芯片温度的存储方式.应该是有符号浮点数.

仁寿县17389861312: avr单片机18B20温度传感器编程 -
诏永卡罗: ;这是关于DS18B20的读写程序,数据脚P2.2,晶振12MHZ ;温度传感器18B20汇编程序,采用器件默认的12位转化,最大转化时间750微秒 ;可以将检测到的温度直接显示到AT89C51开发实验板的两个数码管上 ;显示温度00到99度,很准...

仁寿县17389861312: 用AT89S51单片机如何做数字温度计{用DS18B20温度传感器} -
诏永卡罗: DS18B20感应到对应温度值时会出输一个对应电压,对过AD采样模快对电压采样,得到对应值,数据给单片机计算然后输出显示就行了!

仁寿县17389861312: 求C语言程序,AT89C51单片机为核心,DS18B20测温度,实时用4位LED显示温度,并且用单片机控制继电器 -
诏永卡罗: #include // 试试#define uchar unsigned char #define uint unsigned int sbit DQ=P1^4; //ds18b20与单片机连接口 unsigned char code str[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40} ; //共阴数码管字码表 unsigned char code ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网