资讯详情

DS18B20读写程序

#include<reg51.h> //包含单片机寄存器的头文件 #include<intrins.h> //包含_nop_()函数定义的头文件 #define uchar unsigned char #define uint unsigned int sbit date=P3^7; unsigned char code table[]={0x3f, 0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79, 0x71,0x80,0xc0}; uchar falg; uint c,temp; void delay(uint z)//延时4微秒 { while(z--); } void reset() { date=1; delay(1); date=0; delay(80); date=1; delay(8); if(date==0) P2=0xfe;//灯1亮,DS18B20应答低电平有效 else P2=0xfc;//灯1,2亮,DS18B20未应答低电平 delay(20); if(date==1) P2=0x7e;//灯1,8亮,DS18B20复位成功 else P2=0x00;//灯全亮,DS18B20未释放总线,复位不成功 } void write_byte(uchar dat)//写入一个字节 { uchar i; for(i=1;i<=8;i++) { date=0; date=dat&0x01; delay(4); dat=dat>>1; date=1; delay(1); } } uchar read_byte()//读一个字节 { uchar dat; uchar i; for(i=0;i<8;i++) { date=0; dat=dat>>1; date=1; if(date)//采数据1 dat=dat|0x80; delay(4); } return(dat); } uint read_wendu()//读温度 { uchar a,b; reset();//复位 delay(1); write_byte(0xcc);//跳过序列号命令 write_byte(0x44);//启动温度检测 delay(350); reset(); // delay(1); write_byte(0xcc);//跳过序列号命令 write_byte(0xbe);//发送读取命令 a=read_byte();//读低8位 b=read_byte();//读高8位 temp=((b|0xff00)<<8)|a;//合并成16位数 if ((b&0xf0)==0xf0)//判断正负 { temp=~temp+1; falg=1; } else falg=0; c=(temp&0x000f)*0.0625*10000;//提取4位小数 temp=temp>>4;//移出小数部分,得到整数温度值 return(temp); } void display()//显示 { uchar bai,shi,ge,n1,n2,n3,n4; bai=temp/100; shi=temp0/10; ge=temp; n1=c/1000; n2=c00/100; n3=c0/10; n4=c; P0=table[bai]; if(bai==0) { P1=0xff; } else { P1=0xfe; delay(200); P1=0xff; } P0=table[shi]; if(bai==0) { if(shi==0) //最高位是0,次高位也是0则不显示 P1=0xff; else //最高位是0,次高位不是0则显示次高位 { P1=0xfd; delay(200); P1=0xff; } } else //最高位不是0,次高位全显 { P1=0xfd; delay(200); P1=0xff; } P0=table[ge]; P1=0xfb; delay(200); P1=0xff; if(falg==1)// 显示负号 { P0=table[17]; P1=0xf7; delay(200); P1=0xff; } else { P0=table[16]; P1=0xf7; delay(200); P1=0xff; } P0=table[n1]; P1=0xef; delay(200); P1=0xff; P0=table[n2]; P1=0xdf; delay(200); P1=0xff; P0=table[n3]; P1=0xbf; delay(200); P1=0xff; P0=table[n4]; P1=0x7f; delay(200); P1=0xff; } void main() { P0=0x00; P1=0xff; while(1) { read_wendu(); display(); } } -电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台