/********************************************************************
* 文件名 : 温度采集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[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f,0};
/********************************************************************
* 名称 : delay()
* 功能 : 延时函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delayms(uint z)
{
uint i;
for(i=0; i<z; i++)
;
}
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void delay(uint z)//1ms延时
{
uchar x,j;
for(j=z;j>0;j--)
for(x=113;x>0;x--);
}
/********************************************************************
* 名称 : Reset()
* 功能 : 复位DS18B20
* 输入 : 无
* 输出 : 无
***********************************************************************/
void DS18B20_init()
{
DQ = 0;
delayms(29);
DQ = 1;
delayms(25);
}
/********************************************************************
* 名称 : read_bit()
* 功能 : 从DS18B20读一个位值
* 输入 : 无
* 输出 : 从DS18B20读出的一个位值
***********************************************************************/
uchar DS18B20_readbit()
{
uchar i;
DQ = 0;
DQ = 1;
for(i=0; i<3; i++);
return(DQ);
}
/********************************************************************
* 名称 : write_bit()
* 功能 : 向DS18B20写一位
* 输入 : bitval(要对DS18B20写入的位值)
* 输出 : 无
***********************************************************************/
void DS18B20_writebit(uchar aa)
{
DQ=0;
if(aa==1)
DQ=1;
delayms(5);
DQ=1;
}
/********************************************************************
* 名称 : read_byte()
* 功能 : 从DS18B20读一个字节
* 输入 : 无
* 输出 : 从DS18B20读到的值
***********************************************************************/
uchar DS18B20_readbyte()
{
uchar i,j,dat;
j= 1;
dat = 0;
for(i=0; i<8; i++)
{
if(DS18B20_readbit())
{
dat = dat + (j << i);
}
delayms(6);
}
return(dat);
}
/********************************************************************
* 名称 : write_byte()
* 功能 : 向DS18B20写一个字节
* 输入 : val(要对DS18B20写入的命令值)
* 输出 : 无
***********************************************************************/
void DS18B20_writebyte(uchar dat)
{
uint temp;
uchar j;
for(j=0; j<8; j++)
{
temp = dat >> j;
temp = temp & 0x01;
DS18B20_writebit(temp);
delayms(5);
}
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
{
uint temp;
while(1)
{
DS18B20_init();
DS18B20_writebyte(0xcc);
DS18B20_writebyte(0x44);
DS18B20_init();
DS18B20_writebyte(0xcc);
DS18B20_writebyte(0xbe);
TMPL = DS18B20_readbyte();
TMPH = DS18B20_readbyte();
temp = TMPL / 16 + TMPH * 16;
P0 = table[temp/10%10];
P2 = 6;
delay(5);
P0 = table[temp%10];
P2 = 7;
delay(5);
}
}