视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
DS18B20与数码管温度显示C程序
2025-10-02 04:39:34 责编:小OO
文档
#include

#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,0x39};//共阴数码管字码表

unsigned char code str1[]={0x0bf,0x86,0x0db,0x0cf,0x0e6,0x0ed,0x0fd,0x87,0x0ff,0x0ef,0x39};//个位带小数点字码表

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+1;

tflag=1;

   }

tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数

return(tvalue);

}

/*******************************************************************/

   void ds1820disp()//温度值显示

{ uchar flagdat;

  uchar i;

   disdata[0]=tvalue/1000;//百位数

     disdata[1]=tvalue%1000/100;//十位数

     disdata[2]=tvalue%100/10;//个位数

     disdata[3]=tvalue%10;//小数位

     if(tflag==0)

     flagdat=0x20;//正温度不显示符号

     else

       flagdat=0x2d;//负温度显示负号:-

     if(disdata[0]==0x30)

    {disdata[0]=0x20;//如果百位为0,不显示

   if(disdata[1]==0x30)

    {disdata[1]=0x20;//如果百位为0,十位为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();//显示

}

}下载本文

显示全文
专题