#include<reg52.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
sbit ds=P1^0
bit flag
uchar count_t0
float f_temp
void delay(uint z)
{
uint x,y
for(x=zx>0x--)
for(y=122y>0y--)
}
void init() // 串口初始化
{
TMOD=0x21
SCON=0x50
TH0=0x4c
TL0=0x00
TH1=0xf3
TL1=0xf3
EA=1
ET0=1
TR0=1
TR1=1
}
void timer0() interrupt 1
{
TH0=0x4c
TL0=0x00
if(++count_t0>=20)
{
count_t0=0
flag=1
}
}
void dsreset()
{
uint i
ds=0
i=103
while(i>0)
i--
ds=1
i=4
while(i>0)
i--
}
bit read_bit()
{
uint i
bit dat
ds=0i++
ds=1i++i++
dat=ds
i=8
while(i>0)
i--
return dat
}
uchar read_byte()
{
uchar i,j,dat
dat=0
for(i=1i<=8i++)
{
j=read_bit()
dat=(j<<7)|(dat>>1)
}
return dat
}
void write_byte(uchar dat)
{
uint i
uchar j
bit testb
for(j=1j<=8j++)
{
testb=dat&0x01
dat=dat>>1
if(testb)
{
ds=0
i++i++
ds=1
i=8
while(i>0)
i--
}
else
{
ds=0
i=8
while(i>0)
i--
ds=1
i++i++
}
}
}
void begin_change()
{
dsreset()
delay(1)
write_byte(0xcc)
write_byte(0x44)
}
float get_temp()
{
uchar a,b
uint temp
float f_temp
dsreset()
delay(1)
write_byte(0xcc)
write_byte(0xbe)
a=read_byte()
b=read_byte()
temp=b
temp<<=8
temp=temp|a
f_temp=temp*0.0625
temp=f_temp*10+0.5
f_temp=f_temp+0.05
return f_temp
}
void main()
{
init()
while(1)
{
if(flag==1)
{
flag=0
begin_change()
TI=1
printf("The tempeature is %f\n",get_temp())
while(!TI)
TI=0
}
}
}
/*********************************************************************
文件名
:
温度采集DS18B20.c
*
描述
:
该文件实现了用温度物州传感器件DS18B20对温度的采集,并在数码管上显示出来。
*
创建人
:
东流,2009年4月10日
*
版本号
:
2.0
***********************************************************************/
#include<reg52.h>
#define
uchar
unsigned
char
#define
uint
unsigned
int
#define
jump_ROM
0xCC
#define
start
0x44
#define
read_EEROM
0xBE
sbit
DQ
=
P2^3
//DS18B20数据口
unsigned
char
TMPH,TMPL
uchar
code
table[10]
=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}
/********************************************************************
*
名碰蚂亏称
:
delay()
*
:
延时,延时时间大概为140US。
*
输入
:
无
*
输出
:
无
***********************************************************************/
void
delay_1()
{
int
i,j
for(i=0
i<=10
i++)
for(j=0
j<=2
j++)
}
/********************************************************************
*
:
delay()
*
功能
:
延时函笑神数
*
输入
:
无
*
输出
:
无
***********************************************************************/
void
delay(uint
N)
{
int
i
for(i=0
i<N
i++)
}
/********************************************************************
*
名称
:
Delay_1ms()
*
功能
:
延时子程序,延时时间为
1ms
*
x
*
输入
:
x
(延时一毫秒的个数)
*
输出
:
无
***********************************************************************/
void
Delay_1ms(uint
i)//1ms延时
{
uchar
x,j
for(j=0j<ij++)
for(x=0x<=148x++)
}
/********************************************************************
*
名称
:
Reset()
*
功能
:
复位DS18B20
*
输入
:
无
*
输出
:
无
***********************************************************************/
uchar
Reset(void)
{
uchar
deceive_ready
DQ
=
0
delay(29)
DQ
=
1
delay(3)
deceive_ready
=
DQ
delay(25)
return(deceive_ready)
}
/********************************************************************
*
名称
:
read_bit()
*
功能
:
从DS18B20读一个位值
*
输入
:
无
*
输出
:
从DS18B20读出的一个位值
***********************************************************************/
uchar
read_bit(void)
{
uchar
i
DQ
=
0
DQ
=
1
for(i=0
i<3
i++)
return(DQ)
}
/********************************************************************
*
名称
:
write_bit()
*
功能
:
向DS18B20写一位
*
输入
:
bitval(要对DS18B20写入的位值)
*
输出
:
无
***********************************************************************/
void
write_bit(uchar
bitval)
{
DQ=0if(bitval==1)
DQ=1
delay(5)
DQ=1
}
/********************************************************************
*
名称
:
read_byte()
*
功能
:
从DS18B20读一个字节
*
输入
:
无
*
输出
:
从DS18B20读到的值
***********************************************************************/
uchar
read_byte(void)
{
uchar
i,m,receive_data
m
=
1
receive_data
=
0
for(i=0
i<8
i++)
{
if(read_bit())
{
receive_data
=
receive_data
+
(m
<<
i)
}
delay(6)
}
return(receive_data)
}
/********************************************************************
*
名称
:
write_byte()
*
功能
:
向DS18B20写一个字节
*
输入
:
val(要对DS18B20写入的命令值)
*
输出
:
无
***********************************************************************/
void
write_byte(uchar
val)
{
uchar
i,temp
for(i=0
i<8
i++)
{
temp
=
val
>>
i
temp
=
temp
&
0x01
write_bit(temp)
delay(5)
}
}
/********************************************************************
*
名称
:
Main()
*
功能
:
主函数
*
输入
:
无
*
输出
:
无
***********************************************************************/
void
main()
{
float
tt
uint
temp
P2
=
0x00
while(1)
{
Reset()
write_byte(jump_ROM)
write_byte(start)
Reset()
write_byte(jump_ROM)
write_byte(read_EEROM)
TMPL
=
read_byte()
TMPH
=
read_byte()
temp
=
TMPL
/
16
+
TMPH
*
16
P0
=
table[temp/10%10]
P2
=
6
Delay_1ms(5)
P0
=
table[temp%10]
P2
=
7
Delay_1ms(5)
}
}
一、DS18B20.c文件(用LCD1602显示的 I_N为DS18B20数据IO)/*
模块名称:温度模块(DS18B20)
模块功能: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条)