(3)读时间隙
见图4.11,主机总线t0时刻从高拉至低电平时总线只须保持低电平l5us之后在t1时刻将总线拉高产生读时间隙读时间隙。在t1时刻后t2时刻前有效,t2距to为15us,也就是说t2时刻前主机必须完成读位, 并在t0后的60us一120us内释放总线.
图4.11 读时序
根据数字温度传感器的工作时序及原理进行软件的设计,DS18B20的C51程序代码如下:
sbit DQ =P1^0; //DS18B20端口
typedef unsigned char byte;
typedef unsigned int word;
void delay(word useconds) //延时子函数
{
for(;useconds>0;useconds--);
}
byte ow_reset(void) //复位DS18B20
{
byte presence;
DQ = 0; //送出低电平
delay(29); // 延时 480us
DQ = 1; // 送出高电平
delay(3); // 等到DS18B20存在脉冲
presence = DQ; // 读存在脉冲(低电平有效)
delay(25); //延时
return(presence);
}
byte read_byte(void) //从 1-wire 总线上读取一个字节
{
byte i;
byte value = 0;
for (i=8;i>0;i--)
{
value>>=1;
DQ = 0; // 输出一脉冲
DQ = 1;
delay(1);
if(DQ)
value|=0x80;
delay(6);
}
return(value);
}
void write_byte(char val) //向 1-WIRE 总线上写一个字节
{
byte i;
for (i=8; i>0; i--) // 写一个字节,每次写一位
{
DQ = 0;
DQ = val&0x01;
delay(5);
DQ = 1;
val=val/2; //用除法实现移位
}
delay(5);
}
char Read_Temperature(void) //读取温度
{
byte temp[2];
float x;
ow_reset(); //复位DS18B20
write_byte(0xCC); //跳过 ROM
write_byte(0xBE); //写入读存储器指令
temp[1]=read_byte(); //读入数据
temp[0]=read_byte();
x= temp[1]*0x112 + temp[0];
x= x*0.0625; //将数值转换为摄氏温度
return x;
4.2.4 系统的程序源代码
系统的C52 源程序如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS=P3^3; //定义DS18B20接口
int temp;
uchar flag1;
void display(unsigned char *lp,unsigned char lc);//数字的显示函数;lp为指向数组的地址,lc为显示的个数
void delay();//延时子函数,5个空指令
code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x08,0x00};
//共阴数码管 0-9 - _ 空 表
unsigned char l_tmpdate[8]={0,0,10,0,0,0,0,0};//定义数组变量,并赋值1,2,3,4,5,6,7,8,就是本程序显示的八个数
int tmp(void);
void tmpchange(void);
void tmpwritebyte(uchar dat);
uchar tmpread(void);
bit tmpreadbit(void);
void dsreset(void);
void delayb(uint count);
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>