《毕业设计基于51单片机的温度控制系统设计.doc》由会员分享,可在线阅读,更多相关《毕业设计基于51单片机的温度控制系统设计.doc(41页珍藏版)》请在三一办公上搜索。
1、基于MCS-51单片机的温度控制系统设计摘 要本文提出了基于MCS-51系列单片机的数字温度计的制作电路和编程思想。该数字温度计以ATMEL公司的AT89S52 单片机为主控,配以达拉斯公司的DS18B20数字温度传感器,采用1602双行英文字符液晶作显示。实现了对温度的测量,显示,和报警等功能。关键词: AT89S52单片机;数字传感器DS18B20;显示器1602LCD;目 录摘要IABSTRACTII1 绪论21.1 选题的背景21.2 数字温度计简介21.2.1 数字温度计的特征21.2.2 设计实现的目标32 数字温度计的方案设计42.1 设计方案论证与比较42.1.1 显示电路方案
2、42.1.2 测温电路方案42.2 系统总体方案43 数字温度计的硬件电路设计53.1 控制电路53.1.1 MCU简介53.2.2 最小系统模块63.3 温度传感器设计73.3.1 DS18B20简介73.3.2 温度传感器与单片机的连接93.3.3 复位信号及外部复位电路103.4 单片机与报警电路103.5 显示电路104 软件设计124.1 DS18b20的读操作124.2 DS18b20的温度数据处理134.3 1602显示部分145 运行测试165.1温度测试 275.2报警设置 285.3 报警测试 29参考文献30附录1 程序源代码311 绪论1.1 选题的背景随着现代信息技术
3、的飞速发展和传统工业改造的逐步实现能够独立工作的温度检测和显示系统应用于诸多领域。传统的温度检测以热敏电阻为温度敏感元件。热敏电阻的成本低,但需后续信号处理电路,而且可靠性相对较差,测温准确度低,检测系统也有一定的误差。与传统的温度计相比,这里设计的数字温度计具有读数方便,测温范围广,测温精确,数字显示,适用范围宽等特点。选用AT89S52单片机作为主控制器件,DSl8B20作为测温传感器通过LCD1602并行传送数据,实现温度显示。通过DSl8B20直接读取被测温度值,进行数据转换,该器件的物理化学性能稳定,线性度较好,在-55125最大线性偏差小于0.1。该器件可直接向单片机传输数字信号,
4、便于单片机处理及控制。另外,该温度计还能直接采用测温器件测量温度,从而简化数据传输与处理过程。1.2 数字温度计简介1.2.1 数字温度计的特征温度是我们日常生产和生活中实时在接触到的物理量,但是它是看不到的,仅凭感觉只能感觉到大概的温度值,传统的指针式的温度计虽然能指示温度,但是精度低,使用不够方便,显示不够直观,数字温度计的出现可以让人们直观的了解自己想知道的温度到底是多少度。数字温度计采用进口芯片组装精度高、高稳定性,误差0.5%, 内电源、微功耗、不锈钢外壳,防护坚固,美观精致。数字温度计采用进口高精度、低温漂、超低功耗集成电路和宽温型液晶显示器,内置高能量电池连续工作5年无需敷设供电
5、电缆,是一种精度高、稳定性好、适用性极强的新型现场温度显示仪。是传统现场指针双金属温度计的理想替代产品,广泛应用于各类工矿企业,大专院校,科研院所。数字温度计采用温度敏感元件也就是温度传感器(如铂电阻,热电偶,半导体,热敏电阻等),将温度的变化转换成电信号的变化,如电压和电流的变化,温度变化和电信号的变化有一定的关系,如线性关系,一定的曲线关系等,这个电信号可以使用模数转换的电路即AD转换电路将模拟信号转换为数字信号,数字信号再送给处理单元,如单片机或者PC机等,处理单元经过内部的软件计算将这个数字信号和温度联系起来,成为可以显示出来的温度数值,如25.0摄氏度,然后通过显示单元,如LED,L
6、CD或者电脑屏幕等显示出来给人观察。这样就完成了数字温度计的基本测温功能。数字温度计根据使用的传感器的不同,AD转换电路,及处理单元的不同,它的精度,稳定性,测温范围等都有区别,这就要根据实际情况选择符合规格的数字温度计。1.2.2 设计实现的目标1) 采集测温范围为-55+120 .2) 温度精度在0.1 ;误差0.2以内.3) 显示模块,采用1602液晶显示.4) 按键3个,设置、加、减.5) 报警设置10-90度.低于下限报警,高于上限报警。2 数字温度计的方案设计2.1 设计方案论证与比较2.1.1 显示电路方案方案一:采用数码管动态显示使用七段LED数码管,采用动态显示的方法来显示各
7、项指标,此方法虽然价格成本低,但是显示单一,且功耗较大。方案二:采用LCD液晶显示采用1602 LCD液晶显示,此方案显示内容相对丰富,且价格不高。综合上述原因,采用方案二,使用LCD液晶作显示电路。2.1.2 测温电路方案方案一:采用模拟温度传感器测温由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。方案二:采用数字温度传感器进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容
8、易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。综合考虑,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故采用了方案二。2.2 系统总体方案根据上述方案比较,结合题目要可以将系统分为主控模块,显示模块,温度采集模块和报警模块,其框图如下: DS18B20温度数据采集设置按键键驱动显示报警电路 MCU图2-1 系统总体设计框图3 数字温度计的硬件电路设计3.1 控制电路3.1.1 MCU简介CPU是整个控制部分的核心。在考虑经济性和满足需求的前提下,本系统选用ATMEL公司生产的8位AT89S52单片机作为整个
9、系统的控制中心。AT89S52是ATMEL公司生产的低功耗,高性能CMOS8位单片机,片内含4k bytes的可系统编程的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准8051指令系统及引脚,它集Flash存储器既可在线编辑(ISP)也可用传统方法进行编辑及通用8位微处理器于单片芯片中,功能强大AT89S52单片机可为您提供许多高性价比的应用场合。器管脚图如图3-2:图3-1 AT89S52管脚图在本系统中,AT89S52单片机内部的功能单元已经能够满足系统设计需要,不需要系统扩展。AT89S52具有以下的特点: 8031 CPU与MCS-51 兼容
10、寿命:1000写/擦循环 4K字节可编程FLASH存储器 全静态工作:0-24MHz 三级程序存储器保密锁定 128*8位内部RAM 32条可编程I/O线 两个16位定时器/计数器 6个中断源 可编程串行通道 低功耗的闲置和掉电模式 片内振荡器和时钟AT89S52 是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非 易失性存储器技术制造,与工业80C51 产品指令和引脚完 全兼容。片上Flash允许程序存储器在系统可编程,亦适于 常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统 可编程Flash,使得AT89S52为众多嵌
11、入式控制应用系统提 供高灵活、超有效的解决方案。AT89S52具有以下标准功能: 8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口, 片内晶振及时钟电路。此外, AT89S52 可降至0Hz 静态逻 辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工 作。掉电保护方式下,RAM内容被保存,振荡器被冻结, 单片机一切工作停止,直到下一个中断或硬件复位为止。8 位微控制器 8K 字节在系统可编程 Flash。同时该芯片还具有PDI
12、P、TQFP和PLCC等三种封装形式,以适应不同产品的需求。3、AT89S52引脚功能AT89S52 单片机为40 引脚芯片见图3.2.1-2。图3.2.1-2 AT89S52引脚图(1)口线:P0、P1、P2、P3 共四个八位口。P0 口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。 对P0端口写“1”时,引脚用作高阻抗输入。 当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0不具有内部上拉电阻。 在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。 P1口:P1 口是
13、一个具有内部上拉电阻的8 位双向I/O 口,p1 输出缓冲器能驱动4 个TTL 逻辑电平。对P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。 此外,P1.0和P1.1分别作定时器/计数器2的外部计数输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX),具体如下表所示。 在flash编程和校验时,P1口接收低8位地址字节。 引脚号第二功能: P1.0 T2(定时器/计数器T2的外部计数输入),时钟输出 P1.1 T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制) P1.5
14、 MOSI(在系统编程用) P1.6 MISO(在系统编程用) P1.7 SCK(在系统编程用)P2口:P2 口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器能驱动4 个TTL 逻辑电平。对P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。 在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX DPTR) 时,P2 口送出高八位地址。在这种应用中,P2 口使用很强的内部上拉发送1。在使用8位地址(如MOVX RI)访问外部数据存储器时,P2口输出P2锁存器的内容。 在
15、flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。 P3 口:P3 口是一个具有内部上拉电阻的8 位双向I/O 口,p3 输出缓冲器能驱动4 个TTL 逻辑电平。对P3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。 P3口亦作为AT89S52特殊功能(第二功能)使用。 在flash编程和校验时,P3口也接收一些控制信号。 此外,P3口还接收一些用于FLASH闪存编程和程序校验的控制信号。 (2)其他引脚说明:RST:复位输入。晶振工作时,RST脚持续2 个机器周期高电平将使单片机复位。
16、看门狗计时完成后,RST 脚输出96 个晶振周期的高电平。特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。DISRTO默认状态下,复位高电平有效。 ALE/PROG当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。 对FLASH存储器编程期间,该引脚还用于输入编程脉冲(PROG)。 如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位置位
17、后,只有一条MOVX和MOVC指令才能将ALE激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。 PSEN程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89S52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲,在此期间,当访问外部数据存储器,将跳过两次PSEN信号。 EA/VPP外部访问允许,欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。 如EA端为高电平(接Vcc端),CPU则执行内部程序存储器的指令。
18、 FLASH存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。 XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。 XTAL1,XTAL2接石英晶体振荡器。如图3.2.1-3所示外接晶体引脚图。 C2 XTAL2 悬空 XTAL2 C1 XTAL1 外部振荡信号 XTAL1 GND GND 接地 接地a内部方式 b外部方式图3.2.1-3晶振外接结构引脚图XTAL1是片内振荡器的反相放大器输入端,XTAL2则是输出端,使用外部振荡器时,外部振荡信号应直接加到XTAL1,而XTAL2悬空。内部方式时,时
19、钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz。晶振的频率可以在1MHz-24MHz内选择,在本设计电路中选用了12MHz。电容取20PF左右。机器周期12时间周期,如12MHz的机器周期为1微秒。(3)控制或复位引脚RESET 此脚为高电平时(约2个机器周期)可将单片机复位。RST/VPD当出现两个机器周期高电平时,单片机复位。复位后,P0P3输出高电平;SP寄存器为07H;其它寄存器全部清0;不影响RAM状态。如图3.2.1-4所示。 图3.2.1-4 按键电平复位 AT89SXX系列单片机实现了ISP下载功能,故而取代了89CXX系列的下载方式,也是因为这样,ATME
20、L公司已经停止生产89CXX系列的单片机,现在市面上的AT89CXX多是停产前的库存产品。 4、AT89S52的编程方法 编程前,须按编程模式表设置好地址、数据及控制信号;顺序如下: 在地址线上加上要编程单元的地址信号。 在数据线上加上要写入的数据字节。 激活相应的控制信号。 将EA/Vpp端加上+12V编程电压。 每对Flash存储阵列写入一个字节或每写入一个程序机密位,加上一个ALE/PROG编程脉冲。每个字节写入周期是自身定时的,大多数约为50us。改变编程单元的地址和写入的数据,重复步骤,直到全部文件编程结束。单片机的现状及发展方向:单片机是为了工业控制需要满足而诞生的,是自动控制系统
21、的核心部件,因而也主要用于工业控制、智能化仪器仪表、家用电器中。它具有体积小,功能多、价格低、使用方便、系统设计灵活等优点,应用领域不断扩大,除了工业控制,智能化仪表,通讯,家用电器外,在智能化高档电子玩具产品中也大量采用单片机芯片作为核心控制部件。由于单片机主要面向工业控制,工作环境比较恶劣,入高温,强电磁干扰,甚至含有腐蚀性气体,在太空中工作的单片机控制系统,还必须具有抗辐射能力,这决定了单片机CPU于通用微机CPU具有不同的技术特征和发展方向:(1) 可靠性高;(2) 控制功能往往很强,数值计算交叉;(3) 指令系统比通用微处理器慢的多;(4) X系列芯片取代;(5) 抗干扰性强,工作温
22、度范围宽。3.2.2 最小系统模块本次设计中,选用ATMEL公司的51系列单片机AT89S52芯片作为电子密码电源开关的数据处理及操作控制芯片。只有单片机芯片无法完成数据处理及控制功能,必须有附加的电路,使单片机芯片组成一个可运行的系统才能实现其功能。本次设计中,由AT89S52芯片连同附加电路构成的单片机最小系统作为数据处理及控制模块,其中,使用P1口作为1602液晶的数据传输口,P3口作1602的命令数据控制、时钟、读写控制、和使能控制接口,P2口作按键扫描接口,P2.3作DS18B20的总线接口。P2.5,P2.7作报警控制接口。其电路连接图3-3如下:图3-2 数据处理及控制模块3.3
23、 温度传感器设计3.3.1 DS18B20简介DS18B20可以程序设定912位的分辨率,精度为0.5C。可选更小的封装方式,更宽的电压适用范围。分辨率设定,及用户设定的报警温度存储在EPROM中,掉电后依然保存。温度传感器DS18B20引脚如图3-4所示。图3-3 DS18B20TO92封装温度传感器引脚功能说明:VDD :可选电源脚,电源电压范围35.5V。当工作于寄生电源时,此引脚必须接地。DQ :数据输入/输出脚。漏极开路,常态下高电平。GND :为电源地图3-4 DS18B20内部结构图DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和
24、TL、配置寄存器。光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。 DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以0.0625/LSB形式表达,其中S为符号位。 这是12位转化后得到的12位数据,存储在18B20的两
25、个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。 例如+125的数字输出为07D0H,+25.0625的数字输出为0191H,-25.0625的数字输出为FF6FH,-55的数字输出为FC90H。 DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的E2RAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。 暂存存储器包含了8个连续字节,前两个字节是测得的温度信息,第一个字节的内容是温度的
26、低八位,第二个字节是温度的高八位。第三个和第四个字节是TH、TL的易失性拷贝,第五个字节是结构寄存器的易失性拷贝,这三个字节的内容在每一次上电复位时被刷新。第六、七、八个字节用于内部计算。第九个字节是冗余检验字节。 该字节各位的意义如下:TM R1 R0 1 1 1 1 1低五位一直都是1 ,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用户不要去改动。R1和R0用来设置分辨率,如表1所示:(DS18B20出厂时被设置为12位)表3-3 DS18B20温度转换时间表R1R0分辨率/位温度最大转向时间00993.750110187.510
27、113751112750根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。复位要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号后等待1660微秒左右,后发出60240微秒的存在低脉冲,主CPU收到此信号表示复位成功。3.3.2 温度传感器与单片机的连接温度传感器的单总线(1-Wire)与单片机的P20连接,P20是单片机的高位地址线A8。P2端口是一个带内部上拉电阻的8位双向IO,其输出缓冲级可驱动(吸收或输出
28、电流)4个TTL逻辑门电路。对该端口写“1”,可通过内部上拉电阻将其端口拉至高电平,此时可作为输入口使用,这是因为内部存在上拉电阻,某一引脚被外部信号拉低时会输出一个电流。在访问外部程序存储器或16位地址的外部数据存储器时。如执行MOVX DPTR指令,则表示P2端口送出高8位的地址数据。在访问8位地址的外部数据存储器时,可执行MOVX RI指令,P2端口内容即为特殊功能寄存器(SFR)区中R2寄存器内容,整个访问期间不改变。在Flash编程和程序校验时,P2端口也接收高位地址和其他控制信号。图3-5为DSl8820内部结构。图3-6为DSl8820与单片机的接口电路。图3-5 DS18B20
29、和单片机的接口连接3.3.3 复位信号及外部复位电路该复位信号高电平有效,其有效时间应持续24个振荡脉冲周期即两个机器周期以上。若使用频率为12 MHz的晶体振荡器,则复位信号持续时间应超过2s才完成复位操作。图3-6 复位电路3.4 单片机与报警电路系统中的报警电路是由发光二极管和限流电阻组成,并与单片机的P2.6端口连接。3.5 显示电路1、应用简介模块内部自带字符发生存储器(CGROM),字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是(41H),显示时模块把代码41H发给液晶模块,我们就能在液晶上看到字母“A
30、”。1602液晶模块内部的控制器共有11条控制指令,丰富的指令可以完成液晶的时序控制、工作方式式设置和数据显示等。采用的LCD1602液晶模块是标准16针插座,接口电路如图3.2.3所示:关于LCD1602的详细资料见表3.2.3-1和表3.2.3-2。图3.2.3 显示电路的连接图4 软件设计4.1 DS18b20的读操作DSl8B20的主要数据元件有:64位激光Lasered ROM,温度灵敏元件和非易失性温度告警触发器TH和TL。DSl8B20可以从单总线获取电源,当信号线为高电平时,将能量贮存在内部电容器中;当单信号线为低电平时,将该电源断开,直到信号线变为高电平重新接上寄生(电容)电
31、源为止。此外,还可外接5 V电源,给DSl8B20供电。DSl8B20的供电方式灵活,利用外接电源还可增加系统的稳定性和可靠性。DS18B20读写时序如图4-14-3:图4-1 DS18B20的复位时序图图4-2 DS18B20的写数据时序图图4-3 DS18B20的读数据时序图由时序图可知,DS18B20在复位时需要480us的低电平,等待15us后MCU将总线拉高,等待DS18B20的响应信号;DS18B20在写数据时分为写“0”和写“1”操作,写“0”操作时,DS18B20需要至少60us的总线被拉低,然后在60us内将“0”写入DS18B20中,持续时间至少1us,写“1”操作是只需将
32、写入的“0”改为“1”即可;DS18B20读操作也分为读“0”和读“1”操作,读“0”操作时,总线需要15us被拉低,再拉高45us,然后再15us内将数据读走,读“1”操作同读“0”操作。程序流程图如图4-4:开始DS18B20的初始化启动温度转换读取温度寄存器跳过读序列号的操作跳过读序列号的操作DS18B20的初始化RETLOW-低八位 HIGH-高八位图4-4 DS18B20读取温度的流程图4.2 DS18b20的温度数据处理读出温度数据后,LOW的低四位为温度的小数部分,可以精确到0.0625,LOW的高四位和HIGH的低四位为温度的整数部分,HIGH的高四位全部为1表示负数,全为0表
33、示正数。所以先将数据提取出来,分为三个部分:小数部分、整数部分和符号部分。小数部分进行四舍五入处理:大于0.5的话,向个位进1;小于0.5的时候,舍去不要。当数据是个负数的时候,显示之前要进行数据转换,将其整数部分取反加一。还因为DS18B20最低温度只能为-55,所以可以将整数部分的最高位换成一个“-”,表示为负数。图4-2为温度数据处理程序的流程图。开始提取整数部分存入HT提取小数部分存入LTLT右移三位,将精度降低到0.5摄氏度HT+将小数部分整数化提取符号部分存入signLT是否大于5是否为负数RET负数标志flag=1YNNY图4-5 温度数据处理流程图4.3 1602显示部分160
34、2的读写时序图如下:图4-6 1602液晶的读时序图图4-7 1602的写时序图根据以上时序图可以得出读写程序流程图如下:开始选择写数据写命令RS=1|RS=0选择写操作RW=1使能EN准备好写入的数据DB0DB7禁止EN结束开始选择写数据写命令RS=1|RS=0选择读操作RW=0使能EN禁止EN结束图4-8 1602的写流程图图4-8 1602的读流程图5 运行测试5.1.开机温度测试5.2.设置温度测试5.3报警测试6 结语本文重点介绍了单片机和数字传感器DS18B20的原理和功能,并用DS18B20与AT89S52单片机、LCD1602组成数字温度计,有超温报警功能。 在本次设计的过程中
35、,我发现很多的问题,虽然以前还做过这样的设计但这次设计真的让我长进了很多,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,举个例子,以前写的那几次,数据加减时,我用的都是BCD码,这一次,我全部用的都是16进制的数直接加减,显示处理时在用除法去删分,感觉效果比较好,有好多的东西,只有我们去试着做了,才能真正的掌握,只学习理论有些东西是很难理解的,更谈不上掌握。参考文献【1】作著:姜涛【2】书名:基于单片机的数字式温度计设计【3】出版社:西北电力学校【4】出版年月:2012.3.19【5】页码:27页附录一:仿真电路图
36、附录二:系统程序清单#include#include#define uint unsigned int#define uchar unsigned char/-sbit S1=P20; /设置 上下限sbit S2=P21; /加sbit S3=P22; /减/-LCD1602-/P0-7= D0-7#define LCDDATA P1sbit rs=P30;sbit wela=P31;sbit lcden=P32;/-sbit DQ1=P23; /传感器1sbit LED1=P26; /报警显示灯sbit BUZ=P27; /蜂鸣器uchar DQ1_SET2; /DQ1上下限设置 DQ1_
37、SET0 下限 DQ1_SET1 上限;uchar Temp; /温度报警uchar count; /蜂鸣器定时用uchar mode; /mode=1正常显示 mode=2 设置下限模式 mode=3设置上限 uchar code table=Temper ;/DS18B20/uchar ng; /负号标志uchar code df_Table= 0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9; /温度小数位对照表uchar CurrentT = 0; /当前读取的温度整数部分uchar Temp_Value=0x00,0x00; /从DS18B20读取的温度值uchar D
38、isplay_Digit=0,0,0,0,0,0,0,0;/待显示的各温度数位bit DS18B20_IS_OK = 1; /传感器正常/DS18B20/延时/*/ 函数: LCD_Delay()/ 描述: 延时t ms函数/ 参数: t / 返回: 无/ 备注: 12MHZ t=1延时时间约1ms/ 版本: 2011/01/01 First version/*/void Delay_ms(unsigned int t)unsigned int i,j;for(i=0;it;i+)for(j=0;j0;x-)for(y=120;y0;y-);void write_com(uchar com)
39、/1602液晶写指令rs=0;lcden=0;LCDDATA=com;delayms(1);lcden=1;delayms(2);lcden=0;void write_date(uchar date) /1602液晶写数据 rs=1;lcden=0;LCDDATA=date;delayms(1);lcden=1;delayms(2);lcden=0;void init_lcd(void) /初始化液晶,及画面初始化uchar num;wela=0;lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);wr
40、ite_com(0x80);for(num=0;num13;num+) / temper: ;write_date(tablenum);Delay(10); /-1602-/初始化DS18B20uchar Init_DS18B20() uchar status; DQ1 = 1;Delay(8); /延时DQ1 = 0;Delay(90);/延时DQ1 = 1;Delay(8);status = DQ1;Delay(100);DQ1 = 1;return status;/读一个字节uchar ReadOneByte() uchar i,dat=0;DQ1 = 1;_nop_();for(i=0;i= 1;DQ1 = 1;_nop_();_nop_();if(DQ1)dat |= 0X80;Delay(30);DQ1 = 1;return (dat); /写一个字节void WriteOneByte(uchar dat) uchar i;for(i=0;i8;i+) DQ1 = 0;DQ1 = dat& 0x01;