51单片机多路DS18B20测温显示并读取序列号

发布者:温雅如风最新更新时间:2019-12-06 来源: 51hei关键字:51单片机  DS18B20  测温显示  读取序列号 手机看文章 扫描二维码
随时随地手机看文章

/*********************************************


功 能:读取序列号并匹配序列号,并读温度值

多功能试验板显示多路温度采集

正常显示2个DS18B20温度

正常读取DS18B20序列号


单片机:STC12C5A60S2

晶 振:11.0592M

作 者:苏义江改编自网络

时 间:2016-8-25

************************************************/

#include  

#include  

#define uchar unsigned char 

#define uint unsigned int 

sbit RS=P2^7; 

sbit RW=P2^6; 

sbit EN=P2^5; 

sbit DQ=P3^4; //传感器引脚 

sbit key=P3^7;

sbit d1=P1^3;//指示灯

sbit d2=P1^4;

bit st=1; 


uchar code table0[]={"DuoLuWenDuXS:U "}; 

uchar code table2[]={"SD: "}; //湿度

uchar code table1[]={"0123456789ABCDEF"}; 

//现有的2个DS18B20传感器的序列号ROM1,ROM2

uchar DSrom[4][8]={//4个器件每个64位序列号

{0x28,0xff,0x2a,0x0A,0x22,0x04,0x00,0xf6},//ROM1 

{0x28,0xFF,0x0b,0x0d,0x20,0x04,0x00,0x0a},//ROM2


{0x28,0x0C,0xBA,0xBA,0x02,0x00,0x00,0x54},//ROM3 

{0x28,0xff,0x91,0x14,0x22,0x04,0x00,0xe4}//ROM4 

};

int f[4]; //温度数组

int tvalue; //温度值变量

float ftvalue; //温度值变量

uchar fCode[8];//序列号数组

uint warnl=300; //设定温度值高

uint warnh=992;//设定温度值低

void ds1820wr(uchar dat);//写数据

void ds1820rst();//ds1820复位

uchar ds1820rd();//读数据 

void DispCode();//读取序列号


uchar tflag;//温度正负标志 


//////////lcd1602程序//////////// 

void delay1ms(uint ms)//延时1毫秒(不够精确的) 

uint i,j; 

for(i=0;ifor(j=0;j<620;j++); 

void wr_com(uchar com)//写指令// 

delay1ms(1); 

RS=0; 

RW=0; 

EN=0; 

P0=com; 

delay1ms(1); 

EN=1; 

delay1ms(1); 

EN=0; 

}

void wr_dat(uchar dat)//写数据// 

delay1ms(1);; 

RS=1; 

RW=0; 

EN=0; 

P0=dat; 

delay1ms(1); 

EN=1; 

delay1ms(1); 

EN=0; 

void lcd_init()//1602初始化设置// 

delay1ms(15); 

wr_com(0x38);

delay1ms(5); 

wr_com(0x08);delay1ms(5); 

wr_com(0x01);delay1ms(5); 

wr_com(0x06);delay1ms(5); 

wr_com(0x0c);delay1ms(5); 


}

void display(uchar *p)//显示字符串 

while(*p!='') 

wr_dat(*p); 

p++; 

delay1ms(1); 

}

void displayinit()//初始化显示 

lcd_init(); 

wr_com(0x80); 

display(table0); 


wr_com(0xC6);

wr_dat(0xdf);

wr_com(0xC7);

wr_dat('C');

wr_com(0xCf);

wr_dat(0x25);

wr_com(0XC9);

display(table2); 

}

void tmstart()//初始化ds18b20 

