基于单片机的二氧化碳浓度器设计_毕业设计(编辑修改稿)内容摘要:
1Wire 总线协议处理 经过单线接口访问 DS1820 的协议 protocol 如下 初始化 ROM 操作命令 存贮器操作命令 处理数据 初始化 单线总线上的所有处理均从初始化序列开始初始化序列包括总线主机 发出一复位脉冲接着由从属器件送出存在脉冲。 完成这个功能的代码如下: /************************************************************ *Function:18B20初始化 *parameter: *Return: *Modify: *************************************************************/ void Init18b20 (void) { dq=1。 _nop_()。 dq=0。 TempDelay(86)。 //delay 530 uS 主机发出复位脉冲 XXVIII _nop_()。 dq=1。 TempDelay(14)。 //delay 100 uS _nop_()。 _nop_()。 _nop_()。 if(dq==0) //检测从属器件送出存在脉冲 flag = 1。 //detect 1820 success! else flag = 0。 //detect 1820 fail! TempDelay(20)。 //20 _nop_()。 _nop_()。 dq = 1。 } ROM 操作命令 一旦总线主机检测到从属器件的存在它便可以发出器件 ROM 操作命令之一所有 ROM 操作命令均为 8 位长, ROM操作命令由 1Wire的单字节读写命令完成。 /************************************************************ *Function:向 18B20写入一个字节 *parameter: *Return: *Modify: ************************************************************* XXIX / void WriteByte (uchar wr) /*单字节写入 */ { uchar i。 for (i=0。 i8。 i++) { dq = 0。 _nop_()。 dq=wramp。 0x01。 TempDelay(5)。 //delay 45 uS //5 _nop_()。 _nop_()。 dq=1。 wr = 1。 } } /************************************************************ *Function:读 18B20的一个字节 *parameter: *Return: *Modify: *************************************************************/ uchar ReadByte (void) /*读取单字节 */ { XXX uchar i,u=0。 for(i=0。 i8。 i++) { dq = 0。 u = 1。 dq = 1。 if(dq==1) u |= 0x80。 TempDelay (4)。 _nop_()。 } return(u)。 } 有了上面的基本函数,我们可以完成具体的 ROM操作了 举例总线主机产生温度变换命令然后读出温度,如下表所示: 表 读温度 主机方式 数据 LSB 在先 注 释 TX Reset(复位 ) 复位脉冲 480_960us RX Presence(存在) 存在脉冲 TX 55h 符合 ROM 命令 TX 64位 ROM代码 发出 DS1820 地址 TX 44h 温度 变换命令 TX I/O 线高电平 总线主机使 I/O 线至少保持 2 秒钟的高电平以便完成变换 XXXI TX Reset 复位 复位脉冲 RX Presence 存在 存在脉冲 TX 55h 符合 ROM 命令 TX 64 位 ROM 代码 发出 DS1820 地址 TX Beh 读暂存存贮器命令 RX 9 个数据字节 读整个暂存存储器以及 CRC 主机现在重新计算机从暂存存储器接收来的 8 位数据字节的 CRC 并把计算得到的 CRC 与读出的 CRC 比较如果二者相符主机继续操作如果不符重复此读操作 TX Reset 复位复位脉冲 RX Presence 存在存在脉冲操作完成 完成这部分功能的代码如下 /************************************************************ *Function:CRC校验 *parameter: *Return: *Modify: *************************************************************/ uchar CRC (uchar j) { uchar i,crc_data=0。 XXXII for(i=0。 ij。 i++) crc_data = CrcTable[crc_data^temp_buff[i]]。 return (crc_data)。 } /************************************************************ *Function:读取温度 *parameter: *Return: *Modify: *************************************************************/ void GemTemp (void) { read_bytes (9)。 if (CRC(9)==0) /*校验正确 */ { Temperature = temp_buff[1]*0x100 + temp_buff[0]。 // Temperature *=。 Temperature *= 10。 Temperature /= 16。 TempDelay(1)。 } } /************************************************************ *Function:读 18B20ID XXXIII *parameter: *Return: *Modify: *************************************************************/ void ReadID (void)/*读取器件 id*/ { Init18b20()。 WriteByte(0x33)。 //read rom read_bytes(8)。 } /************************************************************ *Function:18B20ID全处理 *parameter: *Return: *Modify: *************************************************************/ void TemperatuerResult(void) { p = id_buff。 ReadID()。 Init18b20 ()。 WriteByte(0xcc)。 //skip rom WriteByte(0x44)。 //Temperature convert XXXIV Init18b20 ()。 WriteByte(0xcc)。 //skip rom WriteByte(0xbe)。 //read Temperature p = temp_buff。 GemTemp()。 } 这里要说明的是 : 1Wire协议提供了一种检测数据是否存在着传输错误的手段 ,就是 CRC校验。 1Wire CRC 校验处理 DS1820有一包括 64位 ROM 的最高有效字节内的 8位 CRC,总线上的主机可以根据 64位 ROM的前 56位计算 CRC的值并把它与存贮在 DS1820内的值进行比较以决定 ROM的数据是否已被主机正确地接收, CRC的等效多项式函数为 CRC=X8+X5+X4+1。 DS1820在传递数据时也利用与上述相同的多项式函数产生一个 8位CRC值,并把此值提供给主机以确认数据字节的传送,在使用 CRC来确认数据传送的每一种情况中,总线主机必须使用上面给出的多项式函数计算 CRC的值,并把计算所得的值或者与存贮在 DS1820 的 64 位 ROM 部分中的 8 位 CRC 值,或者与 DS1820 中计算得到的 8 位 CRC值(在读暂存存贮器中时它作为第九个字节被读出)进行比较。 总线 CRC可以使用如图 所示由一个移位寄存器和异或 XOR 门组成的多项式产生器来产生。 XXXV 图 移位寄存器和异或 XOR门 移位寄存器的所有位被初始化为零然,后从产品系列编码的最低有效位开始,每次移入一位。 当产品系列编码的 8 位移入以后,接着移入序列号,在序列号的第 48 位进入之后,移位寄存器便包含了 CRC 值,移入 CRC 的 8 位应该使移位寄存器返回至全零。 完成 CRC校验的代码如下: uchar crc_data。 uchar code CrcTable [256]={ 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255, 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7, 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80, 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238, 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115, 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139, XXXVI 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22, 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168, 116,。基于单片机的二氧化碳浓度器设计_毕业设计(编辑修改稿)
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。
用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。