DS18B单片机多路温度传感器.docx

上传人:b****5 文档编号:11655477 上传时间:2023-03-29 格式:DOCX 页数:13 大小:230.14KB
下载 相关 举报
DS18B单片机多路温度传感器.docx_第1页
第1页 / 共13页
DS18B单片机多路温度传感器.docx_第2页
第2页 / 共13页
DS18B单片机多路温度传感器.docx_第3页
第3页 / 共13页
DS18B单片机多路温度传感器.docx_第4页
第4页 / 共13页
DS18B单片机多路温度传感器.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

DS18B单片机多路温度传感器.docx

《DS18B单片机多路温度传感器.docx》由会员分享,可在线阅读,更多相关《DS18B单片机多路温度传感器.docx(13页珍藏版)》请在冰豆网上搜索。

DS18B单片机多路温度传感器.docx

DS18B单片机多路温度传感器

DS18B2051单片机多路温度传感器

部门:

xxx

时间:

xxx

制作人:

xxx

 

整理范文,仅供参考,可下载自行修改

51单片机C程序

#include

#include

#defineucharunsignedchar

sbitRS=P3^5。

//定义LCD端口

sbitRW=P3^6。

sbitE=P3^7。

sbitDQ=P3^4。

//定义单总线端口

ucharLCD_3,LCD_2,LCD_1,LCD_0。

uchards18b20_romA[8]={0x8e,0x00,0x00,0x00,0xb8,0xc5,0x30,0x28}。

b5E2RGbCAP

//四个DS18B20的64位ROM地址

uchards18b20_romB[8]={0x52,0x00,0x00,0x00,0xb8,0xc5,0x34,0x28}。

p1EanqFDPw

uchards18b20_romC[8]={0x65,0x00,0x00,0x00,0xb8,0xc5,0x35,0x28}。

DXDiTa9E3d

uchards18b20_romD[8]={0x3c,0x00,0x00,0x00,0xb8,0xc5,0x36,0x28}。

RTCrpUDGiT

ucharcodeLCDData[]="0123456789"。

ucharcodedot_tab[]="0112334456678899"。

ucharfirst_line[16]="A:

000.0B:

000.0"。

//LCD第一行显示缓存数组5PCzVD7HxA

ucharsecond_line[16]="C:

000.0D:

000.0"。

//LCD第二行显示缓存数组jLBHrnAILg

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

//延时程序

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

