急需用温度传感器ds18b20,数码管显示温度的单片机的C语言程序,运用的是89c52单片机,附上电路图,谢谢!

如题所述

#include<reg52.h> 
#define uchar unsigned char 
#define uint unsigned int 
sbit DQ=P1^4;  //ds18b20与单片机连接口 
unsigned char code str[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40} ; //共阴数码管字码表
unsigned char code str1[]={0x0bf,0x86,0x0db,0x0cf,0x0e6,0x0ed,0x0fd,0x87,0x0ff,0x0ef}; //个位带小数点字码表
unsigned char code wei[]={0x0fe,0x0fd,0x0fb,0x0f7}; 
uchar data disdata[5]; 
uint  tvalue;   //温度值 
uchar tflag;    //温度正负标志 
/**********ds1820程序************/ 
void delay_18B20(unsigned int i)  //延时1微秒 
  { 
  while(i--); 
  }
void ds1820rst()    /*ds1820复位*/ 
  { 
  unsigned char x=0; 
  DQ = 1;           //DQ复位 
  delay_18B20(4);   //延时 
  DQ = 0;           //DQ拉低 
  delay_18B20(100); //精确延时大于   480us 
  DQ = 1;           //拉高 
  delay_18B20(40);
  }     
uchar ds1820rd()    /*读数据*/ 
  { 
    unsigned char i=0; 
    unsigned char dat = 0; 
    for (i=8;i>0;i--)
    {
    DQ = 0;         //给脉冲信号     
    dat>>=1;
    DQ = 1;         //给脉冲信号     
    if(DQ)  dat|=0x80;     
    delay_18B20(10); 
    } 
  return(dat);
  } 
void ds1820wr(uchar wdata)   /*写数据*/ 
  {
  unsigned char i=0;     
  for (i=8; i>0; i--)   
    {
    DQ = 0;     
    DQ = wdata&0x01;     
    delay_18B20(10);     
    DQ = 1;     
    wdata>>=1;
    }
 } 
read_temp()       /*读取温度值并转换*/ 
  {
  uchar a,b; 
  ds1820rst(); 
  ds1820wr(0xcc); // è·³è¿‡è¯»åºåˆ—号
  ds1820wr(0x44); // å¯åŠ¨æ¸©åº¦è½¬æ¢ 
  ds1820rst(); 
  ds1820wr(0xcc); // è·³è¿‡è¯»åºåˆ—号 
  ds1820wr(0xbe); // è¯»å–温度
  a=ds1820rd(); 
  b=ds1820rd(); 
  tvalue=b; 
  tvalue<<=8; 
  tvalue=tvalue|a;
    if(tvalue<0x0fff)
    tflag=0;
    else
    {
    tvalue=~tvalue+2; tflag=1;  //负温度 
    }
  tvalue=tvalue*(0.625);  //温度值扩大10倍,精确到1位小数
  return(tvalue);
  }
/*********************************/
void ds1820disp()        //温度值显示
  {
  uchar i;
  disdata[0]=tvalue/1000;     //百位数
  disdata[1]=tvalue%1000/100; //十位数 
  disdata[2]=tvalue%100/10;   //个位数
  disdata[3]=tvalue%10;       //小数位
  if(tflag==0)
    {
    if(disdata[0]==0x00)
      {
      disdata[0]=0x0a;                        //百位数位为0不显示   
      if(disdata[1]==0x00)  disdata[1]=0x0a;  //十位数位为0不显示   
      }
    }
  else                         //负温度 
    {   
    disdata[0]=0x0b;                      //负温度百位显示负号:-
    if(disdata[1]==0x00)  disdata[1]=0x0a;    //十位数位为0不显示   
    }
  for(i=0;i<150;i++)
    {
    P2=wei[0];
    P0=str[disdata[3]];
    delay_18B20(20);
    P2=wei[1];
    P0=str1[disdata[2]];
    delay_18B20(20);
    P2=wei[2];
    P0=str[disdata[1]];
    delay_18B20(20);
    P2=wei[3];
    P0=str[disdata[0]];
    delay_18B20(20);
    }
  }
/************主程序**********/
void main()
  {
  ds1820rst();      //初始化显示
  while(1)
    {
    read_temp();    //读取温度
    ds1820disp();   //显示
    }
  } 

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-03-09
楼上的也是其他地方抄来的吧?真够复杂的。如果你的温度要求没有负的没小数,程序处理是否简单,如果有小数和负数,就是现实上会增加语句,但是怎么看也没楼上的复杂。