专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

DS18B20读写程序

作者:huqin   来源:本站原创   点击数:  更新时间:2014年05月02日   【字体:
#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();
 }
 
}
关闭窗口

相关文章