基于单片机的电子密码锁的设计_课程设计任务书(编辑修改稿)内容摘要:

器件中还有一个计数门,当计数门打开时, DS18B20 就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。 计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将- 55℃所对应的一个基数分别置入减法计数器 温度寄存器中,计数器 1和温度寄存器被预置在- 55℃所对应的一个基数值。 减法计数器 1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器 1 的预置值减到 0 时,温度寄存器的值将加 1,减法计数器 1的预置将重新被装入,减法计数器 1 重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到 0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。 其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。 另外,由于 DS18B20 单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。 系统对 DS18B20 的各种操作按协议进行。 操作协议为:初使化 DS18B20(发复位脉冲)→发 ROM 功能命令→发存储器操作命令→处理数据。 由于 DS18B20 采用的“一线总线”结构,所以数据的传输与命令的通讯只要通过微处理器的一根双向 I/ o 口就可以实现。 DSl8B20 约定在每次通信前必须对其复位。 图 复位时序图 8 本文中有 AT89S52 提供, tRSTL 的最小时延为 480us ,然后释放总线,检查DSl8B20 的返回信号,看其是否已准备接受其他操作,其中 tPDHIGH 时间最小为15us ,最长不能超过 60us ,否则认为 DS18B20 没有准备好,主机应继续复位,直到检测到返回信号变为低电平为止。 表 35 DS18B20 的 ROM 操作指令 表 36 DS18B20 的存储器操作指令 主机一旦检测到 DS18B20的存在,根据 DS18B2的工作协 议,就应对 ROM进行操作,接着对存储器操作,最后进行数据处理。 在 DS18B20中规定了 5条对 ROM的操作命令。 主机在发送完 ROM操作指令之后,就可以对 DS18B20内部的存储器进行操作,同样 DS18B20规定了 6条操作指令。 DS18B20的读、写时序图见图。 图 DS18B20的读写时序图 操作指令 33H 55H CCH F0H ECH 含义 读 ROM 匹配 ROM 跳过 ROM 搜索 ROM 报警搜索 ROM 操作指令 4EH BEH 48H 44H D8H B4H 含义 写 读 内部复制 温度转换 重新调出 读电源 9 2. DS18B20 的使用方法 由于 DS18B20 采用的是 1- Wire 总线协议方式,即在一根数据线实现数据的双向传输,而对 AT89S51 单片机来说,硬件上并不支持单总线协议,因此,我们必须采用 软件的方法来模拟单总线的协议时序来完成对 DS18B20 芯片的访问。 由于 DS18B20 是在一根 I/O 线上读写数据,因此,对读写的数据位有着严格的时序要求。 DS18B20 有严格的通信协议来保证各位数据传输的正确性和完整性。 该协议定义了几种信号的时序:初始化时序、读时序、写时序。 所有时序都是将主机作为主设备,单总线器件作为从设备。 而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。 数据和命令的传输都是低位在先。 对于 DS18B20 的 读时序分为读 0时序和读 1时序两个过程。 对于 DS18B20 的读时隙是从主机把单总线拉低之后,在 15 秒之内就得释放单总线,以让 DS18B20 把数据传输到单总线上。 DS18B20 在完成一个读时序过程,至少需要 60us 才能完成。 DS18B20 的写时序 , 对于 DS18B20 的写时序仍然分为写 0时序和写 1时序两个过程 , 对于 DS18B20 写 0 时序和写 1 时序的要求不同,当要写 0 时序时,单总线要被拉低至少 60us,保证 DS18B20 能够在 15us 到 45us 之间能够正确地采样 IO 总线上的 “0”电平,当要写 1 时序时,单总线被拉低之后,在 15us 之内就得释放单线 温度传感器设计原理图及 PCB 图 10 温度传感器仿真图 温度传感器仿真 PCB 图 11 温度传感器仿真程序 include include define uchar unsigned char define uint unsigned int sbit DQ=P2^7。 uchar T。 uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f}。 void delay1(uint z) { uint x,y。 for(x=z。 x0。 x) for(y=110。 y0。 y)。 } void delay(uint N)//廷迟时间为( 24+N*16) us { int i。 for(i=0。 iN。 i++)。 } /************************************************** void init() { bit flag=1。 while (flag) { 12 while (flag) { DQ = 1。 _nop_()。 DQ = 0。 delay(50)。 DQ = 1。 delay(3)。 flag = DQ。 } delay(10)。 flag = ~DQ。 } DQ=1。 } /*********************************************** 两个初始换 都可以 /********************************************/ void init() { DQ=1。 delay(0)。 DQ=0。 delay(50)。 //廷迟 24+50*16=824us DQ=1。 delay(3)。 //48us delay(10)。 //184us DQ=1。 } 13 void write(uchar date) { uint i。 for (i=0。 i8。 i++) { DQ = 0。 DQ = date amp。 0x01。 //最低位移出 最低位先写入 //i=0:DQ=( 0101 0101 amp。 0000 0001) =0000 0001 delay(2)。 //56us 即将最 低位 1 写入, i=1 : 将 0 写入 ....... DQ=1。 date = 1。 //右移一位 } } uchar read() { uint i, value=0。 DQ=1。 _nop_()。 //一个机器周期: (1/(即晶振频率 ))*12= for (i=0。 i8。 i++) { value = value1。 //15us 之内必须读完一位 DQ = 0。 //设 i=0 :value=0101 0101 1 得到 :0010 1010 _nop_()。 // 读到的 DQ=1, 0010 1010| 1000 0000=1010 1010 _nop_()。 // i=1: value=01010101 DQ = 1。 //读到的 DQ=。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。