资源描述
过温报警器课程设计说明书 电子技术课程课程设计 题 目: 过 温 报 警 器 院 别: 机电学院 专 业: 机电工程 班 级: 姓 名: 学 号: 指导教师: 二一三年十二月二十一日摘 要随着科技的不断进步,在工业生产中温度是常用的被控参数,而采用单片机来对这些被控参数进行控制已成为当今的主流。本设计介绍了数字温度测量及自动控制系统的设计。本设计采用单片机来实现对温度的控制。它的主要组成部分有:AT89C52单片机、温度传感器、显示电路、温度控制电路。它可以实时的显示和设定温度,实现对温度的自动控制。通过测试表明,本设计对温度的控制有方便、简单的特点,从而大幅提高了被控温度的技术指标。本次课程设计采用单片机以及锁存器、数码管、DS18B20温度传感器、蜂鸣器等组成简单的过温报警器,该过温报警器测温准确,使用方便,显示清晰。关键词过温报警器;锁存器;STC89C52RC;单片机;DS18B20温度传感器Over temperature alarmAbstractWith the constant progress of science and technology, temperature is a accused parameter commonly used in industrial production. At present, USESING the single chip microcomputer to control these accused parameters has become the mainstream. This design introduces the measurement of digital temperature and the design of automatic control system. This design USES the single chip microcomputer to control the temperature, whose main components are: AT89C52 single chip computer, temperature sensor, temperature control circuit, display circuit. It can display in real time, set temperature and control the temperature automatically. The test shows that it is not only convenient but also simple in controlling the temperature, which will raise the technique index of accused temperature.Key words:Over temperature alarm; Latch; STC89C52RC; MCU; DS18B20 temperature sensor目 录一、前言:11、设计目的:12、功能要求:1二、设计原理及其方案:11、方案:12、原理:2三、设计过程31、元件采购(购买地点:赛格尔电子城):32.电路设计及其制图33、焊接44、调试54.1硬件调试54.2 KeiL调试64.3开发板调试6四、设计作品介绍及其使用说明71、硬件设计71.1.1 STC89C5281.1.1.1简介:81.1.1.2参数:81.1.2触发器74HC57391.1.3蜂鸣器101.1.4 LED111.1.5 DS18B20131.1.5.1 DS18B20性能131.1.5.2 DS18B20外形及引脚说明131.1.5.3 DS18B20接线原理图142、软件设计:143、仿真软件的介绍15五、 设计心得16六、参考文献17七、致谢17八、附录181、组分工安排明细以及进程安排表182、编码程序如下18一、前言:1、设计目的:(1)在学习了数字电子技术和单片机原理及应用这两门课程之后,为了加深对理论知识的理解,学习理论知识在实际中的应用,培养动手能力和解决问题的能力。(2)熟悉Keil及Ptoteus软件的调试和仿真。(3)通过实验提高对数字电路的认识。(4)启发学生的思维,锻炼他们团结互助的精神。2、功能要求:(1)、实时显示当前温度数值(2)、具有过温报警功能(3)、能调整调整指定温度(4)、达到指定的温度蜂鸣器发出声音二、设计方案及其原理:1、方案:方案一:由于本设计是测温电路,可以使用热敏电阻之类的器件,将随被测温度变化的电压或电流采样,进行A/D转换后就可以用单片机进行数据处理,实现温度显示。这种设计需要用到A/D转换电路,增大了电路的复杂性,而且要做到高精度也比较困难。方案二:考虑到在单片机属于数字系统,容易想到数字温度传感器,可选用DS18B20数字温度传感器,此传感器为单总线数字温度传感器,其体积小、构成的系统结构简单,它可直接将温度转化成串行数字信号给单片机处理,即可实现温度显示。另外DS18B20具有3引脚的小体积封装,测温范围为-55+125摄氏度,测温分辨率可达0.0625摄氏度,其测量范围与精度都能符合设计要求。通过以上两种方案的比较,可以得出第二种方案的电路、软件设计更简单,此方案设计的系统在功耗、测量精度、范围等方面都能很好地达到相应的要求,故本设计采用方案二。2、原理:整个过温报警器电路的工作原理是:在正常的供电状态下,首先利用单片机从DS18B20(温度传感器)处理接收的相应数据,然后经其处理后并将相应的数据分别传送到相应的数码管和蜂鸣器接收口,从而使数码管和蜂鸣器做出相应的反应。数 码管ST89C52基本系统DS18B20(温度传感器)电 源蜂鸣器图1.1 数字电子钟总设计框图三、设计过程1、元件采购(购买地点:赛格尔电子城):电子元件数量单价印刷电路板17数码管(4位共阴)12STC89C52RC1774HC573(锁存器)21.5蜂鸣器11自锁开关20.5按键20.1DS18B20(温度传感器)10.5排式电阻10.5电容20.5晶振11电阻112.2USB下载器16数据线12表1 电子时钟原件清单2.电路设计及其制图软件类型软件名称软件版本画图、仿真ProteusV7.8编程、调试KeilUV4烧录程序STC-ISPV4.8其他MCU小助手1.0表2 电路设计及其制图3、焊接焊接电路的过程最困难的是对电路图的分析和元器件的正负极的熟悉,所以要焊好一块完好的电路板。首先要做的就是先对电路图进行细致的分析,然后再对各元器件的引脚的区别进行熟悉,再然后就是将各元器件进行排版再通过相应的工具进行焊接,最后就是检查焊接完成的电路板是否存在短路之类的问题。图1.2 各元器件引脚的识别图图1.3焊接电路板的实物工具图4、调试4.1硬件调试硬件调试的调试比较困难。因为单片机系统的硬件调试和软件调试是不能分开的,许多硬件错误是在软件调试中被发现和纠正的。但通常是先排除明显的硬件故障以后,再和软件结合起来调试以进一步排除故障。可见硬件的调试是基础,如果硬件调试不通过,软件设计则是无从做起。而调试的整体过程是,先对硬件进行静态调试,再是对硬件进行系统和软件调试。硬件的静态调试:1. 排除逻辑故障这类故障往往由于设计和加工制板过程中工艺性错误所造成的。主要包括错线、开路、短路。排除的方法是首先将加工的印制板认真对照原理图,看两者是否一致。应特别注意电源系统检查,以防止电源短路和极性错误,并重点检查系统总线(地址总线、数据总线和控制总线)是否存在相互之间短路或与其它信号线路短路。必要时利用数字万用表的短路测试功能,可以缩短排错时间。2. 排除元器件失效造成这类错误的原因有两个:一个是元器件买来时就已坏了;另一个是由于安装错误,造成器件烧坏。可以采取检查元器件与设计要求的型号、规格和安装是否一致。在保证安装无误后,用替换方法排除错误。3. 排除电源故障在通电前,一定要检查电源电压的幅值和极性,否则很容易造成集成块损坏。加电后检查各插件上引脚的电位,一般先检查VCC 与GND 之间电位,若在4.8V5V 之间属正常。若有高压,联机仿真器调试时,将会损坏仿真器等,有时会使应用系统中的集成块发热损坏。硬件的系统、软件调试:1.电路的调试主要看接口以及连线是否正确。依次检查,直到正常工作。2.本系统的软件系统较大,全部采用C语言编写,除语法与逻辑差错外,当确认程序没问题时,直接下载到单片机仿真调试。采取自下到上的方法,单独调好每一个模块,最后完成一个完整的系统调试。4.2 KeiL调试启动Keil软件,选择“Project”菜单下的“New Project”命令,输入项目的文件名,选择存储路径,点击“保存”按钮。在“Select Device”窗口中选择“Atmel”下的“AT89C51” 芯片,单击“确定”按钮。展开“Project Workspace”窗口中的“Target 1”, 右击 “Target 1”,选择“Options for Target Target 1”,选择“Target”选项在Keil (MHZ)右边输入“12m”。选择“Debug”选项,选择“Use Keil Monitor-51 Driver”。单击“Settings”按钮,串口选择“COM1”,波特率选择“38400”,单击“OK”按钮。右击“Source Group 1”,选择“Add files to Group Source Group 1,在文件类型中选择“Asm Source file”,找到将要编译的程序,单击 “ADD”按钮,然后再单击“CLOSE”按钮。单击“Rebuild all target files”,在“Build”窗口中观察编译结果,根据提示修改程序,直到没有错误出现。4.3开发板调试根据程序的设计在开发板上分别连接好各个端口的连接线,用串口线把计算机和试验箱的仿真头连接好。单击Keil软件上的“Start/Stop Debug Session”按钮,再单击“RUN”按钮,运行程序。观察开发板上出现的效果,分析程序的对错,直到调试出正确的结果。图1.4开发板实物图四、设计作品介绍及其使用说明1、硬件设计本课程设计中硬件电路主要由STC89C52、外部数码管、触发器74HC573、蜂鸣器、晶振管、DS18B20(数字温度传感器)等构成。(如图1.5) 图1.5 电路板元器件标注图根据要求我所制作的电路原理图用仿真软件画得如下图1.6图1.6 Protues仿真电路图1.1.1 STC89C521.1.1.1 简介 STC89C52是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,2个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC89X52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。 图1.7 引脚说明以及实物图1.1.1.2参数:1. 工作电压:5.5V3.3V(5V 单片机)/3.8V2.0V(3V 单片机) 2. 工作频率范围:040MHz,相当于普通8051 的080MHz,实际工作 频率可达48MHz 3. 用户应用程序空间为8K 字节 4. 片上集成512 字节RAM 5. 通用I/O 口(32 个),复位后为:P0/P1/P2/P3 是准双向口/弱上拉, P0 口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为 I/O 口用时,需加上拉电阻。 6. ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无 需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程 序,数秒即可完成一片 7. 具有EEPROM 功能 8. 具有看门狗功能 9. 共3 个16 位定时器/计数器。即定时器T0、T1、T2 10. 外部中断4 路,下降沿中断或低电平触发电路,Power Down 模式可 由外部中断低电平触发中断方式唤醒 11. 通用异步串行口(UART),还可用定时器软件实现多个UART 12. 工作温度范围:-40+85(工业级)/075(商业级) 13. PDIP 封装1.1.2触发器74HC573图1.8触发器的引脚标注图1.9 74HC573内部原理图1.1.3蜂鸣器蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。蜂鸣器在电路中用字母“H”或“HA”(旧标准用“FM”、“LB”、“JD”等)表示。蜂鸣器驱动电路一般都包含以下几个部分:一个三极管、一个蜂鸣器、一个续流二极管和一个电源滤波电容。 1蜂鸣器 发声元件,在其两端施加直流电压(有源蜂鸣器)或者方波(无源蜂鸣器)就可以发声,其主要参数是外形尺寸、发声方向、工作电压、工作频率、工作电流、驱动方式(直流/方波)等。这些都可以根据需要来选择。 2续流二极管 蜂鸣器本质上是一个感性元件,其电流不能瞬变,因此必须有一个续流二极管提供续流。否则,在蜂鸣器两端会产生几十伏的尖峰电压,可能损坏驱动三极管,并干扰整个电路系统的其它部分。 3滤波电容 滤波电容C1的作用是滤波,滤除蜂鸣器电流对其它部分的影响,也可改善电源的交流阻抗,如果可能,最好是再并联一个220uF的电解电容。 4三极管 三极管Q1起开关作用,其基极的高电平使三极管饱和导通,使蜂鸣器发声;而基极低电平则使三极管关闭,蜂鸣器停止发声。图2.0 蜂鸣器的电路原理结构图1.1.4 LED1.1.4.1简介:LED数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。图2.2(a)是共阴和共阳极数码管的内部电路图,它们的发光原理是一样的,只是它们的电源极性不同而已。将多只LED的阴极连在一起即为共阴式,而将多只LED的阳极连在一起即为共阳式。以共阴式为例,如把阴极接地,在相应段的阳极接上正电源,该段即会发光。当然,LED的电流通常较小,一般均需在回路中接上限流电阻。假如我们将b和c段接上正电源,其它端接地或悬空,那么b和c段发光,此时,数码管显示将显示数字“1”。而将a、b、d、e和g段都接上正电源,其它引脚悬空,此时数码管将显示“2”。其它数字的显示原理与此类同。LED的7段数码管利用单只LED组合排列成“8”字型的数码管,分别引出它们的电极,点亮相应的点划来显示出0-9的数字。在这次的设计中采用的均是共阴极的LED显示,当I/O口输出为高电平的时候,对应段就被点亮。LED数码管的结构图如图2.2(b)所示。 (a)(b)图2.1 LED分类结构图和结构图这次设计的显示部分采用STC89C52单片机动态扫描完成,其在多数的应用场合中,我们并不希望使用多I/O端口的单片机,原则上是使用尽量少引脚的器件。在没有富余端口的情况下,应通过优化设计程序和扩展电路达到预期的目的。动态扫描的频率有一定的要求,频率太低,LED将出现闪烁现象。如频率太高,由于每个LED点亮的时间太短,LED的亮度太低,肉眼无法看清,所以一般均取几个ms左右为宜,这就要求在编写程序时,选通某一位LED使其点亮并保持一定的时间,程序上常采用的是调用延时子程序。1.1.4.2 LED显示电路(1)静态显示电路LDE显示器工作在静态显示时,其公共阳极(或阴极) 接VCC(或GND) ,一直处于显示有效状态,所以每一位的显示内容必须由锁存器加以锁存,显示各位相互独立。(2) 动态显示电路 将所有位的段选线的同名端联在一起,由一个8位I/O口控制,形成段选线的多位复用。而各位的公共阳极或公共阴极则分别由相应的I/O口线控制,实现各位的分时选通,即同一时刻只有被选通位是能显示相应的字符,而其他所有位都是熄灭的。由于人眼有视觉暂留现象,只要每位显示间隔足够短,则会造成多位同时点亮的假象。这就需要单片机不断地对显示进行控制,CPU需要不断地进行显示刷新,动态显示电路参见图2.3,图2.3中是扩展了五位的LED数码管显示,用一个74LS04作为五个LED的段选输入,采用动态显示的方式连接。类似地,16位的LED数码管显示也可以用这种方法来实现。 图2.2 五位LED数码管的动态显示结构图1.1.5 DS18B20(数字温度传感器)1.1.5.1 DS18B20性能l 独特的单线接口仅需一个端口引脚进行通信l 简单的多点分布应用l 无需外部器件l 可通过数据线供电l 零待机功耗l 测温范围-55+125,以0.5递增l 可编程的分辨率为912位,对应的可分辨温度分别为0.5、0.25、0.125和0.0625l 温度数字量转换时间200ms,12位分辨率时最多在750ms内把温度转换为数字l 应用包括温度控制、工业系统、消费品、温度计和任何热感测系统l 负压特性:电源极性接反时,传感器不会因发热而烧毁,但不能正常工作1.1.5.2 DS18B20外形及引脚说明图2.3 DS18B20外形及引脚图l GND:地l DQ:单线运用的数据输入/输出引脚l VD:可选的电源引脚1.1.5.3 DS18B20接线原理图单总线通常要求接一个约4.7K左右的上拉电阻,这样,当总线空闲时,其状态为高电平。图2.3 DS18B20接线原理图2、软件设计: 系统主程序流程图如下图DS18B20初始化跳过读序列号数据转换处理跳过读序列号启动温度转换读取温度值高低位延时数码管显示实时温度系统将实时温度与报警温度比较DS18B20初始化返回蜂鸣器发出声音、LED灯闪烁返回入口 图2.4 主程序流程图 3、仿真软件的介绍Proteus 软件所提供了30多个元件库,数千种元件。元件涉及到数字和模拟、交流和直流等。对于一个仿真软件或实验室, 测试的仪器仪表的数量、 类型和质量, 是衡量实验室是否合格的一个关键因素。在Proteus软件包中,不存在同类仪表使用数量的问题。Proteus还提供了一个图形显示功能,可以将线路上变化的信号,以图形的方式实时地显示出来,其作用与示波器相似但功能更多。Proteus ISIS是英国Labcenter公司开发的电路分析与实物仿真软件。它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件的特点是:1.实现了单片机仿真和SPICE电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。 2.支持主流单片机系统的仿真。目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。3.提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision2等软件。4.具有强大的原理图绘制功能。总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大。单片机电路的模拟调试选中单片机STC89C52,左键点击STC89C52,在出现的对话框里点击Program File按钮,找到刚才编译得到的HEX文件,然后点击“OK”按钮就可以模拟了。点击模拟调试按钮的运行按钮 ,进人调试状态。我们还可以单步模拟调试,点击按钮,进人单步调试状态, 在单步模拟调试状态下,点击菜单栏的“Debug”,点击Simulation Log会出现和模拟调试有关的信息。总而言之,利用此两软件的有效结合使得数字电子钟能够在模拟的环境下进行。因此,可以让我在制作实物时,先进行软件的调试和模拟,使得制作实物时能够更加有效的减少错误。五、 设计心得此次课程设计中,难点在于DS18B20的使用,即对它的时序控制、初始化以及字节读写方法,任何一个环节出错或是时序控制不到位的话就不能得到正确的数据。一旦学会了正确的使用方法,就能感觉到它带来的便利是热电偶不能比拟的,以后再次使用的话就能很快上手了。软件设计中,把程序按功能分模块的话能提高编程效率,把问题一一解决,同时画流程图能帮助理清思路,使问题简单化。定义变量时,尽量定义局部变量,在字符型变量能达到要求的情况下就不用定义成整形变量了,以节省内存空间。同时局部变量应避免与全局变量取同名,否则全局变量将被屏蔽或与局部变量相冲突而达不到设计的效果。另一方面,取变量名时也要讲究技巧,应尽量使其见名知意,同样地,写程序时加注释确是非常必要的,否则隔一段时间后,想再改进或做扩展的话就比较困难了,因为即使是自己写的程序也变得难读难懂了。此设计中没有为温度的单位(摄氏度)准备专用的数码管来显示,若单独用一个数码管显示“C”来代替“”的话,看起来感觉很别扭。偶然想起如若用一个数码管的上半部显“0”,即a、b、f、g段点亮,来代替“”左上角的“度”的话,效果应该不错,便作了一试,发现这是确是一个很好的主意。但是由于本设计中并不要求有单位的存在,故没有采用这个办法来显示温度单位。总的来说,从通过理论设计,到确定具体方案,再到编译程序,最后到调试、成型。整个过程都需要充分利用所有知识进行思考、借鉴。本次设计是针对相关知识进行的一次比较综合的检验,也是目前为止我觉得受益匪浅是收获最大的一次课程设计。在做本次设计的过程中,我感触最深的就是查阅大量的设计资料了。因为在查阅的过程中,其不仅丰富了自己的一些课外知识,还巩固了课堂上所学的知识。与此同时,我觉得为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的。六、参考文献1徐爱钧主编 单片机原理实用教程 电子工业出版社2阎石主编 数字电子技术基本教程 清华大学出版社3郭天祥主编 51单片机C语言教程 电子工业出版社4蔺鹏,柴世红. 基于AT89C51单片机与DS18B20的温度测量系统J. 甘肃科技 2008,24(9)2013-12-15. doi:10.3969/j.issn.1000-0952.2008.09.0135王海燕,杨艳华. Proteus和Keil软件在单片机实验教学中的应用J. 实验室研究与探索 2012,31(5) 2013-12-17. doi: 10.3969/j.issn.1006-7167.2012.05.027 6吴健,候文,郑宾. 基于STC89C52单片机的温度控制系统J. 电脑知识与技术 2011,07(4)2013-12-16. doi:10.3969/j.issn.1009-3044.2011.04.076七、致谢在这个课程设计过程中,很感谢老师的指导,从一开始,老师在课堂上讲了很多关于这方面的知识,包括触发器、三极管,组合设计等,而单片机的学习也为我们这次课程设计提供了很多的基础。在课程设计的过程中,跟老师的交流也启发了我们很多的想法,尽管在这其中堆积了很多的问题,但是老师也是很耐心的指导我们应该怎么去做。本次课程设计是在刘杨华老师的悉心指导下完成的,从课题的选择到说明书的最终完成的每一个环节,自始自终得到了老师的细心指导和帮助。经过此次课程设计,我即巩固了已学过的专业知识,又学到了许多新知识。通过理论和实践相结合,使得我在这期间所学到的各方面知识得以融会贯通。在体会实际工作困难的同时,也深深的体会到实践与理论的差距。设计中,既要全面掌握理论知识,又要洞悉实际元器件的工作原理;既要有信心,又要有耐心,其流程设计的思路更为重要。通过查阅资料和请教老师,丰富了自己的理论知识,开阔了见识,对实际问题也有了全面的了解和掌握,在设计的过程中,我得到了老师的大力帮助,尤其得到了刘杨华老师的帮助,她给予了我无微不至的指导和帮助。对此向本次课程设计中给予过我帮助的老师和同学致上我最真挚的谢意。八、附录1、组分工安排明细以及进程安排表时间安排备注(负责人)周一上午设计原理及设计方案讨论陈婕妤、甘通权周一下午元器件采购以及电路设计及其制图李荣波、林舜亮周二上午焊接、调试电路刘伟华、林鹏周二下午设计作品介绍及其使用说明李凯文、蓝新梅周三上午设计心得总结周 榕另外: 展示、介绍 李凯文、蓝新梅 答辩 陈婕妤、甘通权 电路绘图及仿真 刘伟华、周 榕 检查设计介绍及其使用说明 林 鹏、林舜亮、李荣波2、编码程序如下#include #include #define uchar unsigned char#define uint unsigned intsbit led=P17;sbit buzzer=P23;sbit DQ = P10; /数据口define interfacesbit dula = P21; /数码管段选sbit wela = P20; /数码管位选uchar A1,A2,A3,A4;uint temp; /温度值 variable of temperatureuchar num,num1;float tt;uchar a,b;/不带小数点unsigned char code table = 0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d, 0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71;/带小数点unsigned char code table1 = 0 xbf,0 x86,0 xdb,0 xcf,0 xe6,0 xed,0 xfd,0 x87,0 xff,0 xef;/*精确延时函数*/void delay(unsigned char i) while(-i); /*此延时函数针对的是12Mhz的晶振delay(0):延时518us 误差:518-2*256=6delay(1):延时7us (原帖写5us是错的)delay(10):延时25us 误差:25-20=5delay(20):延时45us 误差:45-40=5delay(100):延时205us 误差:205-200=5delay(200):延时405us 误差:405-400=5*/*DS18B20*/void Init_Ds18b20(void) /DS18B20初始化send reset and initialization commandDQ = 1; /DQ复位,不要也可行。delay(1); /稍做延时DQ = 0; /单片机拉低总线delay(250); /精确延时,维持至少480usDQ = 1; /释放总线,即拉高了总线delay(100); /此处延时有足够,确保能让DS18B20发出存在脉冲。uchar Read_One_Byte() /读取一个字节的数据read a byte date /读数据时,数据以字节的最低有效位先从总线移出uchar i = 0;uchar dat = 0;for(i=8;i0;i-) DQ = 0; /将总线拉低,要在1us之后释放总线 /单片机要在此下降沿后的15us内读数据才会有效。 _nop_(); /至少维持了1us,表示读时序开始 dat = 1; /让从总线上读到的位数据,依次从高位移动到低位。 DQ = 1; /释放总线,此后DS18B20会控制总线,把数据传输到总线上 delay(1); /延时7us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us内的最后部分 if(DQ) /控制器进行采样 dat |= 0 x80; /若总线为1,即DQ为1,那就把dat的最高位置1;若为0,则不进行处理,保持为0 delay(10); /此延时不能少,确保读时序的长度60us。return (dat);void Write_One_Byte(uchar dat)uchar i = 0;for(i=8;i0;i-) DQ = 0; /拉低总线 _nop_(); /至少维持了1us,表示写时序(包括写0时序或写1时序)开始 DQ = dat&0 x01; /从字节的最低位开始传输 /指令dat的最低位赋予给总线,必须在拉低总线后的15us内, /因为15us后DS18B20会对总线采样。 delay(10); /必须让写时序持续至少60us DQ = 1; /写完后,必须释放总线, dat = 1; delay(1);uint Get_Tmp() /获取温度get the temperatureInit_Ds18b20(); /初始化Write_One_Byte(0 xcc); /忽略ROM指令Write_One_Byte(0 x44); /温度转换指令Init_Ds18b20(); /初始化Write_One_Byte(0 xcc); /忽略ROM指令Write_One_Byte(0 xbe); /读暂存器指令a = Read_One_Byte(); /读取到的第一个字节为温度LSBb = Read_One_Byte(); /读取到的第一个字节为温度MSBtemp = b; /先把高八位有效数据赋于temptemp =2500)EA=1; else led=1; buzzer=0; EA=0; void T0_time()interrupt 1TH0=(65536-45872)/256;TL0=(65536-45872)%256;num1+;if(num1=6) num1=0;led=led; buzzer=buzzer;35
展开阅读全文