DS18B单片机多路温度传感器.docx
- 文档编号:7985174
- 上传时间:2023-05-12
- 格式:DOCX
- 页数:13
- 大小:230.14KB
DS18B单片机多路温度传感器.docx
《DS18B单片机多路温度传感器.docx》由会员分享,可在线阅读,更多相关《DS18B单片机多路温度传感器.docx(13页珍藏版)》请在冰点文库上搜索。
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(>。 } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DS18B 单片机 温度传感器