/*************** writer:shopping.w ******************/
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DQ = P3^6
uchar code DSY_CODE[] =
{ 0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X00}
uchar code df_Table[] = {0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9}
uchar CurrentT = 0
uchar Temp_Value[]={0x11,0x22}
uchar Display_Digit[]={0,0,0,0}
bit DS18B20_IS_OK = 1
void Delay(uint x)
{
while(--x)
}
uchar Init_DS18B20()
{
uchar status
DQ = 1
Delay(8)
DQ = 0
Delay(90)
DQ = 1
Delay(8)
DQ = 1
return status
}
uchar ReadOneByte()
{
uchar i,dat=0
DQ = 1
_nop_()
for(i=0i<8i++)
{
DQ = 0
dat >>= 1
DQ = 1
_nop_()
_nop_()
if(DQ)
dat |= 0X80
Delay(30)
DQ = 1
}
return dat
}
void WriteOneByte(uchar dat)
{
uchar i
for(i=0i<8i++)
{
DQ = 0
DQ 伍侍薯= dat& 0x01
Delay(5)
DQ = 1
dat >>= 1
}
}
void Read_Temperature()
{
if(Init_DS18B20() ==1 )
DS18B20_IS_OK = 0
else
{
WriteOneByte(0xcc)
WriteOneByte(0x44)
Init_DS18B20()
WriteOneByte(0xcc)
WriteOneByte(0xbe)
Temp_Value[0] = ReadOneByte()
Temp_Value[1] = ReadOneByte()
DS18B20_IS_OK=1
}
}
void Display_Temperature()
{
uchar i
uchar t=150
uchar ng=0, np=0
if ( (Temp_Value[1] & 0xf8) == 0xf8)
{
Temp_Value[1] = ~Temp_Value[1]
Temp_Value[0] = ~Temp_Value[0]+1
if (Temp_Value[0] == 0x00) Temp_Value[1]++
ng=1np=0xfd
}
Display_Digit[0] = df_Table[ Temp_Value[0] & 0x0f ]
CurrentT = ((Temp_Value[0] & 0xf0)>>4) | ((Temp_Value[1] & 0x07)<谈枣<4)
Display_Digit[3] = CurrentT / 100
Display_Digit[2] = CurrentT % 100 / 腔者10
Display_Digit[1] = CurrentT % 10
if (Display_Digit[3] == 0)
{
Display_Digit[3] = 10
np = 0xfb
if (Display_Digit[2] == 0)
{
Display_Digit[2] = 10
np = 0xf7
}
}
for (i=0i<30i++)
{
P0=0x39P2=0x7fDelay(t)P2=0xFF
P0=0x63P2=0xbfDelay(t)P2=0xff
P0=DSY_CODE[Display_Digit[0]]
P2=0xDFDelay(t)P2=0xff
P0=(DSY_CODE[Display_Digit[1]]) | 0x80
P2=0xefDelay(t)P2=0xff
P0=DSY_CODE[Display_Digit[2]]
P2=0xf7Delay(t)P2=0xff
P0=DSY_CODE[Display_Digit[3]]
P2=0xfb Delay(t) P2=0xff
if (ng)
{
P0 = 0x40 P2 = np Delay(t) P2=0xff
}
}
}
void main()
{
Read_Temperature()
Delay(50000)
Delay(50000)
while(1)
{
Read_Temperature()
if(DS18B20_IS_OK)
Display_Temperature()
}
}
一、DS18B20.c文件(用LCD1602显示的 I_N为DS18B20数据IO)/*
模块名称:温度模块(DS18B20)
*/
/********************************************预处理命令*******************************************/
#include"ds18b20.h"
/*
函数名:DS_WriBteAndRead(bit x,unit8 val)
函数功能:向DS18B20内部寄存器写入或读取数据
输入: x,val
输出:DS_WriteAndRead
*/
unit8 DS_WriteAndRead(bit x,unit8 val)
{
unit8 i=0,Red=0
for(i=8i>0i--)
{
if(x) //读陵派数据
{
I_N=0
I_N=1
Red>>=1
if(I_N)Red|=0x80
}
else //写数据
{
I_N=1
I_N=0
I_N=val&0x01
val>>=1
}
delay_us(4)
}
if(x)
return(Red)//返回数据
else
return 0
}
/*
函数尺激贺名:DS_Reset()
函数功能:DS18B20初始化设置
输入:无
输出:无
*/
void DS_Reset()
{
I_N=1
I_N=0
delay_us(50)
I_N=1
delay_us(30)
DS_WriteAndRead(0,0xcc)//跳过搜索
}
/*
函数名: DS_Data_Handle()
函数功能:铅慧数据处理
输入:无
输出:无
*/
void DS_Data_Handle()
{
unit_16 Ra=0,Rb=0,Temp=0
DS_Reset()//复位
DS_WriteAndRead(0,0x44)//启动温度转换
DS_Reset()//复位
delay_us(100)
DS_WriteAndRead(0,0xbe)//读暂存器中的数据
Ra=DS_WriteAndRead(1,0xbe)
Rb=DS_WriteAndRead(1,0xbe)
Temp=Rb
Temp<<=8
Temp|=Ra
Temp=Temp*0.625+0.5//数值转换
LCD_Write_Data(0,0xc5)
LCD_Write_Data(1,(Temp/100)+48)
LCD_Write_Data(1,(Temp/10%10)+48)
LCD_Write_Data(1,46)
LCD_Write_Data(1,(Temp%10)+48)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)