简易数字式温度计的设计(编辑修改稿)内容摘要:

return (flag)。 //返回检测成功标志 } /***************************************************** 函数功能:从 DS18B20读取一个字节数据 出口参数: dat ***************************************************/ uchar ReadOneChar(void) { uchar i=0。 uchar dat。 //储存读出的一个字节数据 for (i=0。 i8。 i++) { DQ =1。 // 先将数据线拉高 _nop_()。 //等待一个机器周期 DQ = 0。 //单片机从 DS18B20读书据时 ,将数据线从高拉低即启动读时序 _nop_()。 //等待一个机器周期 DQ = 1。 //将数据线 人为 拉高 ,为单片机检测 DS18B20的输出电平作准备 for(time=0。 time2。 time++)。 //延时约 6us,使主机在 15us 内采样 dat=1。 if(DQ==1) dat|=0x80。 //如果读到的数据是 1,则将 1存入 dat else dat|=0x00。 //如果读到的数据是 0,则将 0存入 dat //将单片机检测到的电平信号 DQ存入 r[i] for(time=0。 time8。 time++)。 //延时 3us,两个读时序之间必须有大于 1us的恢复期 } return(dat)。 //返回读出的十六进制数据 } /***************************************************** 函数功能:向 DS18B20写入一个字节数据 入口参数: dat ***************************************************/ WriteOneChar(uchar dat) { uchar i=0。 for (i=0。 i8。 i++) { DQ =1。 // 先将数据线拉高 _nop_()。 //等待一个机器周期 DQ=0。 //将数据线从高拉低时即启动写时序 DQ=datamp。 0x01。 //利用与运算取出要写的某位二进制数据 , //并将其送到数据线上等待 DS18B20采样 for(time=0。 time10。 time++)。 //延时约 30us, DS18B20在拉低后的约 15~60us期间从数据线上采样 DQ=1。 //释放数据线 for(time=0。 time1。 time++)。 //延时 3us,两个写时序间至少需要 1us的恢复期 dat=1。 //将 dat中的各二进制位数据右移 1位 } for(time=0。 time4。 time++)。 //稍作延时 ,给硬件一点反应时间 } /***************************************************** 函数功能:做好读温度的准备 ***************************************************/ void ReadyReadTemp(void) { Init_DS18B20()。 //将 DS18B20初始化 WriteOneChar(0xCC)。 // 跳过读序号列号的操作 WriteOneChar(0x44)。 // 启动温度转换 delaynms(200)。 //转换一次需要延时一段时间 Init_DS18B20()。 //将 DS18B20初始化 WriteOneChar(0xCC)。 //跳过读序号列号的操作 WriteOneChar(0xBE)。 //读取温度寄存器 ,前两个分别是温度的低位和高位 } /****************************************************************************** 以下是与温度有关的显示设置 ******************************************************************************/ /***************************************************** 函数功能:显示没有检测到 DS18B20 ***************************************************/ void display_error(void) { uchar i。 WriteAddress(0x00)。 //写显示地址,将在第 1行第 1列开始显示 i = 0。 //从第一个字符开始显示 while(Error[i] != 39。 \039。 ) //只要没有写到结束标志,就继续写 { WriteData(Error[i])。 //将字符常量写入 LCD i++。 //指向下一个字符 delaynms(100)。 //延时 100ms较长时间,以看清关于显示的说明 } WriteAddress(0x40)。 //写显示地址,将在第 1行第 1列开始显示 i = 0。 //从第一个字符开始显示 while(Error1[i] != 39。 \039。 ) //只要没有写到结束标志,就继续写 { WriteData(Error1[i])。 //将字符常量写入 LCD i++。 //指向下一个字符 delaynms(100)。 //延时 100ms较长时间,以看清关于显示的说明 } while(1) //进入死循环,等待查明原因。 } /***************************************************** 函数功能 :显示温度符号 ***************************************************/ void display_symbol(void) { uchar i。 WriteAddress(0x40)。 //写显示地址,将在第 2行第 1列开始显示 i = 0。 //从第一个字符开始显示 while(Temp[i] != 39。 \039。 ) //只要没有写到结束标志,就继续写 { WriteData(Temp[i])。 //将字符常量写入 LCD i++。 //指向下一个字符 delaynms(50)。 //延时 1ms给硬件一点反应时间 } } /***************************************************** 函数功能:显示温度的小数点 ***************************************************/ void display_dot(void) { WriteAddress(0x49)。 //写显示地址,将在第 2行第 10 列开始显示 WriteData(39。 .39。 )。 //将小数点的字符常量写入 LCD delaynms(50)。 //延时 1ms给硬件一点反应时间 } /***************************。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。