急救!!基于AT89C51单片机的多路DS18b20测温显示系统的所有相关资料

作者&投稿:湛追 (若有异议请与网页底部的电邮联系)
求:基于AT89C51单片机的多路DS18B20测温显示~

我的毕设也用的18b20,可是使用stm32做mcu的。下面是我之前找的一段代码,你可以参考下。
#include
#include //声明_nop_() 便于实现延时

#define DS18B20 P1_0
unsigned char xdata LEDSEG _at_ 0xfeff; //P2.0
unsigned char xdata LEDBIT _at_ 0xfdff; //P2.1
unsigned char code LEDMAP[] =
{
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d,
0x07, 0x7f, 0x6f, 0x00, 0x79, 0x46, 0x40,
// 灭 "E" "+" "-"
};
bit DS18B20_FLG = 0; //“1”:DS18B20存在 ;“0”:不存在
unsigned char LEDBuf[4];

void delay(unsigned int i);//延时
display();

//DS18B20温度采集子程序////////////////////////////DS18B20温度采集子程序///////////////////////DS18B20温度采集子程序/////
unsigned char Init_DS18B20(void);
unsigned char Read_DS18B20(void); //读DS18B20一个字节
Write_DS18B20(unsigned char d); //写一个字节
unsigned int TurnTemp(unsigned int temp); //温度返回值被放大100倍
startTempTrans(void); //启动温度转换
int ReadTemp(void); //读取温度
//////////////


//主函数//////////////////////////////////////////////主函数/////////////////////////////////////主函数/////////////////////
void main()
{
unsigned char i;
unsigned int t =0;
while(1)
{
t = ReadTemp();//步骤3:读取温度
startTempTrans(); //步骤1:启动温度转换


LEDBuf[3] = 12; //显示“+”
LEDBuf[2] = t/1000; //显示温度的十位
LEDBuf[1] = (t/100)%10; //显示温度的个位
LEDBuf[0] = (t/10)%10; //显示温度的小数位


for(i = 0; i < 200; i++) //步骤2:等待温度转换完成(必须大于500ms)
{
display();
}
}
}
///////////////////////////////
//延时
void delay(unsigned int i)
{
while(i--);
}

//显示子函数
display()
{
unsigned char i;
unsigned char outbit;
outbit = 0x01; // 从右边开始显示
for (i = 0; i < 4; i++)
{
LEDBIT = 0x00; // 关所有LED
LEDSEG = LEDMAP[LEDBuf[i]];
LEDBIT = outbit;
delay(100);
outbit <<= 1; // 显示下一位
}
}

//DS18B20温度采集子程序////////////////////////////DS18B20温度采集子程序///////////////////////DS18B20温度采集子程序/////
//通信协议之初始化
//初始化DS18B20步骤:
// 1)总线拉低,并延时480us-960us
// 2)总线拉高,等待回应,如DS18B20为“0”则初始化成功,
// 如等待60us仍无回应,则DS18B20不存在
unsigned char Init_DS18B20(void)
{
bit re = 0;
unsigned char temp = 30;
DS18B20 = 1;
_nop_(); //无需精确
_nop_();
DS18B20 = 0; //拉低
delay(80); // ★务必在480us-960us之间
DS18B20 = 1; //拉高总线
delay(1);//无需精确
while(temp--)//等待60us以上
{
re = DS18B20; //如果re=0则初始化成功
if(0 == re)
{
DS18B20_FLG = 1;
delay(20); //无需精确
return(0);
}
}
return(0xff);
}

//读DS18B20一个字节
unsigned char Read_DS18B20(void)
{
unsigned char i = 0;
unsigned char d = 0;
for (i=8;i>0;i--)
{
DS18B20 = 0; // 给脉冲信号
d >>= 1;
_nop_();
DS18B20 = 1; // 给脉冲信号
_nop_(); //需延时10us-14us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
if(DS18B20 == 1)
{
d = d | 0x80;
}
delay(10); //需延时60us以上
}
delay(10);
return(d);
}

