这是向RAM中写入数据的指令,随后写入的两个字节的数据将会被存到地址2(报警RAM之TH)和地址3(报警RAM之TL)。写入过程中可以用复位信号中止写入。
Read Scratchpad (从RAM中读数据)[BEH]
此指令将从RAM中读数据,读地址从地址0开始,一直可以读到地址9,完成整个RAM数据的读出。芯片允许在读过程中用复位信号中止读取,即可以不读后面不需要的字节以减少读取时间。 Copy Scratchpad (将RAM数据复制到EEPROM中)[48H] 此指令将RAM中的数据存入EEPROM中,以使数据掉电不丢失。此后由于芯片忙于EEPROM储存处理,当控制器发一个读时间隙时,总线上输出“0”,当储存工作完成时,总线将输出“1”。在寄生工作方式时必须在发出此指令后立刻超用强上拉并至少保持10MS,来维持芯片工作。
Convert T(温度转换)[44H]
收到此指令后芯片将进行一次温度转换,将转换的温度值放入RAM的第1、2地址。此后由于芯片忙于温度转换处理,当控制器发一个读时间隙时,总线上输出“0”,当储存工作完成时,总线将输出“1”。在寄生工作方式时必须在发出此指令后立刻超用强上拉并至少保持500MS,来维持芯片工作。
Recall EEPROM(将EEPROM中的报警值复制到RAM)[B8H] 此指令将EEPROM中的报警值复制到RAM中的第3、4个字节里。由于芯片忙于复制处理,当控制器发一个读时间隙时,总线上输出“0”,
当储存工作完成时,总线将输出“1”。另外,此指令将在芯片上电复位时将被自动执行。这样RAM中的两个报警字节位将始终为EEPROM中数据的镜像。
Read Power Supply(工作方式切换)[B4H]
此指令发出后发出读时间隙,芯片会返回它的电源状态字,“0”为寄生电源状态,“1”为外部电源状态。 DS18B20复位及应答关系示意图: 图6
每一次通信之前必须进行复位,复位的时间、等待时间、回应时间应严格按时序编程。 DS18B20读写时间隙:
DS18B20的数据读写是通过时间隙处理位和命令字来确认信息交换的。 写时间隙: 图7
写时间隙分为写“0”和写“1”,时序如图7。在写数据时间隙的前15uS总线需要是被控制器拉置低电平,而后则将是芯片对总线数据的采样时间,采样时间在15~60uS,采样时间内如果控制器将总线拉高则表示写“1”,如果控制器将总线拉低则表示写“0”。每一位的发送都应该有一个至少15uS的低电平起始位,随后的数据“0”或“1”应该在45uS内完成。整个位的发送时间应该保持在60~120uS,否则不能保证通信的正常。
读时间隙: 图8
读时间隙时控制时的采样时间应该更加的精确才行,读时间隙时也是必须先由主机产生至少1uS的低电平,表示读时间的起始。随后在总线被释放后的15uS中DS18B20会发送内部数据位,这时控制如果发现总线为高电平表示读出“1”,如果总线为低电平则表示读出数据“0”。每一位的读取之前都由控制器加一个起始信号。注意:如图8所示,必须在读间隙开始的15uS内读取数据位才可以保证通信的正确。
在通信时是以8位“0”或“1”为一个字节,字节的读或写是从高位开始的,即A7到A0.字节的读写顺序也是如图2自上而下的。
51单片机采集18B20温度
-----并用7段数码管动态显示
#include
#define uchar unsigned char #define uint unsigned int
uchar table[]={ 0xc0,0xf9,0xa4,0xb0, //\共阳 0x99,0x92,0x82,0xf8, //\ 0x80,0x90,0xbf,0xff}; //\,负温度/错误,正温度/消隐 uchar shu[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; sbit DQ=P3^7; //定义18B20数据线 bit sflag; //正负标志位
uchar readdata[2]; //保存温度数值数组 uchar test; //保存温度数值中间变量 uchar LED[8]; //数码管显示数变量,LED[0]正负标记位,之后依次为 百 十 个 十分 百分
uchar live=0; //18b20存在标记位 uchar cnt=0; //中断标记位
//************18B20程序***********************************************************// void delayus(uint t) //微秒级延时 {while(t--);}
void reset(void)//复位18B20 { DQ=1; delayus(8); DQ=0; delayus(80); DQ=1; delayus(10); live=DQ; delayus(20); DQ=1; delayus(100); }
void writebyte(uchar command)//写字节到18B20 { uchar i=0; for(i=8;i>0;i--) { DQ=0; DQ=command&0x01; delayus(5); command>>=1; DQ=1; }
}
uchar readbyte()//从18b20读出字节 { uchar i=0; uchar temp=0; for(i=8;i>0;i--) { DQ=0; //采样开始 DQ=1; //释放总线 temp>>=1; if(DQ) temp|=0x80; delayus(5); DQ=1; //总线复位 } return(temp); }
//************数码管扫描程序***********************************************************// void display(uchar LED[]) { uint i; for(i=0;i<8;i++) { P0=0X00; if(i==3) P2=table[LED[i]]&0x7f; else P2=table[LED[i]]; P0=shu[i]; delayus(250); } }
//****************************************************************************////
void main() { uint i=0; TMOD=0X01; TR0=1; ET0=1;