{

DQ=1; 

d1=1; 

d2=1; 

ds1820rst(); 

delay1ms(1); 

ds1820wr(0xcc); 

ds1820wr(0x44); 

void read_dealtemp()//读取并处理温度 

uchar i,j,t; 

uchar a,b; 

for(j=0;j<5;j++) //挂载4个设备

ds1820rst(); //复位

delay1ms(1); 

ds1820wr(0x55); //匹配EOM指令 

for(i=0;i<8;i++) 

ds1820wr(DSrom[j][i]);//发送64位序列号 

ds1820wr(0xbe);//温度转换 


a=ds1820rd(); //读高位

b=ds1820rd(); //读低位 

tvalue=b; 

tvalue<<=8; 

tvalue=tvalue|a; 

if(tvalue<0) //判断正负温度

d1=1; 

tvalue=~tvalue+1; 

wr_com(0xc0); //第二行第一列 

wr_dat(0x2d); //负温度符号"-"

if(tvalue

d2=0; //报警

DQ=0; 

else 

d2=1; 

DQ=1; 

}

else 

d2=1; 

wr_com(0xc0); 

wr_dat(' '); 

if(tvalue>warnh) //温度高于设定值warnh=992; 

d1=0; //报警

DQ=0; 

else

d1=1; 

DQ=1; 

if(j==0) 

{

wr_com(0x8f); 

wr_dat('1'); 

if(j==1) 

wr_com(0x8f); 

wr_dat('2'); 

if(j==2) 

wr_com(0x8f); 

wr_dat('3'); 

}

if(j==3) 

wr_com(0x8f); 

wr_dat('4'); 

if(j==4) 

wr_com(0x8f); 

wr_dat('5'); 

ftvalue=tvalue*0.0625; 

tvalue=ftvalue*10+0.5;

ftvalue=ftvalue+0.05; //温度补偿 

f[j]=tvalue;//温度扩大十倍,精确到一位小数 

tvalue=f[j]; 

t=tvalue/1000; 

wr_com(0x80+0x41); 

wr_dat(table1[t]);//显示百位 

t=tvalue%1000/100; 

wr_dat(table1[t]);//显示十位 

t=tvalue%100/10; 

wr_dat(table1[t]);//显示个位 

wr_dat(0x2e); //显示小数点儿 

t=tvalue%10/1; 

wr_dat(table1[t]);//显示小数位

delay1ms(5000); 

}

void keyscan()//按键

{

if(key==0)

{

delay1ms(30);

if(key==0)

{

st=~st;

}

while(!key);

}

}

void main() 

d1=1; 

d2=1; 

DQ=1; 

displayinit();//初始化显示 

while(1) 

keyscan();//按住按键等4个器件循环完毕显示序列号

if(st==1) 

wr_com(0x01);

displayinit();//初始化显示

tmstart();//初始化 

read_dealtemp();//读取温度 

else

{

wr_com(0x01);

keyscan();//按住按键等4个器件循环完毕显示序列号

DispCode();//读取序列号

delay1ms(1000); 

}

////////DS18B20函数///////////////

void delay_b20(uint n)//STC12C5A单片机定时1us

while(n--)

{

_nop_();


}


}


void ds1820rst()/*ds1820复位*/ 

uchar x=0; 

DQ = 1; //DQ复位 

delay_b20(1); //延时 

DQ = 0; //DQ拉低 

delay_b20(500); //精确延时大于480us 

DQ = 1; //拉高 

delay_b20(80); 


uchar ds1820rd()/*读数据*/ 

uchar i=0; 

uchar dat = 0;

for (i=0;i<8;i++) 

DQ = 1; //给脉冲信号

delay_b20(1);

DQ = 0; //给脉冲信号 

delay_b20(1); 

dat>>=1; 

DQ = 1; //给脉冲信号 

if(DQ) 

dat|=0x80; 

delay_b20(60); 

return(dat); 


void ds1820wr(uchar dat)/*写数据*/ 

uchar i=0; 

for (i=0; i<8; i++) 

DQ = 1; 

delay_b20(1);

DQ = 0; 

DQ = dat&0x01; 

delay_b20(60); 

DQ = 1; 

delay_b20(60); 

dat>>=1; 

delay_b20(1); 

///////////读取序列号//////////

void DispCode()//读取序列号 

uchar i,temp; 

ds1820rst(); 

ds1820wr(0x33); 

for (i=0;i<8;i++) 

{

fCode[i]=ds1820rd(); 

wr_com(0x80+0x40); 

for (i=0;i<8;i++) 

temp = fCode[i]>>4; //显示高四位 

if (temp<10) 

wr_dat(temp + 0x30); // 显示数字 

else 

wr_dat(temp + 0x37); //否则大于数字9显示字母

temp = fCode[i]&0x0f;//显示低四位 

if (temp<10) 

wr_dat(temp+ 0x30); 

else 

wr_dat(temp + 0x37); 

}


S0X483GL@VJDG}U_A@B0LBK.jpg

关键字:51单片机  DS18B20  测温显示  读取序列号 引用地址:51单片机多路DS18B20测温显示并读取序列号

上一篇:51单片机之4位数加法计算器的设计报告
下一篇:51单片机控制DHT11在1602上显示温湿度的程序

推荐阅读最新更新时间:2024-11-17 15:35

