数码管显示DS18B20温度

2025-10-03 23:32:09

1、#include "includes.h"

#include "ds18b20.h" 

#include "Delay_time.h" 

#define FOSC   11059200  

/********段选IO口**********/

sbit SMG1=P3^4;

sbit SMG2=P3^5;

sbit SMG3=P3^6;

sbit SMG4=P3^7;

INT16U a,b,time,flag = 0;

INT16U a,b,c,temp;

unsigned char code tab[]={0x3f,0x05,0x5b,0x4f,0x65,

0x6e,0x7e,0x07,0x7f,0x6f}; //显示0-9       

void delay(unsigned int n)

{

unsigned char i,j;

for(i=n;i>0;i--)

for(j=0;j<110;j++);

}

/*----------------------------

----------------------------*/

//void Usart_Init( INT16U Baud)

//{

// SCON |= 0x50;     //SM0=0,SM1=1 ,???????? REN=1?

// PCON &= 0x7f;

// AUXR |= 0x40;

// AUXR &= 0xFE;

// TMOD |= 0x21;  

// TH1  = 256-FOSC/Baud/32;

// TL1  = TH1;

// TR1  = 1;    

// ET1  = 0;

// ES   = 1;    

// EA   = 1;

//}   

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

****函数名称:TEMP_show

****函数描述:温湿度显示函数

****返回值:

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

void TEMP_show()

SMG4 = 1; //显示'C'

P1 = 0x3a;

delay(5);

SMG4 = 0;

SMG1 = 1;

P1 = tab[a];

delay(5);

SMG1 = 0;

SMG2 = 1;

P1 = tab[b] | 0x80; 

delay(5);

SMG2 = 0;

SMG3 = 1;

P1 = tab[c];

delay(5);

SMG3 = 0;

}

void main(){

int i; 

P3=0xff; 

//Usart_Init(9600);

while(1)

{

sendChangeCmd();

temp = getTmpValue();

a = temp/100; //显示十位

b = temp%100/10; //显示个位

c = temp%100%10; //显示小数位

SBUF  = a;

delay(15);

SBUF  = b;

delay(15);

SBUF  = c;

delay(15);

for(i=0;i<3000;i++) //大约3s动态刷新一次

{

TEMP_show(); 

}  

}

}

2、#include "includes.h"

#include "ds18b20.h"

#include "Delay_Time.h"

sbit ds = P2^2;

INT16U value; //存放读取的温度值

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

***函数名称: ds_Init

***函数描述:初始化函数

让DS18B20在一段时间内低电平,然后一段相对短时间内高电平即可启动

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

INT8U ds_Init()

{

   INT8U error=0;

   ds=1;

   Delay_50us();

   ds=0;

   Delay_500us();

   ds=1;

   Delay_50us();

   error=ds;

   Delay_Ms(1);

   return error;

}

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

***函数名称:readBit

***函数描述:读一位数据函数

读取一位,让DS18b20一个周期内低电平,然后两个周期内高电平

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

bit readBit()

{

bit b;

ds=0;

Delay_15us();

ds=1;

Delay_15us();

b=ds;

Delay_70us(); 

return b;

}

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

***函数名称: readByte

***函数描述: 读取一字节数据函数 

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

INT8U readByte()

{

INT16U i;

INT8U j,dat;

dat=0;

for(i=0;i<8;i++)

{

j=readBit(); //最先读出最低位数据

dat=(j<<7)|(dat>>1);

}  

return dat;

}

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

***函数名称:writeByte

***函数描述:写一字节数据函数

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

void writeByte(INT8U dat)

{

INT8U j;

bit b;

for(j=0;j<8;j++)

{

b=dat&0x01;

dat>>=1; //写“1”,低电平保持2个周期,高电平保持8个周期

if(b)

{

Delay_70us();

ds=0;

Delay_15us();

ds=1;

Delay_70us();

} else //写"0",低电平保持8个周期,高电平保持2个周期

{

ds=0;

Delay_70us();

ds=1;

Delay_15us();

}  

 }

}

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

***函数名称:sendChangeCmd

***函数描述: 向DS18B20发送温度转换命令

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

void sendChangeCmd()

{

INT8U error;

error=ds_Init(); //初始化DS18B20

Delay_Ms(10); //延时10ms

writeByte(0xcc); //写入跳过序列号命令

writeByte(0x44); //写入温度转换命令

}

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

***函数名称:sendReadCmd

***函数描述:向DS18B20发送读取数据命令

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

void sendReadCmd()

{

INT8U error;     

error=ds_Init();   // SBUF=error;

Delay_Ms(10);

writeByte(0xcc); //写入跳过序列号命令

writeByte(0xbe); //写入温度转换命令

}

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

***函数名称:getTmpValue

***函数描述: 获取当前温度值

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

INT16U getTmpValue()

{

float t;

INT8U low,high;

sendReadCmd(); //连续读取两个字节数据

low=readByte();  

high=readByte();   

value=high;

value<<=8;

value|=low;

//DS18B20的精确度为0.0625度,即读回的数据最低位代表0.0625度

t=value*0.0625;

//将读数扩大10倍,显示小数点后一位,并对其小数位进行四舍五入 

value=t*10+0.5;

return value;

}

3、#include "includes.h"

#include "Delay_Time.h"

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

函数名称:Delay_Ms

函数描述:毫秒级延时函数  1T 模式

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

void Delay_Ms(INT16U ms)  

{

INT16U i,j;

for(i=ms;i>0;i--)

for(j=125;j>0;j--);

}

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

//函数名称:Delay_Us

//函数描述:微秒级延时函数

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

//void Delay_Us(INT8U us)

//{

// while(us--);           

//}

//void Delay_7us_1T()

//{

// unsigned char i;

// _nop_();

// i = 16;

// while (--i);

//}

// 

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

//***函数名: Delay_10Us()

//***函数描述:延时

//***返回值: NULL

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

//void Delay_10us_1T()        //延时10us左右

//{

// unsigned char i;

// _nop_();

// _nop_();

// _nop_();

// i = 24;

// while (--i);

//}

// 

//void Delay18Ms_1T() //n = 3t -3

//{ 

// INT8U i,j,k;

// _nop_();

// _nop_();

// i = 1;

// j = 194;

// k = 159;

// do

// {

// do

// {

// while(--k);

// }while(--j);

// }while(--i);

//}

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

函数名称:Delay_15us

函数描述:微秒级延时函数

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

void Delay_15us() //@11.0592MHz

{

unsigned char i;

_nop_();

_nop_();

i = 38;

while (--i);

}

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

函数名称:Delay_50us

函数描述:微秒级延时函数

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

void Delay_50us() //@11.0592MHz

{

unsigned char i, j;

_nop_();

_nop_();

_nop_();

i = 1;

j = 133;

do

{

while (--j);

} while (--i);

}

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

函数名称:Delay_70us

函数描述:微秒级延时函数

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

void Delay_70us() //@11.0592MHz

{

unsigned char i, j;

i = 1;

j = 189;

do

{

while (--j);

} while (--i);

}

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

函数名称:Delay_500us

函数描述:微秒级延时函数

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

void Delay_500us() //@11.0592MHz

{

unsigned char i, j;

i = 6;

j = 93;

do

{

while (--j);

} while (--i);

}

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