中易网

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

答案:5  悬赏:20  
解决时间 2021-01-09 02:53
DS1820与单片机如何读取温度?
最佳答案
网上有很多这样的例程啊。给你一个STC的,STC的下载程序方便,上手也比较快

CPU:STC12C5A48S2

#include "18B20.h"
#include
#include //要用到取绝对值函数abs()

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度

Room_tmep= t; //得到最终温度
}

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;}}
}
}

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;
}

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
#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;


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());
}
}

#pragma vector = WDT_VECTOR
__interrupt void watchdog_timer(void)
{
BoardConfig(0x10);
P4OUT = 0x0f;
BoardConfig(0x10);
P4OUT &= ~(1< BoardConfig(0x20);
P4OUT = scandata[dN[5-cnt]];
if(cnt==1) P4OUT |= 0x80; //在第二位显示小数点

cnt++;
if(cnt == 4) cnt = 0;
}

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;
}
}
}
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
公安便民卡怎么查询余额
形容女人胳膊美的成语
灏是什么意思?琛是什么意思?灏琛是什么意思
坐火车从云浮到广州站多久能到
谁可以帮我分析一下这个简易彩灯控制电路的工
为什么氮肥使用过多会使植物徒长,贪青倒
可以补送丧事礼金吗?
中国农业银行(熊山分理处)地址在什么地方,我
亿梦歌吧地址在哪,我要去那里办事
ibanez grx140 150那个性价比高?
zippo油能用别的替代吗?
月薪2万是一种怎样的人生体验
描写牧羊人的句子
把不忙不闲的工作做的出色,把不咸不淡的生活
准备买来洞房点的蜡烛能提前用吗?
推荐资讯
王寨村地址有知道的么?有点事想过去
20万年利率1.43%是多少啊
尚舞现代潮流舞蹈培训中心(横林店)地址在什么
文峰客栈(宜春铜鼓县)地址在什么地方,我要处
自恐多情损梵行,入山又怕误倾城.世间安得双全
带主成语
君报红豆应以双是什么意思
西安桥筏地点有哪些?
太平洋集体工伤险
工业集约化与工业聚集的区别?
水远山遥又未归,家门入口至优疑,神前有愿需
有谁知道湖北康乐滋食品饮料公司主要生产什么
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?