voiddelay(unsignedintN>

{

unsignedinti。

for(i=0。

i

i++>。

}

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

//LCD1602测忙

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

voidcheck_busy(void>

{

while(1>

{

P1=0xff。

E=0。

_nop_(>。

RS=0。

_nop_(>。

_nop_(>。

RW=1。

_nop_(>。

_nop_(>。

E=1。

_nop_(>。

_nop_(>。

_nop_(>。

_nop_(>。

if((P1&0x80>==0>

{

break。

}

E=0。

}

}

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

//LCD1602写命令

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

voidwrite_command(uchartempdata>

{

E=0。

_nop_(>。

_nop_(>。

RS=0。

_nop_(>。

_nop_(>。

RW=0。

P1=tempdata。

_nop_(>。

_nop_(>。

E=1。

_nop_(>。

_nop_(>。

E=0。

_nop_(>。

check_busy(>。

}

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

//LCD1602写数据

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

voidwrite_data(uchartempdata>

{

E=0。

_nop_(>。

_nop_(>。

RS=1。

_nop_(>。

_nop_(>。

RW=0。

P1=tempdata。

_nop_(>。

_nop_(>。

E=1。

_nop_(>。

_nop_(>。

E=0。

_nop_(>。

check_busy(>。

}

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

//初始化LCD1602

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

voidinit_lcd1602(>

{

write_command(0x01>。

//清除屏幕

write_command(0x38>。

//功能设定<8位,2行,5*7点阵式)

write_command(0x0c>。

//显示器ON,光标OFF,闪烁OFF

write_command(0x06>。

//地址加1

}

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

//初始化ds18b20

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

bitresetpulse(void>

{

DQ=0。

delay(40>。

//延时500us

DQ=1。

delay(4>。

//延时60us

return(DQ>。

//读取P1.0的状态

}

voidds18b20_init(void>

{

while(1>

{

if(!

resetpulse(>>//收到ds18b20的应答信号

{

DQ=1。

delay(40>。

//延时240us

break。

}

else

resetpulse(>。

//否则再发复位信号

}

}

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

//读ds18b20一位

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

ucharread_bit(void>

{

DQ=0。

_nop_(>。

_nop_(>。

DQ=1。

delay(2>。

return(DQ>。

}

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

//读ds18b20一个字节

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

ucharread_byte(void>

{

uchari,m,receive_data。

m=1。

receive_data=0。

for(i=0。

i<8。

i++>

{

if(read_bit(>>

{

receive_data=receive_data+(m<

}

delay(7>。

}

return(receive_data>。

}

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

//向ds18b20写一位

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

voidwrite_bit(ucharbitval>

{

DQ=0。

if(bitval==1>

DQ=1。

delay(5>。

DQ=1。

}

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

//向DS18B20写一个字节命令

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

voidwrite_byte(ucharval>

{

uchari,temp。

for(i=0。

i<8。

i++>

{

temp=val>>i。

temp=temp&0x01。

write_bit(temp>。

delay(5>。

}

}

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

//64位的ROM序列号匹配

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

bitmatch_rom(uchar*rom>

{

uchari。

ds18b20_init(>。

write_byte(0x55>。

for(i=8。

i>0。

i-->

{

write_byte(*(rom+i-1>>。

}

return1。

}

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

//从ds18b20中读出64位序列号

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

/*uchar*read_rom(void>

{

ucharrom[8],i。

ds18b20_init(>。

write_byte(0x33>。

for(i=8。

i>0。

i-->

{

rom[i-1]=read_byte(>。

}

return&rom[0]。

}*/

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

//将64位序列号显示在LCD上显示出来

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

/*voidprint_char(uchara>

{

if(a>=0&&a<=9>

write_data(a+0x30>。

elseif(a>=0x0a&&a<=0x0f>

write_data(a+0x37>。

}*/

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

//温度转换,将从ds18b20中读出来的温度值

//转化成十进制的温度值,并存放显示缓存

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

voidconvert_T(uchartemp_data_h,uchartemp_data_l>xHAQX74J0X

{

uchartemp。

if((temp_data_h&0xf0>==0xf0>//如果温度寄存器里的高位为1,

{//则温度为负

temp_data_l=~temp_data_l。

//负温度将补码转成二进制,

if(temp_data_l==0xff>//取反再加1

{

temp_data_l=temp_data_l+0x01。

temp_data_h=~temp_data_h。

temp_data_h=temp_data_h+0x01。

}

else

{

temp_data_l=temp_data_l+0x01。

temp_data_h=~temp_data_h。

}

LCD_0=dot_tab[temp_data_l&0x0f]。

//查表得小数位的值

temp=((temp_data_l&0xf0>>>4>|((temp_data_h&0x0f><<4>。

LDAYtRyKfE

LCD_3='-'。

//显示"-"号

LCD_2=LCDData[(temp%100>/10]。

//查表得负温度温度十位

LCD_1=LCDData[(temp%100>%10]。

//查表得负温度个位

}

else//温度为正

{

LCD_0=dot_tab[temp_data_l&0x0f]。

//查表得小数位的值

temp=((temp_data_l&0xf0>>>4>|((temp_data_h&0x0f><<4>。

Zzz6ZB2Ltk

LCD_3=LCDData[temp/100]。

//查表得温度百位

LCD_2=LCDData[(temp%100>/10]。

//查表得温度十位

LCD_1=LCDData[(temp%100>%10]。

//查表得温度个位

}

}

voiddisplay(void>

{

uchari。

write_command(0x80>。

for(i=0。

i<16。

i++>

{

write_data(first_line[i]>。

}

write_command(0xc0>。

for(i=0。

i<16。

i++>

{

write_data(second_line[i]>。

}

}

voidmain(void>

{

uchartemp_data_l,temp_data_h。

/*uchar*ds18b20_rom。

*/

init_lcd1602(>。

/*while(1>

{

uchari。

ds18b20_rom=read_rom(>。

//读序列号

write_command(0x80>。

for(i=0。

i<8。

i++>

{

ds18b20_romA[i]=*ds18b20_rom。

ds18b20_rom++。

}

write_command(0x80>。

for(i=0。

i<8。

i++>//显示序列号

{

print_char(ds18b20_romA[i]/16>。

print_char(ds18b20_romA[i]%16>。

}

}*/

while(1>

{

ds18b20_init(>。

write_byte(0xcc>。

write_byte(0x44>。

//启动温度转换

delay(700>。

match_rom(ds18b20_romA>。

//匹配第一路

write_byte(0xbe>。

//读温度

temp_data_l=read_byte(>。

//温度低8位

temp_data_h=read_byte(>。

//温度高8位

convert_T(temp_data_h,temp_data_l>。

first_line[2]=LCD_3。

//温度转换后的各位

first_line[3]=LCD_2。

//分别存入显示缓存数组中

first_line[4]=LCD_1。

first_line[6]=LCD_0。

match_rom(ds18b20_romB>。

//匹配第二路

write_byte(0xbe>。

//读温度

temp_data_l=read_byte(>。

//温度低8位

temp_data_h=read_byte(>。

//温度高8位

convert_T(temp_data_h,temp_data_l>。

first_line[10]=LCD_3。

//温度转换后的各位

first_line[11]=LCD_2。

//分别存入显示缓存数组中

first_line[12]=LCD_1。

first_line[14]=LCD_0。

display(>。

match_rom(ds18b20_romC>。

//匹配第三路

write_byte(0xbe>。

//读温度

temp_data_l=read_byte(>。

//温度低8位

temp_data_h=read_byte(>。

//温度高8位

convert_T(temp_data_h,temp_data_l>。

second_line[2]=LCD_3。

//温度转换后的各位

second_line[3]=LCD_2。

//分别存入显示缓存数组中

second_line[4]=LCD_1。

second_line[6]=LCD_0。

match_rom(ds18b20_romD>。

//匹配第四路

write_byte(0xbe>。

//读温度

temp_data_l=read_byte(>。

//温度低8位

temp_data_h=read_byte(>。

//温度高8位

convert_T(temp_data_h,temp_data_l>。

second_line[10]=LCD_3。

//温度转换后的各位

second_line[11]=LCD_2。

//分别存入显示缓存数组中

second_line[12]=LCD_1。

second_line[14]=LCD_0。

display(>。

}

}

展开阅读全文
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1