压缩包上传不上来,先把源码贴上来,明天在传压缩包,源码中关于lcd1602的部分需要替换成自己写的,呵呵
/*******************************************************************/
//模 块 名: DS18B20驱动
//创 建 者: 好心情
//修 改 者:
//功能描述: DS18B20驱动
//其他说明: 51上运行通过,晶振12M
//版 本: V1.0
//日 期: 2007-12-3
/*******************************************************************/
# include "lcd1602-4bit1.H"
# include <reg51.h>
# include <intrins.h>
# define unchar unsigned char
/****************************接口定义*******************************/
sbit ds1820_dq = P1^6;
/**************************全局变量定义*****************************/
bit flag; // 标志位
unsigned char data temp_data[2] = {0x00,0x00} ; // 保存读取到的数值
unsigned char data display_date[5] = {0x00,0x00,0x00,0x00,0x00} ;
unsigned char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;
/****************************函数声明*******************************/
void delay_us(unchar delay); // 延时us级
unchar ds1820_read(void); //读时序
void ds1820_write(unchar dat); //写
void ds1820_init(void); // 初始化,返回一个bit值,0表示器件
//存在且ok,1不存在,或损坏
/********************************************************************
*DS1820初始化(通过存在脉冲可以判断DS1820是否损坏)
*函数名称:ds1820_init(void)
*说明:函数返回一个位标量(0或1)flag=0存在,反之flag=1不存在,复位脉冲最
*少480us,最大960us.总线释放后延时15-60us1820产生60-240us的应答脉冲
********************************************************************/
void ds1820_init(void)
{
// 复位脉冲
ds1820_dq = 1; //将总线拉高,准备复位
ds1820_dq = 0; //复位
delay_us(100); //延时>480us,这里取520us
ds1820_dq = 1; //释放总线,进入接收状态
// 读应答信号
delay_us(11); //延时100us
flag = ds1820_dq;
ds1820_dq = 1; //释放总线*/
}
/********************************************************************
*读时序(分为读0和读1)
*函数名称:ds1820_read(void)
*说明:主机将总线拉低后,15us内就要释放总线,好让1820将数据送到总线上,完
*成一个读过程至少需要60us;
********************************************************************/
unchar ds1820_read(void)
{
unchar dat,i ;
for(i=8;i>0;i--)
{
ds1820_dq = 0; //给脉冲
dat>>=1; //右移1位,如果未读到1,右移一位相当与读0,同时用该指令延时
ds1820_dq = 1; //15us内释放总线
if(ds1820_dq) //读1
{
dat|=0x80; //先读出低位值,将其写入dat最高位
}
delay_us(10); //延时60us,完成一个读过程,至少要60us
}
return dat; //返回结果
}
/********************************************************************
*写时序(分为写0和写1)
*函数名称:ds1820_write(unchar dat)
*说明:先写低位值,利用dat&0x01取出最低位的值,如果是1,执行写1操作,否则
*写0;写完之后将dat中的数值右移一位
********************************************************************/
void ds1820_write(unchar dat)
{
unchar i;
for(i=8;i>0;i--)
{
if(dat&0x01) // 写1
{
ds1820_dq = 0;
_nop_(); // 15us内释放总线
ds1820_dq = 1;
delay_us(1); // 稍作延时,让器件读数据
}
else //写0
{
ds1820_dq = 0;
delay_us(60); //延时至少60us,好让器件在15-45us时读到数据
ds1820_dq = 1;
}
dat>>=1; // 右移一位,
}
}
/********************************************************************
*读取温度()
*函数名称:ds1820_write(unchar dat)
*说明:先写低位值,利用dat&0x01取出最低位的值,如果是1,执行写1操作,否则
*写0;写完之后将dat中的数值右移一位
********************************************************************/
void ds1820_read_temp(void)
{
//do{
ds1820_init(); //初始化
//}while(!flag);
ds1820_write(0xcc); //跳过读序列号操作
ds1820_write(0x44); //启动温度转换,对于12位精度,转换需要750ms的时间
do //这里采用判断语句来确认是否转换完成
{
ds1820_init(); // 初始化
}while(!flag);
ds1820_write(0xcc);
ds1820_write(0xbe); //读取温度寄存器
temp_data[0] = ds1820_read(); //温度低8位
temp_data[1] = ds1820_read(); //高8位
}
/********************************************************************
*转换温度()
*函数名称: void ds1820_tempchange()
*说明:通过在转换结果上+0x30将其转换为数字对应的ascii码
********************************************************************/
void ds1820_tempchange(void)
{
//小数部分
display_date[4]=temp_data[0]&0x0f ;
display_date[0]=ditab[display_date[4]]+0x30 ; //查表得小数位的值
//整数部分
display_date[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;
display_date[3]=display_date[4]/100+0x30 ;
display_date[1]=display_date[4]%100 ;
display_date[2]=display_date[1]/10+0x30 ;
display_date[1]=display_date[1]%10+0x30 ;
if(display_date[3]==0x30) //高位为0,不显示
{
display_date[3]=0x20 ;
if(display_date[2]==0x30) //次高位为0,不显示
display_date[2]=0x20 ;
}
lcd_write_char(0,1,display_date[3]);
//百位数显示
lcd_write_char(0,2,display_date[2]);
//十位数显示
lcd_write_char(0,3,display_date[1]);
//各位显示
lcd_write_char(0,4,'.'); //小数点
lcd_write_char(0,5,display_date[0]); //小数位
}
/********************************************************************
*延时函数,us级
*函数名称:delay_us(unchar delay)
*说明:不精确延时
********************************************************************/
void delay_us(unchar delay)
{
while(--delay);
}
/******************************************************************/
/****************************************/
void main()
{
lcd_init(); // lcd初始化
ds1820_init(); // ds1820初始化
if(!flag)
{
ds1820_read_temp();
ds1820_tempchange();
delay_1ms(200);
}else
{
lcd_write_string(1,0,"ds1820_NG") ;
}
}
用户42640 2008-4-3 16:28
用户42640 2007-12-5 09:46
谢了,哈哈
wang1jin 2007-12-4 17:49
帮顶一下.哈哈.
用户386123 2007-6-8 18:04