做电影网站犯法吗,网页设计网站,公司建设网站属于什么科目,龙岩做网站开发哪家厉害协议
DS18B20的一线工作协议流程是#xff1a;初始化→ROM操作指令→存储器操作指令→数据传输#xff0c;其工作时序包括#xff1a;初始化时序、写时序、读时序。 黑色部分表示单片机操作#xff0c;蓝色部分表示18b20操作#xff0c;每次主机操作完成之后等待18b20状…协议
DS18B20的一线工作协议流程是初始化→ROM操作指令→存储器操作指令→数据传输其工作时序包括初始化时序、写时序、读时序。 黑色部分表示单片机操作蓝色部分表示18b20操作每次主机操作完成之后等待18b20状态时必须要释放总线比如将IO设置为高阻态什么的。否则18B20没法把状态写到线上。
过程1、2是初始化过程每次读取都要初始化否则18b20处于待机状态无法成功读取。过程1拉低信号线480-700us使它复位然后释放总线15-60us18b20会拉低总线60-240us然后它释放总线。所以初始化成功的一个标志就是能否读到18b20这个先低后高的操作时序。
与之对应的代码其实是按照时序图编写的 注意观察dq DQ0;TempDelay(80);拉低信号线480-700us使它复位对应时序图上黑色线一开始为0. DQ1; TempDelay(5);释放总线15-60us对应时序图上黑色线变成1. 然后如果18b20拉低总线,说明初始化成功 if(DQ0)flag1; //detect 18b20 successelseflag0; //detect 18b20 fail
复位的整体代码
void ds_reset(void)//复位函数
{DQ1;_nop_(); //1usDQ0;TempDelay(80); //当总线停留在低电平超过480us总线上所以器件都将被复位这里//延时约530us总线停留在低电平超过480μs总线上的所有器件都//将被复位。延时的数据取决于芯片 _nop_(); DQ1; //产生复位脉冲后微处理器释放总线,让总线处于空闲状态原因查//18b20中文资料TempDelay(5); //释放总线后以便从机18b20通过拉低总线来指示其是否在线,//存在检测高电平时间15~60us 所以延时44us进行1-wire presence //detect单线存在检测_nop_();_nop_();_nop_();if(DQ0)flag1; //detect 18b20 successelseflag0; //detect 18b20 failTempDelay(20); //存在检测低电平时间60~240us所以延时约140us_nop_();_nop_();DQ1; //再次拉高总线让总线处于空闲状态
/**/
}过程3、4是写1bit数据过程。过程3是写0 过程4是写1。过程3拉低总线60us然后抬高总线5us完成。过程4拉低总线5us然后抬高总线60us完成。 过程5、6是读1bit过程。过程5是读0过程6是读1。过程5、6拉低总线5us然后释放总线读取总线如果为0则读入0如果为1则读入1。
由于我主要研究的是怎么把数据导出来所以主要看发送温度转换命令和获得温度这两个函数
发送温度转换命令
------------------------------------------*/void tem_change()
{ds_reset(); delay(1); //约2msds_write_byte(0xcc);ds_write_byte(0x44);
}/*----------------------------------------
获得温度
------------------------------------------*/
uint get_temperature()
{float wendu;uchar a,b;ds_reset();delay(1); //约2msds_write_byte(0xcc);ds_write_byte(0xbe);ads_read_byte();bds_read_byte();tempb;temp8;temptemp|a;wendutemp*0.0625; //温度读取tempwendu*100.5;return temp;
}让DS18B20进行一次温度转换的具体操作如下 1、主机先做个复位操作 2、主机再写跳过ROM的操作CCH命令 3、然后主机接着写转换温度的操作指令后面释放总线至少1秒让DS18B20完成转换操作。需要注意的是每个命令字节在写的时候都是低字节先写例如CCH的二进制为11001100在写到总线上时要从低位开始写写的顺序是“0、0、1、1、0、0、1、1”。
上面让DS18B20进行一次温度转换就涉及到 ds_write_byte()写操作
读取RAM的温度数据同样这个操作也要按照三个步骤 1、主机发出复位操作并接受DS18B20的应答存在脉冲 2、主机发出跳过对ROM操作的命令CCH; 3、主机发出读取RAM的命令BEH随后主机依次读取DS18B20发出的从第0-第8共九个字节的数据。如果只想读取温度数据那在读完第0和第1个数据后就不再理会后面DS18B20发出的数据即可同样读取数据也是低位在前. 获得温度的时候又涉及到了ds_read_byte();读操作
结构 由上图可知读温度时要读两次一个是低8位一个是高8位。最后要合到一块。 ds_write_byte(0xcc);ds_write_byte(0xbe);ads_read_byte();bds_read_byte();tempb;temp8;temptemp|a;测温原理 低温度系数振荡器温度影响小用于产生固定频率信号送计数器1; 高温度系数振荡频率随温度变化产生信号脉冲送计数器2 计数器1和温度寄存器被预置在 -55℃对应的基数值 计数器1对低温度系数振荡器产生的脉冲进行减法计数 当计数器1预置减到0时温度寄存器加1计数器1预置重新装入 计数器1重新对低温度系数振荡器计数 如此循环直到计数器2计数到0时停止对温度寄存器累加此时温度寄存器中的数值即为所测温度。 高温度系数振荡器相当于T/ f 转换器将被测温度转换成频率信号f 当门打开时对低温度系数振荡器计数 计数门的开启时间有高温度系数振荡器决定。
指令
18B20内部自带5个ROM指令、6条专用指令ROM指令 Read ROM(33h 读ROM
Match ROM(55h) 比较
Skip ROM(CCh) 跳过ROM
Search ROM(F0h) 搜索、查找
Alarm ROM(ECh) 报警专用指令Write Scratchpad[便签式](4Eh) 写便签RAM
Read Scratchpad(BEh), 读数据
Copy Scratchpad(48h), 复制
Convert T(44h), 启动转换
Recall E2(B8h), 搜索、调用
Read Power Supply(B4h) 读电源电压代码
/*--------------------------------------------------------------------------------------------------------------------
初始化检测总线控制器发出的复位脉冲
和ds18b20的任何通讯都要从初始化开始初始化序列包括一个由总线控制器发出的复位脉冲
和跟在其后由从机发出的存在脉冲。初始化复位脉冲存在脉冲具体操作总线控制器发出TX一个复位脉冲 一个最少保持480μs 的低电平信号然后释放总线
进入接收状态RX。单线总线由5K 上拉电阻拉到高电平。探测到I/O 引脚上的上升沿后
DS1820 等待15~60μs然后发出存在脉冲一个60~240μs 的低电平信号。-------------------------------------------------------------------------------------------------------------------*/
void ds_reset(void)//复位函数
{DQ1;_nop_(); //1usDQ0;TempDelay(80); //当总线停留在低电平超过480us总线上所以器件都将被复位这里//延时约530us总线停留在低电平超过480μs总线上的所有器件都//将被复位。延时的数据取决于芯片 _nop_(); DQ1; //产生复位脉冲后微处理器释放总线,让总线处于空闲状态原因查//18b20中文资料TempDelay(5); //释放总线后以便从机18b20通过拉低总线来指示其是否在线,//存在检测高电平时间15~60us 所以延时44us进行1-wire presence //detect单线存在检测_nop_();_nop_();_nop_();if(DQ0)flag1; //detect 18b20 successelseflag0; //detect 18b20 failTempDelay(20); //存在检测低电平时间60~240us所以延时约140us_nop_();_nop_();DQ1; //再次拉高总线让总线处于空闲状态
/**/
}/*----------------------------------------
读/写时间隙:
DS1820 的数据读写是通过时间隙处理
位和命令字来确认信息交换。
------------------------------------------*/
bit ds_read_bit(void) //读一位
{bit dat;DQ0; //单片机微处理器将总线拉低_nop_(); //读时隙起始于微处理器将总线拉低至少1usDQ1; //拉低总线后接着释放总线让从机18b20能够接管总线输出有效数据_nop_();_nop_(); //小延时一下读取18b20上的数据 ,因为从ds18b20上输出的数据//在读时间隙下降沿出现15us内有效datds; //主机读从机18b20输出的数据这些数据在读时隙的下降沿出现//15us内有效 TempDelay(10); //所有读时间隙必须60~120us这里77usreturn(dat); //返回有效数据
}
///
uchar ds_read_byte(void ) //读一字节
{uchar value,i,j;
value0; //一定别忘了给初值
for(i0;i8;i)
{jds_read_bit();value(j7)|(value1); //这一步的说明在一个word文档里面
}
return(value); //返回一个字节的数据
}//
void ds_write_byte(uchar dat) //写一个字节
{uchar i;bit onebit; //一定不要忘了onebit是一位for(i1;i8;i) {onebitdat0x01;datdat1;
if(onebit) //写 1
{
DQ0;
_nop_(); _nop_(); //看时序图至少延时1us才产生写时间隙
DQ1; //写时间隙开始后的15μs内允许数据线拉到高电平TempDelay(5); //所有写时间隙必须最少持续60us
}
else //写 0
{
DQ0;TempDelay(8); //主机要生成一个写0 时间隙必须把数据线拉到低电平并保持至少60μs这里64us
DQ1;
_nop_();_nop_();
}}
}/*****************************************
主机单片机控制18B20完成温度转换要经过三个步骤
每一次读写之前都要18B20进行复位操作复位成功后发送
一条ROM指令最后发送RAM指令这样才能对DS18b20进行
预定的操作。
复位要求主CPU将数据线下拉500us然后释放当ds18B20
受到信号后等待16~60us后发出60~240us的存在低脉冲
主CPU收到此信号表示复位成功
******************************************/ /*----------------------------------------
进行温度转换
先初始化
然后跳过ROM跳过64位ROM地址直接向ds18B20发温度转换命令适合单片工作
发送温度转换命令
------------------------------------------*/void tem_change()
{ds_reset(); delay(1); //约2msds_write_byte(0xcc); //跳过romds_write_byte(0x44); //启动转换
}/*----------------------------------------
获得温度
------------------------------------------*/
uint get_temperature()
{float wendu;uchar a,b;ds_reset();delay(1); //约2msds_write_byte(0xcc);ds_write_byte(0xbe);ads_read_byte();bds_read_byte();tempb;temp8;temptemp|a;wendutemp*0.0625; //温度读取tempwendu*100.5;return temp;
}
/*----------------------------------------
读ROM
------------------------------------------*/
void ds_read_rom()
{uchar a,b;ds_reset();delay(30);ds_write_byte(0x33);ads_read_byte();bds_read_byte();
}void main()
{while(1){tem_change(); //12位转换时间最大为750msdisplay( get_temperature());}
}