//写一个字节
Write_DS18B20(unsigned char d)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DS18B20 = 1;
_nop_();
_nop_();
DS18B20 = 0;
_nop_();//需延时15us-60us
_nop_();
_nop_();
_nop_();// ?奇怪:当此处延时超过30us时,会出错
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
DS18B20 = d & 0x01;
delay(7); //需延时60us-120us
d >>= 1;
}
DS18B20 = 1;
delay(7);
}

//温度返回值被放大100倍
unsigned int TurnTemp(unsigned int temp)
{
int t;
if(temp > 32768) //当读取的温度为负时
{
t = 0;
}
else //当读取的温度为正时
{
t = temp * 25 / 4;
}
return(t);
}
//启动温度转换
startTempTrans(void)
{
DS18B20_FLG = 0;
DS18B20_FLG = Init_DS18B20(); //步骤1):初始化
if(DS18B20_FLG)//如果没有检测到DS18B20返回
return(0);
Write_DS18B20(0xCC); //步骤2):跳过读序号操作(单个DS18B20适用)
Write_DS18B20(0x44); //步骤3):启动温度转换
}
//读取温度
int ReadTemp(void)
{
unsigned char tempLowChar = 0;
unsigned char tempHighChar = 0;
unsigned int tempInt = 0;
int temp = 0;

DS18B20_FLG = 0;
DS18B20_FLG = Init_DS18B20();//步骤1):初始化
if(DS18B20_FLG)//如果没有检测到DS18B20返回
return(0);
Write_DS18B20(0xCC); //步骤2):跳过读序号操作(单个DS18B20适用)

Write_DS18B20(0xBE); //步骤3):读取温度寄存器设置(共可读9个寄存器,前两个就是温度)
tempLowChar = Read_DS18B20();//步骤3):读取温度数据低8位
tempHighChar = Read_DS18B20();//步骤3):读取温度数据高4位
tempInt = tempHighChar;
tempInt <<= 8;
tempInt = tempInt | tempLowChar;
temp = TurnTemp(tempInt);
return(temp);
}
//////////////

已发送

传感器DS18B20具有体积更小、精度更高、适用电压更宽、采用一线总线、可组网等优点,在实际应用中取得了良好的测温效果[7]。
美国Dallas半导体公司的数字化温度传感器DS1820是世界上第一片支持 “一线总线”接口的温度传感器,在其内部使用了在板(ON-B0ARD)专利技术。全部传感元件及转换电路集成在形如一只三极管的集成电路内。“一线总线”独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。现在,新一代的DS18B20体积更小、更经济、更灵活。使你可以充分发挥“一线总线”的优点。 同DS1820一样,DS18B20也支持“一线总线”接口,测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。与前一代产品不同,新的产品支持3V~5.5V的电压范围,使系统设计更灵活、方便。而且新一代产品更便宜,体积更小[8]。
1. DS18B20的特性 [9]
(1)适应电压范围更宽,电压范围:3.0~5.5V,寄生电源方式下可由数据线供。
(2)独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
(3)DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温。
(4)DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内。
(5)温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃。
(6)可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温。
(7)在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快。
(8)测量结果直接输出数字温度信号,以“一线总线”串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力。
(9)负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
2.DS18B20内部结构及DS18B20的管脚排列
64位光刻ROM是出厂前被光刻好的,它可以看作是该DS18B20的地址序列号。不同的器件地址序列号不同。DS18B20内部结构主要由四部分组成:64位光刻ROM,温度传感器,非挥发的温度报警触发器TH和TL,高速暂存器。
DS18B20的引脚定义:
(1)DQ为数字信号输入/输出端
(2)GND为电源地
(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)

我来帮你搞搞!

老难了,学单片机时都蒙混过去了,老师也是不负责任呢。还是愿自己。好好看书吧。


求救!!AT89C32 性质
具有4K\/8K Bytes可重复规划的快闪记忆体(Reprogrammable Flash Memory),可写入\/抹除1000次以上,程式可保存10年以上。操作频率:0MHz~24MHz(AT89C55为高速可达33MHz)。操作电压:5V 。AT89C51 具有两层优先权的5个中断向量结构,AT89C52\/55具两层优先权的6个中断向量结构。三个可规划的记忆体上锁位元。