keil5安装及51单片机入门程序实例
1. keil5的安装 之前我在找的时候,一直以为官网不是很方便下载,在其他地方找,这过程很玛法,今天试了一下官网发现非常方便. 进入官网,点击Downloads 点击C51,以为我们是写51的单片机嘛,当然也可以下载其他的。 然后填写一下信息,非常方便的,而且很快,然后submit就ok了 在安装好了之后,需要我们破解,这里我们需要下载一个软件,在网上可以很方便地找到,这个很方便,就不啰嗦了。 现在打开keli5,点击project,创建新项目 7. 然后就是选择文件夹了,之后找到AT89C51即可 8. 然后点击添加文件 9. 之后就是选择文件类型,和定义文件名了 完了之后就可以开始写程序啦。
[单片机]
keil5安装及<font color='red'>51单片机</font>入门程序实例
PIC16F877A 温度DS18B20
#include pic.h #define uchar unsigned char #define uint unsigned int #define rs_h (PORTC|=0x01) #define rs_l (PORTC&=0xfe) #define rs_o (TRISC&=0xfe) #define rw_h (PORTC|=0x02) #define rw_l (PORTC&=0xfd) #define rw_o (TRISC&=0xfd) #define en_h (PORTC|=0x04) #define en_l (PORTC&=0xfb) #define en_
[单片机]
51单片机和FIFO的接口和操作
下面的程序中,单片机将FIFO中的数据读取出来后,从串口发送出去。 ;*********************************** ef bit p3.3 ;fifo empty flag rst bit p3.5 ;reset fifo read bit p3.7 ;read fifo org 0000h ljmp main org 0030h main: ;------ initial timer mov tmod,#00100001b ;timer0 mode 1 (16 bit) ;time
[单片机]
51单片机温控风扇制作 数码管显示 Proteus仿真程序
仿真原理图如下 制作出来的实物图如下: 单片机源程序如下: #include reg52.h //调用单片机头文件 #define uchar unsigned char //无符号字符型 宏定义 变量范围0~255 #define uint unsigned int //无符号整型 宏定义 变量范围0~65535 //数码管段选定义 0 1 2 3 4 5 6 7 8 9 uchar code smg_du ={0x28,0xee,0x42,0x72,0xe5,0xa8,0x41,0x77,0x20,0xa0,
[单片机]
<font color='red'>51单片机</font>温控风扇制作 数码管<font color='red'>显示</font> Proteus仿真程序
14-基于51单片机的声音分贝测量与显示仿真
具体实现功能: 1、模拟仿真声音采集及处理电路; 2、LCD1602实时显示噪声分贝值,精度为0.1db; 3、分贝显示范围为0-100db。 单片机介绍 51单片是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具有以下标准功能:8k字节Flash,512字节RAM,32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC89X51 可降
[单片机]
14-基于<font color='red'>51单片机</font>的声音分贝测量与<font color='red'>显示</font>仿真
51单片机串行通信的原理解析
51单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。 与之前一样,首先我们来了解单片机串口相关的寄存器。 SBUF 寄存器:它是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据,可通过指令对SBUF 的读写来区别是对接收缓冲器的操作还是对发送缓冲器的操作。从而控制外部两条独立的收发信号线RXD(P3.0)、TXD(P3.1),同时发送、接收数据,实现
[单片机]
<font color='red'>51单片机</font>串行通信的原理解析
Proteus仿真51单片机C语言程序实例-开关控制报警器
简介:51单片机C语言程序实例-开关控制报警器(用K1开关控制报警器,程序控制P1.0输出两种不同频率的声音,模拟很逼真的报警效果)。
[单片机]
Proteus仿真<font color='red'>51单片机</font>C语言程序实例-开关控制报警器
DS18B20和AT89C2051的家用温度测量器设计
         一、设计概况   本制作采用USB口作为供电端口,用DS18B20温度传感器进行温度信息采集,用AT89C2051单片机进行控制,采用四位共阳数码管显示,从而实现对温度的测量显示(系统框图如图1所示)。本设计可培养学生对单片机学习的兴趣,提高其制作与编程能力。   图1 系统框图    二、电路原理   采用PROteUS仿真软件进行原理图设计与程序仿真。电路如图2所示。 图2 电路图   1、电源   采用USB口供电,可将USB适配器接人电路板的USB口或直接接计算机USB口。这样,既节省了资源,又能够获得较为理想的工作电压。USB口的外形及电源口定义如图3所示。
[电源管理]
<font color='red'>DS18B20</font>和AT89C2051的家用温度测量器设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved