基于msp430单片机和ds18b20使用数码管显示的温度测量_毕业设计论文(编辑修改稿)内容摘要:

出并处理 DS18B20的测量温度值,温度测量没 1s 进行一次,其程序流程 如图: Vcc Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 LP OE D0 D1 D2 D3 D4 D5 D6 D7 GND 74HC573 9 DS18B20的子程序 DS18B20的一线工作协议流程是: 初始化→ ROM 操作指令→存储器操作指令→数据传输。 其工作时序包括: 初始化 到达 1s。 调用显示子程序 初次上电。 读出温度值,温度计算 处理显示数据刷新 温度转换开始命令 是 否 否 是 10  初始化时序  写时序  读时序 1 初始化时序 主机首先发出一个 480- 960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的 480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。 若无低电平出现一直都是高电平说明总线上无器件应答。 做为从器件的 DS18B20在一上电后就一直在检测总线上是否有480- 960微秒的低电平出现,如果有,在总线转为高电平后等待15- 60微秒后将总线电平拉低 60- 240微秒做出响应存在脉冲,告诉主机本器件已做好准备。 若没有检测到就一直在检测等待。 11 图 4 初始化时序时间图 程序 C 代码如下: //初始化 DS18B20 void DS18B20Init(void){ DQ_OUT。 //设置为输出方向 DQ_LOW。 //拉低总线 Delayus(50)。 DQ_HIGH。 //释放总线 Delayus(6)。 12 DQ_IN。 //设置为输入方向 while(DQ_DATA)。 //等待应答信号 while(~DQ_DATA)。 //等待释放总线 } 2 写时序 接下来就是主机发出各种操作命令,但各种操作命令都是向DS18B20写 0和写 1组成的命令字节,接收数据时也是从 DS18B20读取0或 1的过程。 因此首先要搞清主机是如何进行写 0、写 读 0和读 1的。 写周期最少为 60微秒,最长不超过 120微秒。 写周期一开始做为主机先把总线拉低 1微秒表示写周期开始。 随后若主机想写 0,则继续拉低电平最少 60微秒直至写周期结束,然后释放总线为高电平。 若主机想写 1,在一开始拉低总 线电平 1微秒后就释放总线为高电平,一直到写周期结束。 而做为从机的 DS18B20则在检测到总线被拉底后等待 15微秒然后从 15us 到 45us 开始对总线采样,在采样期内总线为高电平则为 1,若采样期内总线为低电平则为 0。 13 图 5 写时序图 程序 C 代码如下: //写一个字节 void WriteByte(uchar WriteData){ uchar i。 uchar tmpData。 for(i=0。 i8。 i++){ tmpData=WriteDataamp。 0x01。 WriteData=1。 DQ_OUT。 14 DQ_LOW。 if(tmpData){ DQ_HIGH。 } else{ DQ_LOW。 } Delayus(5)。 DQ_HIGH。 } } 3 读时序 对于读数据操作时序也分为读 0时序和读 1时序两个过程。 读时隙是从主机把单总线拉低之后,在 1微秒之后就得释放单总线为高电平,以让 DS18B20把数据传输到单总线上。 DS18B20在检测到总线被拉低 1微秒后,便开始送出数据,若是要送出 0就把总线拉为低电平直到读周期结束。 若要送出 1则释放总线为高电平。 主机在一开始拉低总线 1微秒后释放总线,然后在包括前面的拉低总线电平 1微秒在内 15 的 15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为 0。 采样期内总线为高电平则确认为 1。 完成一个读时序过程,至少需要 60us 才能完成。 图 6 读时序图 程序 C 代码如下: //读一个字节 uchar ReadByte(void){ uchar i。 uchar ReadData=0。 for(i=0。 i8。 i++){ 16 DQ_OUT。 DQ_LOW。 ReadData=1。 DQ_HIGH。 Delayus(1)。 DQ_IN。 if(DQ_DATA) ReadData|=0x80。 Delayus(6)。 } return ReadData。 } 温度计算子程序 DS18B20中的温度传感器完成对温度的测量,用 16位二进制形式提供,形式表达,其中 S 为符号位。 17 图 7 DS18B20的 16位二进制形式 例 如+ 125℃的数字输出为 07D0H (正温度 直接吧 16进制数转成 10进制即得到温度值 ) 55℃的数字输出为 FC90H。 (负温度 把得到的 16进制数 取反后 加 1 再转成 10进制数) 程序 C 代码如下: //温度计算程序 void GetT(){ if((MSBamp。 0xF0)0){ //判断是否为负温度 flag=1。 }else{ flag=0。 23 S LS Byte MS Byte 22 21 20 21 22 32 24 S S S S 26 52 24 bit7 bit6 bit15 bit4 bit3 bit2 bit1 bit0 bit15 bit14 bit13 bit12 bit11 bit10 bit9 bit8 18 } if(flag){ //如果为负温度取反加 1 MSB=~MSB。 LSB=~LSB+1。 } t1=MSB4。 //得到温度整数部分 t1|=(LSB4)。 //计算各位数码管要显示的数值 if(flag){ Bit[1]=16。 //如果为负温度则显示 }else{ Bit[1]=t1/100。 } Bit[2]=t1%100/10。 Bit[3]=t1%10。 } 19。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。