最近用18B20做了个温度测试,单片机控制,

作者&投稿:澹时 (若有异议请与网页底部的电邮联系)
单片机18b20读不出温度~

//使用11.0592M
#define TMDAT P3_7
unsigned int i;
unsigned char n1,n2,n3;//依次为十位、个位、一位小数
void tmreset (void)
{
TMDAT = 0;
i = 120;
while (i>0) i--;
TMDAT = 1;
i = 2;
while (i>0) i--;
}

void tmpre (void)
{
while (TMDAT);
while (~TMDAT);
i = 4; while (i>0) i--;
}

bit tmrbit (void)
{
unsigned int i;
bit dat;
TMDAT = 0; i++;
TMDAT = 1; i++; i++;
dat = TMDAT;
i = 4; while (i>0) i--;
return (dat);
}

unsigned char tmrbyte (void)
{
unsigned char i,j,dat;
dat = 0;
for (i=1;i<=8;i++)
{
j = tmrbit ();
dat = (j > 1);
}
return (dat);
}

void tmwbyte (unsigned char dat)
{
unsigned int i;
unsigned char j;
bit testb;
for (j=1;j<=8;j++)
{
testb = dat & 0x01;
dat = dat >> 1;
if (testb)
{
TMDAT = 0;
i++; i++;
TMDAT = 1;
i = 4; while (i>0) i--;
}
else
{
TMDAT = 0;
i = 4; while (i>0) i--;
TMDAT = 1;
i++; i++;
}
}
}

void tmrtemp ()
{
uchar a,b,c,d;
tmreset();
i = 120;
while (i>0) i--;
tmwbyte(0xcc);
tmwbyte (0xbe);
a = tmrbyte ();
b = tmrbyte ();
c=a&0x0f;
d=(b>4);
n3=c*10/16;
n1=d/10;
n2=d%10;
}

//以上是子程序部分,使用时只要调用以下程序就能得到温度的十位,个位和第一位小数。

tmreset (); //复位
tmpre (); //等待存在脉冲
i = 120;
while (i>0) i--;
tmwbyte (0xcc); //跳过序列号命令
tmwbyte (0x44); //发转换命令
while(!tmrbit());
tmrtemp();

热电偶或者铂电阻,不过铂电阻能到这么大范围的不多或者贵

