完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最佳答案 /* DS18B20_3.H*/ ***itDQ = P3^3; // 定义DQ引脚为P3.3 /******************************* 延时函数******************************** * 功能:在11.059MHz的晶振条件下调用本函数需要24μs,然后每次计数需16μs **************************************************************************/ voidDS18_delay(int useconds) { ints; for(s=0; s
} /******************************* 复位函数******************************* * 功能:完成单总线的复位操作。 * 复位时间为480μs,因此延时时间为(480-24)/16= 28.5,取29μs。 * 经过70μs之后检测存在脉冲,因此延时时间为(70-24)/16= 2.875,取3μs。 **************************************************************************/ unsignedchar ow_reset(void) { unsignedchar presence; DQ =0; // 将 DQ 线拉低 DS18_delay(29); // 保持 480μs DQ =1; // DQ返回高电平 DS18_delay(3); // 等待存在脉冲 presence= DQ; // 获得存在信号 DS18_delay(25); // 等待时间隙结束 return(presence); // 返回存在信号,0 = 器件存在, 1= 无器件 } /******************************位写入函数******************************* * 功能:向单总线写入1位值:bitval *************************************************************************/ voidwrite_bit(char bitval) { DQ =0; // 将DQ 拉低开始写时间隙 if(bitval==1)DQ =1; // 如果写1,DQ 返回高电平 DS18_delay(5); // 在时间隙内保持电平值, DQ =1; // DS18_delay函数每次循环延时16μs,因此DS18_delay(5)= 104μs } /****************************字节写入函数******************************* * 功能:向单总线写入一个字节值:val *************************************************************************/ voidds18write_byte(char val) { unsignedchar i; unsignedchar temp; for(i=0; i<8; i++) { // 写入字节, 每次写入一位 temp= val>>i; temp&= 0x01; write_bit(temp); } DS18_delay(5); } /****************************位读取函数******************************** * 功能:从单总线上读取一位信号,所需延时时间为15μs,因此无法调用前面定义 * 的DS18_delay()函数,而采用一个for()循环来实现延时。 ************************************************************************/ unsignedchar read_bit(void) { unsignedchar i; DQ =0; //将DQ 拉低开始读时间隙 DQ =1; // then return high for(i=0; i<3; i++); // 延时15μs return(DQ); // 返回 DQ 线上的电平值 } /****************************字节读取函数******************************* * 功能:从单总线读取一个字节的值 *************************************************************************/ unsignedchar DSread_byte(void) { unsignedchar i; unsignedchar value = 0; for(i=0;i<8;i++) { // 读取字节,每次读取一个字节 if(read_bit())value|=0x01<
DS18_delay(6); } return(value); } /*******************************读取温度函数***************************** * 功能:如果单总线节点上只有一个器件则可以直接掉用本函数。如果节点上有多个器 * 件,为了避免数据冲突,应使用MatchROM函数来选中特定器件。 * 注: 本函数是根据DS1820的温度数据格式编写的,若用于DS18B20,必须根据 * DS18B20的温度数据格式作适当修改。 **************************************************************************/unsigned intReadTemperature(void) { unsignedchar get[10]; unsignedchar temp_l***,temp_m***; unsignedint t; unsignedchar k; ow_reset(); ds18write_byte(0xCC); // 跳过 ROM ds18write_byte(0x44); // 启动温度转换 DS18_delay(5); ow_reset(); ds18write_byte(0xCC); // 跳过 ROM ds18write_byte(0xBE); // 读暂存器 for(k=0;k<2;k++){get[k]=DSread_byte();} temp_m***= get[1]; // Sign byte + l***it temp_l***= get[0]; // Temp data plus l*** t=temp_m****256+temp_l***; t=t&0x0ff0; if(t<0xff&&t>0xf0) t=(-1)*t; returnt>>4; //temp_f= (((int)temp_c)* 9)/5 + 32; // 输出华氏温度值 |
|
相关推荐
|
|
1997 浏览 0 评论
1130 浏览 0 评论
3465 浏览 1 评论
2810 浏览 0 评论
这是汽车360全景控制器上的主板,请问圆圈中的原件是什么,起什么作用?
2579 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-20 21:19 , Processed in 0.642126 second(s), Total 72, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号