最新DS18B20与51单片机多路温度传感器.docx
- 文档编号:10447292
- 上传时间:2023-02-11
- 格式:DOCX
- 页数:15
- 大小:29.21KB
最新DS18B20与51单片机多路温度传感器.docx
《最新DS18B20与51单片机多路温度传感器.docx》由会员分享,可在线阅读,更多相关《最新DS18B20与51单片机多路温度传感器.docx(15页珍藏版)》请在冰豆网上搜索。
最新DS18B20与51单片机多路温度传感器
DS18B20与51单片机多路温度传感器
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};
//四个DS18B20的64位ROM地址
uchards18b20_romB[8]={0x52,0x00,0x00,0x00,0xb8,0xc5,0x34,0x28};
uchards18b20_romC[8]={0x65,0x00,0x00,0x00,0xb8,0xc5,0x35,0x28};
uchards18b20_romD[8]={0x3c,0x00,0x00,0x00,0xb8,0xc5,0x36,0x28};
ucharcodeLCDData[]="0123456789";
ucharcodedot_tab[]="0112334456678899";
ucharfirst_line[16]="A:
000.0B:
000.0";//LCD第一行显示缓存数组
ucharsecond_line[16]="C:
000.0D:
000.0";//LCD第二行显示缓存数组
//************************************
//延时程序
//************************************
voiddelay(unsignedintN)
{
unsignedinti;
for(i=0;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) { 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); 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); 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文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 DS18B20 51 单片机 温度传感器
![提示](https://static.bdocx.com/images/bang_tan.gif)