ORG 0000H ;DS18B20.ASM
TEMPER_L EQU 41H ;用于保存读出温度的低8位
TEMPER_H EQU 40H ;用于保存读出温度的高8位
FLAG1 EQU 38H ;是否检测到DS18B20标志位
A_BIT1 EQU 31H ;数码管个位数存放内存位置
B_BIT1 EQU 32H ;数码管十位数存放内存位置
D_BIT1 EQU 35H ;数码管百位数存放内存位置
DQ EQU P3.2 ;30H,31H,32H,33H: X 个位 十位 X
MOD7: MOV SP,#60H
LCALL GET_TEMPER ;调用读温度子程序
LCALL TEMPCOV
LCALL DISPLAY ;调用数码管显示子程序
AJMP MOD7
TEMP0: INC A
AJMP TEMP1
TEMPCOV:MOV A,TEMPER_L ;数据处理子程序TEMPCOV
MOV B,#16
DIV AB
JB B.3,TEMP0
TEMP1: MOV 34H,A ;将TEMPER_L的高四位右移四位,存入34H中(温度值)
MOV A,B ;将TEMPER_L的低四位X10/16得小数后一位数.
MOV B,#10
MUL AB
MOV B,#16
DIV AB
MOV 30H,A ;将小数后一位数.存入30H中
MOV A,TEMPER_H ;TEMPER_H中存放高8位数,权重16
MOV B,#16
MUL AB
ADD A,34H ;34H中存入温度值的整数部分
MOV B,#10
DIV AB
MOV 31H,B ;个位存入31H中
MOV B,#10 ;
DIV AB ;
MOV 32H,B ;十位存入32H中
MOV B,#10 ;
DIV AB ;
MOV 35H,B ;百位存入33H中
MOV A,TEMPER_H
MOV 33H,#10H ;
JB ACC.7,EXIT7
MOV 33H,#00H
EXIT7: RET
INIT_1820: ;这是DS18B20复位初始化子程序
SETB DQ
NOP
CLR DQ ;主机发出延时537微秒的复位低脉冲
MOV R1,#3
TSR1: MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB DQ ;然后拉高数据线
NOP
NOP
NOP
MOV R0,#25H
TSR2: JNB DQ,TSR3 ;等待DS18B20回应
DJNZ R0,TSR2
LJMP TSR4 ;延时
TSR3: SETB FLAG1 ;置标志位,表示DS1820存在
LJMP TSR5
TSR4: CLR FLAG1 ;清标志位,表示DS1820不存在
LJMP TSR7
TSR5: MOV R0,#117
TSR6: DJNZ R0,TSR6 ;时序要求延时一段时间
TSR7: SETB DQ
RET
;-------------------------------------------------
GET_TEMPER: ;读出转换后的温度值
SETB DQ
LCALL INIT_1820 ;先复位DS18B20
JB FLAG1,TSS2
RET ;判断DS1820是否存在?若DS18B20不存在则返回
TSS2: MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ;发出温度转换命令
LCALL WRITE_1820
LCALL DISPLAY ;等待AD转换结束,12位的话750微秒
LCALL INIT_1820 ;准备读温度前先复位
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;发出读温度命令
LCALL WRITE_1820
LCALL READ_18200 ;将读出的温度数据保存到35H/36H
RET
;写DS18B20的子程序(有具体的时序要求)
WRITE_1820: MOV R2,#8 ;一共8位数据
CLR C
WR1: CLR DQ
MOV R3,#6
DJNZ R3,$
RRC A
MOV DQ,C
MOV R3,#23
DJNZ R3,$
SETB DQ
NOP
DJNZ R2,WR1
SETB DQ
RET
;读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200: MOV R4,#2 ;将温度高位和低位从DS18B20中读出
MOV R1,#TEMPER_L ;低位存入TEMPER_L(TEMPER_L),高位存入(TEMPER_H)
RE00: MOV R2,#8 ;数据一共有8位
RE01: CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#9
RE10: DJNZ R3,RE10
MOV C,DQ
MOV R3,#23
RE20: DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;显示子程序
DISPLAY: MOV DPTR,#TAB ;指定查表启始地址
MOV R0,#4
DPL1: MOV R1,#250 ;显示1000次
DPLOP: MOV A,A_BIT1 ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
MOV P1,A ;送出个位的7段代码
CLR P3.7 ;开个位显示
ACALL D1MS ;显示1MS
SETB P3.7
MOV A,B_BIT1 ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
MOV P1,A ;送出十位的7段代码
CLR P3.5 ;开十位显示
ACALL D1MS ;显示1MS
SETB P3.5
MOV A,D_BIT1 ;取百位数
MOVC A,@A+DPTR ;查百位数的7段代码
MOV P1,A ;送出百位的7段代码
CLR P3.4 ;开百位显示
ACALL D1MS ;显示1MS
SETB P3.4
MOV P1,#00H
DJNZ R1,DPLOP ;100次没完循环
DJNZ R0,DPL1 ;4个100次没完循环
RET
;1MS延时(按12MHZ算)
D1MS: MOV R7,#0FFH
DJNZ R7,$
; DJNZ R7,$
RET
;实验板上的7段数码管0~9数字的共阴显示代码
TAB: DB 07DH;0
DB 018H;1
DB 06EH;2
DB 03EH;3
DB 01BH;4
DB 037H;5
DB 077H;6
DB 01CH;7
DB 07FH;8
DB 03FH;9

END

你给你的程序出来 让大家 帮你看看得 了 谁会无聊写个这么个程序 不累呀 !要不都是从网上去给你下篇!

