随着微机测量和控制技术的迅速发展与广泛应用,以单片机为核心的温度采集与控制系统的研发与应用在很大程度上提高了生产生活中对温度的控制水平。本设计论述了一种以STCC52单片机为主控制单元,以DS18B20为温度传感器的温度控制系统。该控制系统可以实时存储相关的温度数据并记录当前的时间。系统设计了相关的硬件电路和相关应用程序。硬件电路主要包括STCC52单片机最小系统,测温电路、实时时钟电路、LCD液晶显示电路以及通讯模块电路等。系统程序主要包括主程序,读出温度子程序,计算温度子程序、按键处理程序、LCD显示程序以及数据存储程序等。
关键词:STCC52单片机;DS18B20;显示电路
Abstract
Along with the computer measurement and control technology of the rapid development and wide application, based on singlechip temperature gathering and control system development and application greatly improve the production of temperature in life level of control. This design STCC52 describes a kind of mainly by MCU control unit, for temperature sensor DS18B20 temperature control system. The control system can real-time storage temperature data and record related to the current time. System design related hardware circuit and related applications. STCC52 microcontroller hardware circuit include temperature detection circuit smallest system, and real-time clock circuit, LCD display circuit, communication module circuit, etc. System programming mainly include main program, read temperature subroutine, the calculation of temperature subroutines, key processing procedures, LCD display procedures and data storage procedures, etc.
Key words: STCC52 microcontroller; DS18B20; display circuit
第1章 前言
1.1 研究背景
工业控制是计算机的一个重要应用领域,计算机控制系统正是为了适应这一领域的需要而发展起来的一门专业技术,它主要研究如何将计算机技术、通过信息技术和自动控制理论应用于工业生产过程,并设计出所需要的计算机控制系统。随着微机测量和控制技术的迅速发展与广泛应用,以单片机为核心的温度采集与控制系统的研发与应用在很大程度上提高了生产生活中对温度的控制水平。本设计就是基于单片机STCC52温度控制系统的设计,通过本次设计,我更加的明确了单片机的广泛用途和使用方法,以及其工作的原理。STCC52单片机是单时钟/机器周期(1T)的兼容8051内核单片机,STCC52单片机常用于控制的芯片,在智能仪器仪表、工业检测控制、机电一体化等方面取得了令人瞩目的成果,是高速/低功耗的新一代8051 单片机,用其作为温度控制系统的实例也很多。使用STCC52单片机能够实现温度全程的自动控制,而且易于学习,掌握,性价比高。使用STCC52型单片机设计温度控制系统,可以及时、精确的反映室内的温度的变化。完成诸如升温到特定温度、降温到特定温度、在温度上下限范围内保持恒温等多种控制方式。
1.2 研究目的和意义
随着社会的发展,温度的测量及控制变得越来越重要。本设计采用单片机STCC52设计了温度实时测量及控制系统。单片机STCC52能够根据温度传感器DS18B20所采集的温度在液晶屏上实时显示,通过控制从而把温度控制在设定的范围之内。所有温度数据均通过液晶显示器LDC显示出来。系统可以根据时钟存储相关的数据。
通过该设计的学习使我对计算机控制系统有一个全面的了解、掌握常规控制算法的使用方法、掌握简单微型计算机应用系统软硬的设计方法,进一步锻炼微型计算机应用方面的实际工作能力。
1.3 未来发展
90年代后期至今单片机的发展可以说是进入了一个新的阶段,单片机正朝着高性能和多品种方向发展,发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。其发展趋势主要有以下几个方面:
1.CMOS化:近年,由于CHMOS技术的进步,大大地促进了单片机的CMOS化。CMOS芯片除了低功耗特性之外,还具有功耗的可控性,使单片机可以工作在功耗精细管理状态,这也是今后以80C51取代8051为标准MCU芯片的原因。因为单片机芯片多数是采用CMOS(金属栅氧化物)半导体工艺生产。
CMOS电路的特点是低功耗、高密度、低速度、低价格。采用双极型半导体工艺的TTL电路速度快,但功耗和芯片面积较大。
随着技术和工艺水平的提高,又出现了HMOS(高密度、高速度MOS)和CHMOS工艺,CMOS和HMOS工艺的结合。目前生产的CHMOS电路已达到LSTTL的速度,传输延迟时间小于2ns,它的综合优势已在于TTL电路。因而,在单片机领域CMOS正在逐渐取代TTL电路。
2.低功耗:单片机的功耗已到mA级,甚至到1uA以下,使用电压在3~6V之间,完全适应电池工作。低功耗化的效应不仅是功耗低,而且带来了产品的高可靠性、高抗干扰能力以及产品的便携化、低电压化。几乎所有的单片机都有WAIT、STOP等省电运行方式。允许使用的电压范围越来越宽,一般在3~6V范围内工作。低电压供电的单片机电源下限已可达1~2V。目前0.8V供电的单片机已经问世。低噪声与高可靠性为提高单片机的抗电磁干扰能力,使产品能适应恶劣的工作环境,满足电磁兼容性方面更高标准的要求,各单片机厂家在单片机内部电路中都采用了新的技术措施。
3.大容量化:传统的单片机片内程序存储器一般为1K~8K,片内数据存储器为256字节以下。在某些复杂的应用上,片内不论是程序存储器还是数据存储器都是容量不够,必须采用外接方式进行扩充。而新型单片机(例如PHILIPSPC66x)片内程序存储器可达K,片内数据存储器可达8K。今后,随着工艺技术的不断发展,单片机片内存储器容量将进一步扩大。
4.单片机的高性能化:主要是指进一步提高CPU的性能,加快指令运算速度,并加强了位处理功能、中断、定时功能。其主频从4MHz~12MHz向0MHz(全静态)~40MHz以上发展。同时采用流水线结构,让指令以队列形式出现在CPU中,从而进一步提高运算速度。有的单片机基本采用了多流水线结构,这类单片机的运算速度要比标准的单片机高出10倍以上。
5.外围电路内装化:这也是单片机发展的一个主流方面。随着集成度的不断提高,使将各种功能器件集成在片内成为可能。除了一般必须具有的CPU、ROM、RAM、定时器计数器等外,片内还可以根据需要集成如串行口,AD、DA、EEPROM、PWM、看门狗(WatchDog)、液晶显示(LCD)驱动器等多种功能部件。
6.增强IO口功能:为了减少外部驱动芯片,进一步增加单片机并行口的驱动能力,现在有的单片机可直接输出较大电流(20mA)和高电压,以便直接驱动显示器。为进一步加快IO的传输速度,有的单片机设置了高速IO口,能以最快的速度捕捉外部数据的变化,同时以最快的速度向片外输出数据。以适合数据高速改变的场合。
随着集成工艺的不断发展,单片机一方面向集成度更高、体积更小、功能更强、功耗更低方向发展,另一方面向32位以上及双CPU方向发展。
第2章 系统的总体设计
2.1 系统设计框架
本课题设计的是一种以STCC52单片机为主控制单元,以DS18B20为温度传感器的温度控制系统。该控制系统可以实时存储相关的温度数据并记录当前的时间。其主要包括:电源模块、温度采集模块、按键处理模块、实时时钟模块、数据存储模块、LCD显示模块、通讯模块以及单片机最小系统。
图2-1 系统设计框架
2.2 STCC52单片机简介
目前,51系列单片机在工业检测领域中得到了广泛的应用,因此我们可以在许多单片机应用领域中,配接各种类型的语音接口,构成具有合成语音输出能力的综合应用系统,以增强人机对话的功能。STCC52单片机是深圳宏晶科技有限公司生产的一种单片机,在一小块芯片上集成了一个微型计算机的各个组成部分。每一个单片机包括:一个8位的微型处理器CPU;一个512K的片内数据存储器RAM;4K片内程序存储器;四个8位并行的I/O接口P0-P3,每个接口既可以输入,也可以输出;两个定时器/记数器;五个中断源的中断控制系统;一个全双工UART的串行I/O口;片内振荡器和时钟产生电路,但石英晶体和微调电容需要外接。最高允许振荡频率是12MHZ。以上各个部分通过内部总线相连接【1】。
2.2.1 STCC52单片机时序
STCC52单片机的一个执器周期由6个状态(s1-s6)组成,每个状态又持续2个震荡周期,分为P1和P2两个节拍。这样,一个机器周期由12个振荡周期组成。若采用12MHz的晶体振荡器,则每个机器周期为1us,每个状态周期为1/6us;在一数情况下,算术和逻辑操作发生在N期间,而内部寄存器到寄存器的传输发生在P2期间。对于单周期指令,当指令操作码读人指令寄存器时,使从S1P2开始执行指令。如果是双字节指令,则在同一机器周期的s4读人第二字节。若为单字节指令,则在51期间仍进行读,但所读入的字节操作码被忽略,且程序计数据也不加1。在加结束时完成指令操作。多数STCC52指令周期为1-2个机器周期,只有乘法和除法指令需要两个以上机器周期的指令,它们需4个机器周期。对于双字节单机器指令,通常是在一个机器周期内从程序存储器中读人两个字节,但Movx指令例外,Movx指令是访问外部数据存储器的单字节双机器周期指令,在执行Movx指令期间,外部数据存储器被访问且被选通时跳过两次取指操作【2】。
2.2.2 STCC52单片机引脚介绍
STCC52单片机的40个引脚中有2个专用于主电源引脚,2个外接晶振的引脚,4个控制或与其它电源复用的引脚,以及32条输入输出I/O引脚。
下面按引脚功能分为4个部分叙述个引脚的功能。
电源引脚Vcc和Vss
Vcc(40脚):接+5V电源正端;
Vss(20脚):接+5V电源正端。
外接晶振引脚XTAL1和XTAL2:
XTAL1(19脚):接外部石英晶体的一端。在单片机内部,它是一个反相放大器的输入端,这个放大器构成采用外部时钟时,对于HMOS单片机,该引脚接地;对于CHOMS单片机,该引脚作为外部振荡信号的输入端。
XTAL2(18脚):接外部晶体的另一端。在单片机内部,接至片内振荡器的反相放大器的输出端。当采用外部时钟时,对于HMOS单片机,该引脚作为外部振荡信号的输入端。对于CHMOS芯片,该引脚悬空不接。
控制信号或与其它电源复用引脚有RST/VPD、ALE/P、PSEN和EA/VPP等4种形式。
RST/VPD(9脚):RST即为RESET,VPD为备用电源,所以该引脚为单片机的上电复位或掉电保护端。当单片机振荡器工作时,该引脚上出现持续两个机器周期的高电平,就可实现复位操作,使单片机复位到初始状态。
当VCC发生故障,降低到低电平规定值或掉电时,该引脚可接上备用电源VPD(+5V)为内部RAM供电,以保证RAM中的数据不丢失。ALE/ P(30脚):当访问外部存储器时,ALE(允许地址锁存信号)以每机器周期两次的信号输出,用于锁存出现在P0口的低。
PSEN(29脚):片外程序存储器读选通输出端,低电平有效。当从外部程序存储器读取指令或常数期间,每个机器周期PESN两次有效,以通过数据总线口读回指令或常数。当访问外部数据存储器期间,PESN信号将不出现。
EA/Vpp(31脚):EA为访问外部程序储器控制信号,低电平有效。当EA端保持高电平时,单片机访问片内程序存储器4KB(MS-52子系列为8KB)。若超出该范围时,自动转去执行外部程序存储器的程序。当EA端保持低电平时,无论片内有无程序存储器,均只访问外部程序存储器。对于片内含有EPROM的单片机,在EPROM编程期间,该引脚用于接21V的编程电源Vpp。
输入/输出(I/O)引脚P0口、P1口、P2口及P3口:
P0口(39脚~22脚):P0.0~P0.7统称为P0口。当不接外部存储器与不扩展I/O接口时,它可作为准双向8位输入/输出接口。当接有外部程序存储器或扩展I/O口时,P0口为地址/数据分时复用口。它分时提供8位双向数据总线。
对于片内含有EPROM的单片机,当EPROM编程时,从P0口输入指令字节,而当检验程序时,则输出指令字节。
P1口(1脚~8脚):P1.0~P1.7统称为P1口,可作为准双向I/O接口使用。对于MCS-52子系列单片机,P1.0和P1.1还有第2功能:P1.0口用作定时器/计数器2的计数脉冲输入端T2;P1.1用作定时器/计数器2的外部控制端T2EX。对于EPROM编程和进行程序校验时,P0口接收输入的低8位地址。
P2口(21脚~28脚):P2.0~P2.7统称为P2口,一般可作为准双向I/O接口。当接有外部程序存储器或扩展I/O接口且寻址范围超过256个字节时,P2口用于高8位地址总线送出高8位地址。对于EPROM编程和进行程序校验时,P2口接收输入的8位地址。
P3口(10脚~17脚):P3.0~P3.7统称为P3口。它为双功能口,可以作为一般的准双向I/O接口,也可以将每1位用于第2功能,而且P3口的每一条引脚均可定义为第1功能的输入输出或第2功能。P3口的第2功能见下表:
表2-1 单片机P3.0管脚含义
引脚 | 第2功能 |
P3.0 | RXD(串行口输入端0) |
P3.1 | TXD(串行口输出端) |
P3.2 | INT0(部中断0请求输入端,低电平有效) |
P3.3 | INT1(中断1请求输入端,低电平有效) |
P3.4 | T0(时器/计数器0计数脉冲端) |
P3.5 | T1(时器/计数器1数脉冲端) |
P3.6 | WR(部数据存储器写选通信号输出端,低电平有效) |
P3.7 | RD(部数据存储器读选通信号输出端,低电平有效) |
单片机功能多,引脚数少,因而许多引脚具有第2功能。
单片机对外呈3总线形式,由P2、P0口组成16位地址总线,由P0口分时复用作为数据总线【3】。
第3章 硬件系统设计
3.1 单片机最小电路系统
在本设计的温度控制系统设计中,控制核心是STCC52单片机,该单片机为51系列增强型8位单片机,它有32个I/O口,片内含4K FLASH工艺的程序存储器,便于用电的方式瞬间擦除和改写,而且价格便宜,其外部晶振为12MHz,一个指令周期为1μS。使用该单片机完全可以完成设计任务,其最小系统主要包括:复位电路、震荡电路以及存储器选择模式【4】(EA脚的高低电平选择),电路如下图3-1所示:
图3-1 单片机最小系统图
3.2 温度传感器电路
采用一线制数字温度传感器DS18B20来作为本课题的温度传感器。
DS18B20温度传感器是美国达拉斯(DALLAS)半导体公司推出的应用单总线技术的数字温度传感器。该器件将半导体温敏器件、A/D转换器、存储器等做在一个很小的集成电路芯片上。本设计中温度传感器之所以选择单线数字器件DS18B20,是在经过多方面比较和考虑后决定的,主要有以下几方面的原因:
3.2.1 系统的特性
测温范围为-55℃~+125℃ ,测温精度为士0.5℃;温度转换精度9~12位可变,能够直接将温度转换值以16位二进制数码的方式串行输出;12位精度转换的最大时间为750ms;可以通过数据线供电,具有超低功耗工作方式。
3.2.2 系统的成本
由于计算机技术和微电子技术的发展,新型大规模集成电路功能越来越强大,体积越来越小,而价格也越来越低。一支DS18B20的体积与普通三极管相差无几,价格只有十元人民币左右。
3.2.3 系统的复杂度
由于DS18B20是单总线器件,微处理器与其接口时仅需占用1个I/O端口且一条总线上可以挂接几十个DS18B20,测温时无需任何外部元件。因此,与模拟传感器相比,可以大大减少接线的数量,降低系统的复杂度,减少工程的施工量。
3.2.4 信号输入电路
由于引线的减少,使得系统接口大为简化,给系统的调试带来方便。同时因为DS18B20是全数字元器件,故障率很低,抗干扰性强。因此,减少了系统的日常维护工作。
DS18B20温度传感器只有三根外引线:单线数据传输总线端口DQ,外供电源线VDD,共用地线GND。DS18B20有两种供电方式:一种为数据线供电方式,此时VDD接地,它是通过内部电容在空闲时从数据线获取能量,来完成温度转换,相应的完成温度转换的时间较长。这种情况下,用单片机的一个I/O口来完成对DS18B20总线的上拉。另一种是外部供电方式(VDD接+5V),相应的完成温度测量的时间较短。
在本设计中采用外部供电方式实现DS18B20传感器与单片机的连接,传感器输出信号进4.7K的上拉电阻直接接到单片机的P1.0引脚上。
其接口电路如图3-2所示:
图3-2 温度传感器接口
3.3 系统电源电路设计
本系统采用电源稳压芯片是LM2596,该开关电压调节器是降压型电源管理单片集成电路,能够输出3A的驱动电流,输入电压是+5v,输入电压是+24v,同时具有很好的线性和负载调节特性。该器件内部集成频率补偿和固定频率发生器,开关频率为150KHz,与低频开关调节器相比较,可以使用更小规格的滤波元件。
该器件还有其他一些特点:在特定的输入电压和输出负载的条件下,输出电压的误差可以保证在±4%的范围内,振荡频率误差在±15%的范围内;可以用仅80μA的待机电流,实现外部断电;具有自我保护电路(一个两级降频限流保护和一个在异常情况下断电的过温完全保护电路)。
在该温度控制系统中,其电源电路设计如下图3-3所示:
图3-3 系统电源模块
3.4 LCD显示电路
液晶显示屏(LCD)用于数字型钟表和许多便携式计算机的一种显示器类型。LCD显示使用了两片极化材料,在它们之间是液体水晶溶液。电流通过该液体时会使水晶重新排列,以使光线无法透过它们。因此,每个水晶就像百叶窗,既能允许光线穿过又能挡住光线。本设计的温度控制系统是采用液晶屏128*作为显示模块,其接口原理图如下图3-4所示:
图3-4 液晶显示接口电路
3.5 串口通讯电路
由于CPU与接口之间按并行方式传输,接口与外设之间按串行方式传输。因此,在串行接口中,必须要有“接收移位寄存器”(串→并)和“发送移位寄存器”(并→串)。在数据输入过程中,数据1位1位地从外设进入接口的“接收移位寄存器”,当“接收移位寄存器”中已接收完1个字符的各位后,数据就从“接收移位寄存器”进入“数据输入寄存器”。CPU从“数据输入寄存器”中读取接收到的字符。(并行读取,即D7~D0同时被读至累加器中)。“接收移位寄存器”的移位速度由“接收时钟”确定。
在数据输出过程中,CPU把要输出的字符(并行地)送入“数据输出寄存器”,“数据输出寄存器”的内容传输到“发送移位寄存器”,然后由“发送移位寄存器”移位,把数据1位1位地送到外设。“发送移位寄存器”的移位速度由“发送时钟”确定。
接口中的“控制寄存器”用来容纳CPU送给此接口的各种控制信息,这些控制信息决定接口的工作方式。
“状态寄存器”的各位称为“状态位”,每一个状态位都可以用来指示数据传输过程中的状态或某种错误。例如,用状态寄存器的D5位为“1”表示“数据输出寄存器”空,用D0位表示“数据输入寄存器满”,用D2位表示“奇偶检验错”等。
本设计的通讯采用的是常见的串口通讯,协议转换芯片是采用MAX232A,其接口原理图如下图3-5所示:
图3-5 串口通讯接口电路
3.6 按键接口电路
本设计采用的键盘模块,其接口原理图如下图3-6所示:
图3-6 键盘模块电路
3.7 DS1302时钟电路
本设计的时钟是采用时钟芯片DS1302,DS1302工作时为了对任何数据传送进行初始化,需要将复位脚(RST)置为高电平且将8位地址和命令信息装入移位寄存器。数据在时钟(SCLK)的上升沿串行输入,前8位指定访问地址,命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时输出数据。时钟脉冲的个数在单字节方式下为8+8(8位地址+8位数据),在多字节方式下为8加最多可达248的数据。
其接口原理图如下图3-7所示:
图3-7 时钟接口电路
3.8 存储器接口电路
本设计的存储器采用的是AT24C256,起始停止信号的主器件控制的CAT24WC256是作为从器件被操作的。主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据发送或接收的模式,管脚描述SCL串行时钟CAT24WC256串行时钟输入管脚,用于产生器件所有数据发送或接收的时钟。这是一个输入管脚SDA串行数据地址双向串行数据,地址管脚用于器件所有数据的发送或接收SDA,是一个开漏输出管脚,可与其它开漏输出或集电极开路输出进行线或wire-ORWP写保护。当WP脚连接到VCC所有内存变成写保护只能读,当WP引脚连接到VSS或悬空允许器件进行读。写操作A0-A1器件地址输入,这些管脚为硬连线或者不连接对于单总线系统最多可寻址4个。CAT24WC256器件参阅器件寻址当这些引脚没有连接时其默认值0【5】,其接口原理图如下图3-8所示:
图3-8 存储器电路
第4章 系统的软件设计
4.1 系统程序流程图
系统的软件主要是采用汇编语言,对单片机进行变成实现各项功能。主程序对模块进行初始化,而后调用读温度、处理温度、显示、键盘等模块。用的是循环查询方式,来显示和控制温度,主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值并负责调用各子程序,其程序流程如图4-1系统程序流程图:
图4-1 系统程序流程图
4.2 计算温度子程序
读出温度子程序的主要功能包括初始化,判断DS18B20是否存在,若存在则进行一系列的读操,作若不存在则返回。其程序流程图如图4-2所示:
图4-2 读温度流程图
4.3 按键处理子程序
按键处理子程序主要是负责参数的设置,主程序每循环一次都要对按键进行扫描,判断是否有输入键按下则进行一系列的按键输入操作。其程序流程框图如图4-3所示:
图4-3 温度转换流程图
4.4 软件设计的特点
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图4-4所示:
图4-4 计算温度子程序
4.5 显示数据刷新子程序
显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位【6】。程序流程图如图4-5:
图4-5 数据刷新子程序
第5章 总结
通过此次毕业论文的设计,我熟悉了单片机在控制系统中的运用,并且在所学知识的基础上,将我原来所学的知识系统化、理论化、实用化。对如何使用已有的知识及获取相关资料方面的能力也有了提高。并学会了如何去思考整个控制系统的软硬件设计。实践过程中我们遇到了一些困难,但在解决问题的过程中,我学会了团队合作精神和怎样发现问题、分析问题,进而解决问题。此次设计不仅增强了我对学习专业课的兴趣,而且给了我们勇气和信心,更重要的是它为我们以后的学习指明了方向。
参考文献
[1] 李广弟, 朱月秀, 王秀山. 单片机基础[M]. 北京: 航空航天大学出版社, 2001: 10-14 .
[2] 蔡美琴, 张为民. MCS-51系列单片机系统及其应用[M]. 北京: 高等教育出版社. 2004: 20-22.
[3] 张毅刚, 等. MCS-51单片机应用设计[M].哈尔滨: 哈尔滨工业大学出版社. 1997: 59-65.
[4] 刘瑞星, 胡健, 等. Protel DXP 实用教程[M].北京: 机械工业出版社. 2003: 47-70.
[5] 于海生. 计算机控制技术[M].北京: 机械工业出版社. 2007: 90-102.
[6] 康华光. 电子技术基础 模拟部分[M].北京: 高等教育出版社. 1998: 70-83.
[7] 韩志军, 王振波, 等. 单片机应用系统设计[M].北京: 机械工业出版社. 2005: 35-38.
[8] 何小艇. 电子系统设计[M].浙江: 浙江大学出版社. 2004: 20-27.
[9] William Stallings. Data and Computer Communications [M].北京: 高等教育出版社. 2001: 127-144.
[10] 吴京文, 杨世忠, 泰廷奎. 温度传感器控制系统[J]. 电信技术, 2008, 16(7): 21-26.
[11] 胡义彪, 刘剑刚. Protel DXP 应用技术[J]. 通信电源, 2005, 27(10): -80.
致谢
通过这次毕业设计使我明白了自己原来知识比较欠缺,自己要学习的东西太多,以前老是觉得自己什么东西都会,什么东西都懂,有点眼高手低。通过这次课程设计,我才明白学习是一个长期积累的过程,在以后的工作、生活中都应该不断的学习,努力提高自己知识和综合素质。
最后,我要感谢赵国荣老师对我这次毕业设计的悉心指导,使我不仅在知识方面有了更深一步的了解,并且在我设计东西的思路与逻辑方面有更深刻的影响,使我知道了设计思路与逻辑的重要性,让我获益匪浅。
附录
系统程序
TEMPERATURE_L DATA 31H ;DS18B20低8位Buffer
TEMPERATURE_H DATA 30H ;DS18B20高8位Buffer
TEMPERATURE_HC DATA 32H ;计算后的百位和十位的BCD码存放Buffer
TEMPERATURE_LC DATA 33H ;计算后的个位和小数位的BCD码存放Buffer
TEMPERATURE_ZH DATA 34H ;计算后十位和个位HEX码的存放Buffer
DIS_BUF_X DATA 35H ;数码管小数位Buffer
DIS_BUF_G DATA 36H ;数码管个位Buffer
DIS_BUF_S DATA 37H ;数码管十位Buffer
DIS_BUF_B DATA 38H ;数码管百位Buffer
KEY_BUF_G DATA 39H ;键盘输入后,的个位值
KEY_BUF_S DATA 49H ;键盘输入后,的十位值
KEY_BUF_B DATA 41H ;键盘输入后,的百位值
K_UP EQU P1.1 ;上调按钮
K_DOWN EQU P1.2 ;下调按钮
K_ENTER EQU P1.0 ;输入数据确认按钮
P_DS18B20 EQU P3.0 ;读取DS18B20的输入端口
P_SWITCH EQU P3.1 ;可控硅控制
FLAG EQU 20H.0 ;标志位,确定是否存在DS18B20
ENTER_FLAG EQU 20H.1 ;键盘输入的标志位,
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV SP,#60H ;初始化
MOV KEY_BUF_G,#00H ;由于KEY_BUF是由用户输入的,所以先赋值初始化
MOV KEY_BUF_S,#00H
MOV KEY_BUF_B,#00H
NEXT: LCALL READ_TEMP ;调用读温度子程序
JB FLAG,NORMAL ;判断是否有DS18B20的存在
CALL ERR ;不存在时显示错误信息
AJMP NEXT
NORMAL: LCALL DATA_DEA ;处理从DS18B20得到的数据
LCALL SET_DIS_BUF ;赋值给DIS_BUF_X,G,S,B
LCALL DISPLAY ;调用数码管显示子程序
LCALL SCAN_KEY ;扫描键盘
LCALL SWITCH ;处理可控硅
AJMP NEXT
;程序名称:ERR
;功能:程序出错处理,显示四个8,即8888
;入口参数:无
;出口参数:DIS_BUF_X,DIS_BUF_G, DIS_BUF_S, DIS_BUF_B
ERR: MOV DIS_BUF_X,#08H ;如果没有找到DS18B20,那么就显示错误,错误
;显示为888
MOV DIS_BUF_G,#08H
MOV DIS_BUF_S,#08H
MOV DIS_BUF_B,#08H
LCALL DISPLAY
RET
程序名称:DATA_DEAL;
功能:处理采集后的的数据;
入口参数:TEMPERATURE_L;
出口参数:DIS_BUF_G, DIS_BUF_S, DIS_BUF_
DATA_DEAL:
MOV A,TEMPERATURE_H ;判温度是否零下
ANL A,#80H
JZ TEMPC1 ;A为0,说明是正数,如果是负数,则
;对低8为进行补码处理
CLR C
MOV A,TEMPERATURE_L ;二进制数求补(双字节)
CPL A ;取反加1
ADD A,#01H
MOV TEMPERATURE_L,A
MOV A,TEMPERATURE_H
CPL A
ADDC A,#00H
MOV TEMPERATURE_H,A ;写回TEMPERATURE_H
MOV TEMPERATURE_HC,#0BH
SJMP TEMPC11
TEMPC1: MOV TEMPERATURE_HC,#0AH
TEMPC11: MOV A,TEMPERATURE_HC
SWAP A
MOV TEMPERATURE_HC,A
MOV A,TEMPERATURE_L
ANL A,#0FH
MOV DPTR,#TEMPDOTTAB
MOVC A,@A+DPTR ;查表
MOV TEMPERATURE_LC,A ;TEMPERATURE_LC LOW=小数部分 BCD
MOV DIS_BUF_X,A ;小数位的BCD码送入显示buffer中
MOV A,TEMPERATURE_L ;整数部分
ANL A,#0F0H ;得到个位‘单个数值
SWAP A ;SWAP后就得到个位真正的个位
MOV TEMPERATURE_L,A
MOV A,TEMPERATURE_H
ANL A,#0FH
SWAP A
ORL A,TEMPERATURE_L
MOV TEMPERATURE_ZH,A ;组合后的值存入TEMPERATURE_ZH
CALL HtoB ;转换HEx值成为BCD码
MOV TEMPERATURE_L,A
ANL A,#0F0H
SWAP A
ORL A,TEMPERATURE_HC ;TEMPERATURE_HC LOW位 = 十位数
MOV TEMPERATURE_HC,A
MOV A,TEMPERATURE_L
ANL A,#0FH
SWAP A
MOV R7,A
MOV A,TEMPERATURE_HC ;TEMPERATURE_HC HI = 百位数 BCD
ANL A,#0FH
ORL A,R7
MOV TEMPERATURE_HC,A
TEMPC12: RET ;小数部分码表
TEMPDOTTAB:
DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H,06H,07H,08H,08H,09H,09H
;0.0625->00H
;0.0625*2 = 0.125->01H
;0.0625*3 = 0.1875->01H
;0.0625*4 = 0.25->02H
;0.0625*5 = 0.3125->03H
;以此类推..........
;程序名称:HtoB
;功能:十六进制转 BCD
;入口参数:A
;出口参数:R7
HtoB: MOV B,#0H ;100
DIV AB ;a/100
MOV R7,A ;
MOV A,#0AH
XCH A,B
DIV AB
SWAP A
ORL A,B
RET
;程序名称:INIT_TEMP
;功能:初始化DS18B20,确定DS18B20是否是存在的
;入口参数:无
;出口参数:FLAG
INIT_TEMP:
SETB P_DS18B20
NOP
CLR P_DS18B20 ;主机发出延时537微秒的复位低脉冲
MOV R0,#6BH
MOV R1,#04H
TSR1: DJNZ R0,$
MOV 40,#6BH
DJNZ R1,TSR1
SETB P_DS18B20 ;然后拉高数据线,释放总线进入接受状态
NOP
NOP
NOP
MOV R0,#32H
TSR2: JNB P_DS18B20,TSR3 ;等待DS18B20回应
DJNZ R0,TSR2
LJMP TSR4 ;延时
TSR3: SETB FLAG ;置标志位,表示DS1820存在
LJMP TSR5
TSR4: CLR FLAG ;清标志位,表示DS1820不存在
LJMP TSR7
TSR5: MOV R0,#06BH
TSR6: DJNZ R0,TSR6 ;时序要求延时一段时间
TSR7: SETB P_DS18B20
RET
;程序名称:READ_TEMP
;功能:读取DS18B20的数据
;入口参数:TEMPERATURE_L,TEMPERATURE_H
;出口参数:无
READ_TEMP:
SETB P_DS18B20
LCALL INIT_TEMP ;先复位DS18B20
JB FLAG,TSS2
RET ;判断DS1820是否存在?若DS18B20不存在则返回
TSS2: MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_18B20
MOV A,#44H ;发出温度转换命令
LCALL WRITE_18B20
LCALL DISPLAY ;等待AD转换结束,12位的话750微秒
LCALL INIT_TEMP ;准备读温度前先复位
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_18B20
MOV A,#0BEH ;发出读温度命令
LCALL WRITE_18B20
LCALL READ_18B20 ;将读出的温度数据保存到35H/36H
RET
程序名称:WRITE_18B20
;功能:将A保存的数值写入DS1820中,
;入口参数:A 寄存器
;出口参数:无
WRITE_18B20:
MOV R2,#8 ;一共8位数据,串行通信
CLR C
WR1: CLR P_DS18B20
MOV R3,#07
DJNZ R3,$
RRC A ;循环右移
MOV P_DS18B20,C
MOV R3,#3CH
DJNZ R3,$ ;23*2 = 46微妙
SETB P_DS18B20
NOP
DJNZ R2,WR1 ;A里面一共是8位,所以要送8次
SETB P_DS18B20 ;释放总线
RET
;程序名称:READ_18B20
;功能:读取18B20中的数据,由于是串行通信,每次读取一个,循环8次读取
;入口参数:TEMPRATURE_L
;出口参数:无
READ_18B20:
MOV R4,#4 ;将温度高位和低位从DS18B20中读出
MOV R1,#TEMPERATURE_L
RE00: MOV R2,#8 ;数据一共有8位
RE01: CLR C
SETB P_DS18B20
NOP
NOP
CLR P_DS18B20
NOP
NOP
NOP
SETB P_DS18B20
MOV R3,#09
RE10: DJNZ R3,RE10
MOV C,P_DS18B20
MOV R3,#3CH
RE20: DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;程序名称:SCAN_KEY
;功能:扫描键盘
;入口参数:DIS_BUF_G,DIS_BUF_S,DIS_BUF_B
;出口参数:KEY_BUF_G,KEY_BUF_S,kEY_BUF_B
SCAN_KEY:
JB K_ENTER,QUIT ;如果又Enter键入,则开始键盘输入
LCALL K_DELAY
JB K_ENTER,QUIT
CLR ENTER_FLAG ;每次进来都赋值输入标志,设置为0
MOV KEY_BUF_G,DIS_BUF_G ;将当前的温度赋值给KEY_BUF
MOV KEY_BUF_S,DIS_BUF_S
MOV KEY_BUF_B,DIS_BUF_B
K_LOOP:
JB ENTER_FLAG,QUIT ;如果输入完成,ENTER_FLAG则为1,退出键盘程
;序
JB K_ENTER,KUP
CALL PRO_ENTER
KUP: JB K_UP,KDOWN
CALL PRO_UP
KDOWN: JB K_DOWN,LOOPA
CALL PRO_DOWN
LOOPA: LCALL DISPLAY
SJMP K_LOOP
QUIT: RET
;程序名称:PRO_ENTER
;功能:确认键盘输入和退出键盘输入
;入口参数:ENTER_FLAG
;出口参数:ENTER_FLAG
PRO_ENTER:
CALL K_DELAY
JB K_ENTER,K_LOOP ;按钮抖动处理
SETB E NTER_FLAG
CALL K_DELAY
RET
;程序名称:PRO_UP
;功能:数值上调处理
;入口参数:KEY_BUF_G,KEY_BUF_S,KEY_BUF_B
;出口参数:DIS_BUF_G,DIS_BUF_S,DIS_BUF_B
PRO_UP:
CALL K_DELAY
JB K_UP,K_LOOP ;按钮抖动处理
INC KEY_BUF_G ;个位增一
MOV A,KEY_BUF_G
CJNE A,#0AH,UPNEXT ;个位增加到10,回0
MOV KEY_BUF_G,#00H
INC KEY_BUF_S ;十位加一
MOV A,KEY_BUF_S
CJNE A,#0AH,UPNEXT ;十位超过99,溢出了
MOV R0,#200
ERROR1: LCALL ERR ;出错,显示8888
DJNZ R0,ERROR1
DEC KEY_BUF_S ;退回99
MOV KEY_BUF_G,#09H
UPNEXT:
MOV DIS_BUF_G,KEY_BUF_G
MOV DIS_BUF_S,KEY_BUF_S
MOV DIS_BUF_B,KEY_BUF_B
CALL K_DELAY
RET
;程序名称:PRO_DOWN
;功能:数值下调处理
;入口参数:KEY_BUF_G,KEY_BUF_S,KEY_BUF_B
;出口参数:DIS_BUF_G,DIS_BUF_S,DIS_BUF_B
PRO_DOWN:
CALL K_DELAY
JB K_DOWN,K_LOOP ;按钮抖动处理
DEC KEY_BUF_G ;个位减一
MOV A,KEY_BUF_G
CJNE A,#0FFH,DOWNNEXT ;个位减到0,回到9
MOV KEY_BUF_G,#09H
DEC KEY_BUF_S ;十位减一
MOV A,KEY_BUF_S
CJNE A,#0FFH,DOWNNEXT;十位低于0,溢出了
MOV R0,#200
ERROR2: LCALL ERR ;出错,显示8888
DJNZ R0,ERROR2
INC KEY_BUF_S ;退回00
MOV KEY_BUF_G,#00H
DOWNNEXT:
MOV DIS_BUF_G,KEY_BUF_G ;增加完成后,赋值退出,然后DISPLAY
;显示出来
MOV DIS_BUF_S,KEY_BUF_S
MOV DIS_BUF_B,KEY_BUF_B
CALL K_DELAY
RET
K_DELAY: ;键盘抖动延时子程序
MOV R6,#250
DL20MS_1:
MOV R7,#200
DJNZ R7,$
DJNZ R6, DL20MS_1
RET
;可控硅控制
SWITCH:
MOV A,KEY_BUF_G ;三个Buffer都是0的话,说明还没有输入数值,直
;接退出
JNZ SNEXT
MOV A,KEY_BUF_S
JNZ SNEXT
MOV A,KEY_BUF_B
JZ SQUIT
SNEXT: CALL SET_DIS_BUF
MOV A,KEY_BUF_S
SUBB A,DIS_BUF_S
JC COOL
JNZ HOT ;十位如果相等,那么继续比较个位
MOV A,KEY_BUF_G
SUBB A,DIS_BUF_G
JC COOL
HOT: CLR P_SWITCH ;P_SWITCH为0说明当前温度小于设定温度,要升温,
;所以接电阻丝
SETB P1.3 ;报警
SJMP SQUIT
COOL: SETB P_SWITCH ;P_SWITCH 为1说明当前温度大于设定温度
SETB P1.3 ;报警
SQUIT: RET
;程序名称:SET_DIS_BUF
;功能:赋值给DIS_BUF_G, DIS_BUF_S, DIS_BUF_B
;入口参数:TEMPERATURE_LC,TEMPERATURE_HC
;出口参数:DIS_BUF_G, DIS_BUF_S, DIS_BUF_B
SET_DIS_BUF:
MOV A,TEMPERATURE_LC
ANL A,#0FH
MOV DIS_BUF_X,A ;小数位
MOV A,TEMPERATURE_LC
SWAP A
ANL A,#0FH
MOV DIS_BUF_G,A ;个位
MOV A,TEMPERATURE_HC
ANL A,#0FH
MOV DIS_BUF_S,A ;十位
MOV A,TEMPERATURE_HC
SWAP A
ANL A,#0FH
MOV DIS_BUF_B,A ;百位
MOV A,TEMPERATURE_HC
ANL A,#0F0H
CJNE A,#010H,NEXT0
SJMP NEXT1
NEXT0: MOV A,TEMPERATURE_HC
ANL A,#0FH
JNZ NEXT1 ;十位数是0
MOV A,TEMPERATURE_HC
SWAP A
ANL A,#0FH
MOV 73H,#0AH ;符号位不显示
MOV 72H,A ;十位数显示符号
NEXT1: RET
;程序名称:DISPLAY
;功能:显示数据到数码管中。
;入口参数:DIS_BUF_G, DIS_BUF_S, DIS_BUF_B
;出口参数:无
DISPLAY:
MOV DPTR,#DISTAB
MOV R3,#0FEH
MOV R1,#DIS_BUF_B
DPLOP: MOV A,@R1
MOVC A,@A+DPTR
MOV P2,R3
MOV P0,A
CJNE R3,#0FBH,DPNEXT
CLR P0.7
DPNEXT: MOV A,R3
RL A
MOV R3,A
DEC R1
CALL DS1M
CJNE R3,#0EFH,DPLOP
MOV P0,#0FFH ;一次显示结束,P0口复位
MOV P2,#0FFH ;P2口复位
RET
DS1M: MOV R7,#0FFH
DJNZ R7,$
RET
;数码管TAB
DISTAB:
DB 0C0H ;0
DB 0F9H ;1
DB 0A4H ;2
DB 0B0H ;3
DB 099H ;4
DB 092H ;5
DB 082H ;6
DB 0F8H ;7
DB 080H ;8
DB 090H ;9
DB 0FFH ;NONE
END下载本文