江湖急救!请电子专业英语高手帮忙翻译
The first part with the AT89 S51 single slice machine for foundation, related a single slice of the machine and PC machine the principle, technique for corresponding by letter and connect a people's electric circuit in detail.Make use of 89 S51s and PC on board the string had ...

at89c51延时控制的问题,救命的!~~
void delay_1ms(uinit miaoshu) \/\/ 次数是回传秒数的 { unsigned char i,j;for(i=0;i<miaoshu*1000;i++)for(j=0;j<110;j++);} 程序中 if(K2==0) \/\/防护门开关关闭 { L2=1; \/\/迷道内照明灯亮,延时15秒 L3=0; \/\/辐照场照明熄灭 Sound1=1; \/\/警铃报警 15秒...

我看到大侠有类似《病房点滴输液监控系统的设计》论文?
文章针对目前现代医院液体点滴自动化装置的各种缺陷和不足,设计一种智能输液监控系统,采用AT89C58单片机作为主从机的核心,利用MAX232进行远程数据信息的传输,构成了一个分布式的主从局域控制网,采用光电传感原理实现对液体点滴速度的测量和检测,用步进电动机拖动控制储液瓶的高度,实现点滴速度的自动调节,并把...

小弟跪求:单片机设计:用ADC0832调节频率输出,最好是C语言写的,有哪位...
sbit P10=P1^0;void main(){ EA=1;ET1=1;TR0=1;TMOD=01;TH0=65536-2000\/256;TL0=65536-2000%256;while(1){ P10=~P10;} } void NT1() interrupt 3 { TH0=65536-2000\/256;TL0=65536-2000%256;} 以下程序是0832产生的三种波形 三角波 锯齿波 方波 include <AT89X51.H> include<...

求一个计算机毕业论文题目。
基于Atmel89系列芯片串行编程器设计 286. 基于单片机的实时时钟 287. 基于MCS-51通用开发平台设计 288. 基于MP3格式的单片机音乐播放系统 289. 基于单片机的IC卡智能水表控制系统设计 290. 基于MATLAB的FIR数字滤波器设计 291. 单片机水温控制系统 292. 110kV区域降压变电所电气系统的设计 293. ATMEIL AT89系列通用...

救急!请问单片机C语言IO口如何定义啊
首先要有这个头文件: #include <AT89X52.H> \/\/根据你用的单片机类型而定 这个头文件已经有了端口的定义,不过用的时候不能写 P1.1,而应该是P1_1(注意:P要大写)如果要自己重新定义的话:打开这个头文件,修改就行了(里面的内容很简单的,一看就可以明白它是怎样定义的)也可以调用头...

六位数码管时钟
16.基于单片机的电子密码锁 17.单片机控制交通灯系统设计 18.基于DSP的IIR数字低通滤波器的设计与实现 19.智能抢答器设计 20.基于LabVIEW的PC机与单片机串口通信 21.DSP设计的IIR数字高通滤波器 22.单片机数字钟设计 23.自动起闭光控窗帘毕业设计论文 24.三容液位远程测控系统毕业论文 25.基于Matlab的PWM...

C51 无法通过编译 MAIN.C(89): error C141: syntax error near...
include "DS12887.h"#include "LCD1602display.h"#include <at89x52.h>#define uchar unsigned charuchar s1num = 0;void keyscan() { uchar test; P3 = 0xff; if (P3 != 0xff) { delayms(5); if (P3 != 0xff) { test = P3; while (P3 != 0xff) ;...

魔兽世界出错误快救救我吧
你这个问题我遇到过,就是文件丢失、损坏。请运行 wow目录下的repair.exe 他会自动扫描wow文件系统,并对缺损文件进行修复 但是其实真正的原因还是由于磁盘造成,wow的小范围磁盘IO很频繁,最好在修复之后马上进行 wow的安装目录所在磁盘进行“磁盘碎片整理”希望我的回答对你有所帮助 ...

单县19475987776: 急求基于单片机AT89C51的数字温度报警器,具有上下限的在 - 20度到70度之间的汇编程序或C语言程序!拜托 -
堂怎欧敏: ;单片机DS18B20温度计C语言程序 #include<reg51.h>#include<intrins.h>#include <math.H> //要用到取绝对值函数abs() //通过DS18B20测试当前环境温度, 并通过数码管显示当前温度值, 目前显示范围: -55~ +125度sbit wela = P2^7...

单县19475987776: 急需基于单片机AT89C51制作的频率计原理图! -
堂怎欧敏: 将输入的信号处理成数字信号,然后接到单片机的INT0或者IN1就可以了.假如输入的频率信号是标准的信号可以直接接进去.

单县19475987776: 急求:基于AT89C51单片机 的循环灯,要求:顺序点亮一组彩灯并循环的汇编程序,希望高手能来帮帮忙,谢谢啦
堂怎欧敏: ORG 0000H MOV P1,#0FFH MOV P0,#0FFH LOOP: MOV A,#0FFH ANL A,P1 MOV P0,A LCALL DEL500MS SJMP LOOP DEL500MS:MOV R1,#4 DEL1: MOV R2,#00H DEL: MOV R3,#00H DJNZ R3,$ DJNZ R2,DEL DJNZ R1,DEL1 RET END

单县19475987776: 急求基于AT89C51的LCD1602功率实时显示程序,满意追加5分 -
堂怎欧敏: 1602不能显示汉字,如果一定要显示就只能用自定义字符的方法也是显示很简单的汉字,要的话也只能是1602驱动,其他的呢得根据情况自己修改.感觉有点像做电能质量检测方面的设计,这种设计程序很简单.注意软件滤波就好和AD精确度的问题

单县19475987776: 基于AT89C51单片机的电子万年历设计,能够显示日期,时间,温度湿度,最好是闹钟.急急急,求大神指点 -
堂怎欧敏: 单片机读取时钟芯片和温湿度传感器的数据,然后在1602上面做显示.下载DS1302和LCD1602的数据手册,看看工作时序和寄存器就行了.

单县19475987776: 想问用at89c51做的报警电路如下图硬件能实现吗不行请给出可行法案,如有软件请一起传上来谢谢急救 -
堂怎欧敏: 你用的三极管最好用PNP管,因为单片机IO口高电平驱动能努力非常弱,当然你也可以在三极管B极接一个5K的上拉电阻也可以.

单县19475987776: 基于AT89C51单片机的数字电压表的设计,不能使用AD转换芯片,AD转换电路只能自己搭. -
堂怎欧敏: 设一系列的参考电压,用比较器采样电压比较,然后通过优先编码器选择送给单片机.《电子技术基础数字部分》康华光-第五版--P448

单县19475987776: 基于AT89C51单片机的温度报警系统,测量温度0~100℃,可调节上下限,超限报警
堂怎欧敏: 硬件方面,你的电路应该采用扫描方式显示,这样段输出需要很大的电流,单片机IO恐怕不能直接驱动,建议P2.0-P2.3后加三极管驱动.这时候如果软件没有问题的话,才能点亮LED.下限在负值的时候SPEAKER应该是软件做负值比较的时候有问题.要注意你用的编程语言的负值的表达方式.

单县19475987776: 我下个星期要求做一个基于AT89C51系列的单片机的数字频率计设计,希望大家帮帮忙 -
堂怎欧敏: 数字频率计单片机部分其实是好做得,无非就是用测频法(两个定时器配合,一个定时,一个计数)对付高频信号,用测周法对付低频信号(一个外部中断+一个定时器),程序量虽然有点,不过用C语言的话,也就是500行里面的事.最难的地...

单县19475987776: 基于单片机AT89c51的数字PID控制直流电机PWM调速系统C语言程序
堂怎欧敏:首先弄清楚PID是一种控制算法!!! 1,“如果用单片机恒温可以使温度到达预定值就停止加热,低了就加热,用一个温度传感器反馈,这样算是一个自动控制吗”你这是控制系统,但是效果会非常差,尤其是对于温度控制这种大惯性系统,达...

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