把你 的程序贴出来,纠正下就可以了...


DS18B20温度传感器不工作问题
看看DS18B20电源接触是否有问题?可以先在转换温度(44h)后,加一条延时函数,大概延时720ms~1s。,若工作稳定的话,那么,应该是DS18B20电源的问题了

最近在做单片机的论文,题目是数字温度计;要求(1)测量-40℃-90℃范围的...
include "LCD1602.h"include "LCD1602define.h"include "18b20.h"define uchar unsigned char void delayms(unsigned int count);\/\/延时程序 void delayms(unsigned int count){ unsigned int i,j;for(i=0;i<count;i++)for(j=0;j<120;j++);} \/***主程序***\/ main(){ uchar tem_h,tem...

防水DS18B20相关问题
没有差异 有一点不同 问题不大 性能一样 没有防水芯片

单片机万年历的c语言程序
DS1302+DS18B20 用1602显示我在PROTUES仿真上做的 你可以根据程序画电路图 很简单 程序 采用模块化方式 \/*初始化*\/ #define uint unsigned int #define ...\/*18B20*\/部分void init_18b20(){ DQ=1; delay(8); \/\/延时 DQ=0; delay(80); DQ=1; delay(20);}void write_dat(uchar dat){ uchar i,k...

各位大侠,本人最近在学习用protues与keil进行联合仿真,但是发现了不...
那就是 显示 和 仿真效果 不一样了;第一,你确定 你的连线正确;第二,你确定你的硬件没有烧坏;我课程设计 ,烧坏俩18B20,三个二极管;第三,你确定板子没有短路现象;如果仿真成功,我只能想到是硬件问题;我没有怀疑,那你的仿真器件和你焊板子的器件是否通用,也没有怀疑,你把程序烧到片子...

南京邦元单片机培训单片机温度控制系统
通过P1.1, P1.2, P1.4或P2.7接收按键信号,确保在键盘接触不良时避免误操作。行走车的巡回和定位由C9013三极管和DAI4002D固态继电器控制,有效隔离强电与弱电,确保驱动的可靠性和安全性。左、右限信号通过接近开关检测后触发中断,决定行走车的移动方向。温度控制部分采用18B20传感器检测实际温度,...

单片机开题报告范文
数据处理主要是对数字温度传感器18B20采集温度数据和对MQ-2烟物传感器进行AD采集,并进行逻辑判断,根据数据的具体情况输出到数码管显示和使蜂鸣器动作[3]。整个单片机应用系统的设计分为硬件电路设计和软件编程设计两大部分;其中硬件电路设计包括温度采集电路,MQ-2烟物传感器电路,单片机控制电路,显示电路,报警与控制电路和...

qq邮箱一打开就出现0×618b20d8指令引用的0×618b20d8内存。该内存不...
程序需要一块内存用以保存数据时,就需要调用操作系统提供的“功能函数”来申请,如果内存分配成功,函数就会将所新开辟的内存区地址返回给应用程序,应用程序就可以通过这个地址使用这块内存。这就是“动态内存分配”,内存地址也就是编程中的“指针”。 内存不是永远都招之即来、用之不尽的,有时候内存分配也会失败。

论文单片机温度控制系统的(程序清单)!!!急!!!
这是12 位转化后得到的 12 位数据,存储在 18B20 的两个 8 比特的 RAM 中,二进制中的前面 5 位是符号位,如果测得的温度大于 0,这 5 位为 0,...一位。用 P2 口作为段控码输出,并用 74HC244 作驱动。P1.0—P1.2 作为位控码输出,用PNP 型三极管做驱动。模块电路如下图 4: 4、加热控制电路的设计...

哪个牌子的温度传感器好用?国内的与国外有哪些差异?
温度传感器有很多的品牌,这个比较难说的了,但是总的来说国外的应该是比国内要好一些。有一个夏罗登工业科技做的代理传感器品牌都是比较齐全的,你可以去看看,有一些比较知名的品牌例如:JUMO、Graeff、Dittmer、Kriwan等等。这些都还不错的呢。

崇阳县19326947943: 18B20测的温度准确吗? -
百花恒得: 将18b20通过一节带胶皮的软导线相连,就可以解决测的温度偏高的问题.测试结果与水银温度计的偏差范围在0.3度左右.如果dq与单片机有上拉电阻的io口连接时,不要再上拉,最好再串一个10欧的电阻.

崇阳县19326947943: 你好,我在用DS18B20做温度测试的单片机,想知道读取到的DMPL=read - byte( );DMPH=read - byte 是几进制数? -
百花恒得: 读到的两个字节一个是高8位,一个是低8位,将高8位乘以256再加上低8位,得到的就是DS18B20传回的温度数据,把这个数据乘以0.0625便得到温度数.因为传回的数据是补码表示,而一般的单片机内部的整数也是补码表示,所以直接相乘就可以了,不需要做额外的码制转换.至于你那个语句,应该是舍去了低4位,低4位是小数部分,得到的数据就是温度的整数部分.

崇阳县19326947943: 单片机 通过DS18B20测试当前环境温度, 并通过数码管显示当前温度值 -
百花恒得: void dsInit() //初使化DS18b20 dsWait() //等待,延时 bit readBit() //读取一bit(一位),返回值为一个bit unsigned char readByte() //读取一个字节(Byte),就是读ds18b20一个字节的信息 void writeByte(unsigned char dat) //写一个字节给ds18b20,参数就是要写进的数据 int getTmpValue() //获取温度值,这个会返回一个整型的温度值

崇阳县19326947943: 单片机课程设计 单片机温度的检测与显示的设计 -
百花恒得: 用18b20做很简单啊.温度的子程序给你,,你重定义一下接口,主程序已经调用出温度了,你送到显示就行了../* 延时t毫秒 */ void delay(uint t) { uint i; while(t--) { /* 对于11.0592M时钟,约延时1ms */ for (i=0;i<125;i++) {} } } /* 产生复位脉冲初...

崇阳县19326947943: 你好.我最近做了一个18B20四位数码管显示的温度计,可是结果只能显示4个8 ,你知道怎么回事吗? -
百花恒得: 不是吧,你的数码管确定是共阳或是共阴的要不就是你的显示程序有问题,比如消隐没做好

崇阳县19326947943: 我用18B20和数码管做的一个温度显示,实际硬件数码管不显示温度,PROTEUS仿真可以,而且数码管全部高电平 -
百花恒得: 首先确定你的硬件电路时正确的,其次proteus用的是你机子的CPU,速度比单片机快得多,可能是你的读写时序问题.

崇阳县19326947943: DS18b20测温度用1602显示为什么出现85度 -
百花恒得: 这是DS18B20的问题,DS18B20的温度初始值就是85度,所以在不进行数据更新时会显示85度.仔细阅读数据手册,你能学到很多东西.希望你能成功.

崇阳县19326947943: 18b20测的温度和实际不一样,怎么软件调 -
百花恒得: 可以的,1、如果是线性的差距,直接加或减掉相应的数据即可;2、不是线性的,可以用函数修正,你需要做一个修正函数,比如低端和高端是温度和实际温度差距,最好做出每一度的的差距,然后用函数修正;

崇阳县19326947943: 由ds18b20测得的温度与单片机处理后有什么区别 -
百花恒得: 要看是多少位的了?可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃.转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测 到的数值乘于0.0625即可得到实际温度;例如+125℃的数字输出为07D0H,+25.0625℃的数字输出为0191H.

崇阳县19326947943: 我用单片机做温控风扇,其中显示温度用数码管,检测温度用DS18B20,不知道怎么回事,仿真的时候数码管闪烁 -
百花恒得: 多位数码管的工作原理就是闪烁的,你可能设置的闪烁时间太长了了,查看一下延时吧.

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