数码管显示DS18B20温度
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);
}