所以设计中提出了一个智能温度频率和电压监测系统的设计方案,该方案用的单片机为CPU来实现的,将采集到的信号输入单片机系统,通过软件的控制,将电压,频率,温度的数值通过查表的方式得出结果。功能是实现温度和电压的连续监测,并通过数码管显示出来,如超限则报警。它的按键电路实现设置温度及电压的上限值,;当采集到的温度或电压超过用户设的限值时,报警电路发出报警信号,并通过单片机的控制模块,作出一系列反应,保证工厂的正常运转。开始状态下,数码管显示hello,其中通过键盘的设置可以转换不同对象测量与控制。
关键词:自动控制;温控;频率;电压;电机控制
ABSTRACT
Along with the digital information, in all walks of life, and the rapid development of information industry system, digital will become the future trend of development. Industrial system, in the narrow space by operating barns, and often faced many functions, different sizes, range, the dashboard only occupied panel space, and not intuitive, an emergency, easy cause by the personnel department incorrect operation or reaction to operate lags behind, cause unnecessary trouble. In this system, for example, the temperature voltage frequency proposed measure frequency and voltage, temperature, more intuitively systems for frequency and voltage, temperature monitoring, and can be set limits on alert after more, make simple processing. In a certain extent, baoding parameters constant.
So the design of an intelligent temperature forward frequency and voltage monitoring system, the design of the scheme for the use of the CPU chip, will be collected signal input software, through the SCM system, control voltage, frequency, temperature value through check result. Function is continuous monitoring of voltage and temperature, and through digital display, such as the off-gauge tube is alarming. Its key circuit implementation of voltage and temperature setting of the upper limit value. When the temperature or collected over the voltage limit users, alarm circuit issued a warning signal, and through the MCU control module, and made a series of reactions, and ensure the normal operation of the plant. Start condition, digital display hello, including through tube keyboard Settings can convert different objects of measurement and control.
Key Words:automatic; temperature control; frequency l; voltage;electric motor control
目 录
1 引 言 .......................................................... 1 2方案论证及简述 .................................................... 3 2.1方案选择 .......................................................... 3
2.1.1温度传感器的选用 ...................................... 3 2.1.2控制核心的选择 ........................................ 4 2.1.3显示电路 .............................................. 4 2.1.4调速方式 .............................................. 4 2.1.5控制部件 .............................................. 5
2.2 系统简述 ......................................................... 5
2.2.1功能简述 .............................................. 5 2.2.2主要性能参数 .......................................... 6 2.2.3系统框图 .............................................. 6
3系统总体硬件设计 .................................................. 7 3.1单片机 ............................................................ 7
3.1.1单片机简介 ............................................ 7 3.1.2芯片AT89S52的引脚图 .................................. 7 3.1.3 AT89S52各管脚功能 .................................... 8
3.2 温度采集电路的设计 ............................................... 9
3.2.1芯片DS18B20简介 ...................................... 9 3.2.2 DS18B20芯片内部结构介绍 .............................. 9 3.2.3芯片DS18B20的温度计算 ............................... 11 3.2.4芯片DS18B20测量原理 ................................. 12 3.2.5 DSl8B20工作过程及时序 ............................... 12 3.2.6DSl8B20与单片机的接口电路 ............................ 13
3.3频率检测电路 ..................................................... 14
3.3.1基本原理 ............................................. 14 3.3.2 555电路 ............................................. 14 3.3.3频率产生电路 ......................................... 15
3.4电压检测电路 ..................................................... 16
3.4.1AD0809 ................................................ 16 3.4.2机理 ................................................. 18
3.5键盘控制电路设计 ................................................. 19 3.6电源电路 ......................................................... 19 3.7数码管显示电路 ................................................... 20
3.7.18255 .................................................. 20 3.7.2显示电路 ............................................. 21
3.8无级调速电路 ..................................................... 23 4 软件部分的设计 ................................................... 24 4.1按键输入软件去抖动 ............................................... 24 4.2 主程序 .......................................................... 24 4.3频率测量程序 ..................................................... 26 4.4电压测量程序 ..................................................... 27 4.5温度测量程序 ..................................................... 27
4.5.1 读出温度子程序 ....................................... 28 4.5.2温度转换命令子程序 ................................... 29 4.5.3 计算温度子程序 ....................................... 29
结 论 ........................................................... 30 参考文献 ........................................................... 31 致 谢 ........................................................... 32 附录1原理图 ....................................................... 33 附录2源程序代码 ................................................... 34
1 引 言
工业的特殊性决定了其所处环境及参数的特定性。为了保证某些产品的优良性能,必须是工业生产中的参数恒定。如温度。湿度。二氧化碳浓度,电压等。在工业领域,上述参数的作用是不言而喻的,像某些精密仪器的生产使用和保护存放等都需要一定范围内的系数稳定。而在农业中最典型就是存放粮食的仓库,其对温度和适度的要求有目共睹,否则就会造成粮食的腐烂变质。带来损失。
而在工业以及电子行业中,这种现象尤为突出,像某些高精电子产品设备的使用,都有很高的外部条件限制,需要对其所处的环境,加载的电压电流条件做出精确的测控,以保证设备不被损坏。
监控系统就可以方便我们解决上述问题,通过监控系统的实时测量和监控,我们就可以较精确的掌握设备元件所处的状态,避免不必要的情况发生。而当出现紧急情况时,通过监控系统,我们可以做一些简单的防护处理级应急措施,从而避免更大的伤害和损失。
监控系统主要涉及一些信息的采集,显示与传输,或者简单的应急处理,由于应用场合不同,采集的对象参数也不同。其系统设通的设计也较为复杂,涉及面较广包括自动化检测技术,过程控制技术,通信技术,计算机技术等。
所在科技广泛发展的今天,计算机的发展已经越来越快,它的应用已经越来越广泛。而单片机的发展和应用是其中的重要一方面。单片机在工业生产(机电、化工、轻纺、自控 等等)和民用家电各方面有广泛的应用。其中,单片机在工业生产中的应用尤其广泛。
所以,本设计将采用单片机和传感器的结合方式。
随着信息化、数字化在各行各业的迅猛发展,信息化、数字化也将成为未来的发展趋势。而在传统的相关系统中,经常要面对功能众多、大小不等、量程各异的仪表盘,这些仪表盘不仅占用空间,而且不够直观,在实际应用中,情况紧急时,容易造成人员的误操作或反应滞后,给操作带来不必要的麻烦。而在本设计中,将采用一种更直观数字的显示系统来代替创痛的仪表盘。这样,可以更加直观地进行系统各参数监测,而不用先找位置,再进行各种仪表体积、量程的对比确认,最后才进行观测参数的读取,简化了过程,节省了时间。
1
由于温度电压频率的测量控制较为简单,硬件较容易设计,所用期间也比较便宜,所以,设计将以次三个参数为例,来探讨监控系统的应用。为其它参数的测控扩展作出准备,奠定基础。
而在半导体技术的支持下,温度监测器件发展迅速。而温度传感器是五花八门的各种传感器中最为常用的一种,现代的温度传感器外形非常得小,这样更加让它广泛应用在生产实践的各个领域中,也为我们的生活提供了无数的便利和功能。进入21世纪后,智能温度传感器正朝着高精度、多功能、总线标准化、高可靠性及安全性、开发虚拟传感器和网络传感器、研制单片测温系统等高科技的方向迅速发展。
而频率、电压监测系统实现频率和电压的连续监测,并通过数码管分别显示,如超限则报警。它的按键电路实现设置温度及A/D转换的上限值,当采集到的信号超过用户设的上限值时,报警电路发出报警信号;设计系统包括检测模块、A/D转换模块、按键模块、数据存储模块、供电电路模块、报警电路模块、显示电路和单片机最小系统模块几个部分。
本设计综合性较强,本次设计重点对测温硬件、软件的组成进行了分项、模块化逐步分析设计,对各部分的电路进行了一一介绍,最终实现了该系统的硬件电路,并绘制了电路原理总图,完成了硬件调试。根据硬件的设计和测控仪所要实现的功能,本次设计对软件也进行了一一设计,并经过反复的模拟运行、调试,修改简化了软件系统,最后形成了一套完整的程序系统。
2
2方案论证及简述
2.1方案选择
系统实现温度控制及品频率电压的测量。需要有较高的温度变化分辨率和稳定可靠的换档停机控制部件及A/D转换芯片。 2.1.1温度传感器的选用
温度传感器可由以下几种方案可供选择:
方案一:选用热敏电阻作为感测温度的核心元件,通过运算放大器放大由于温度变化引起热敏电阻电阻的变化、进而导至的输出电压变化的微弱电压变化信号,再用AD转换芯片ADC0809将模拟信号转化为数字信号输入单片机处理。
方案二:采用热电偶作为感测温度的核心元件,配合桥式电路,运算放大电路和AD转换电路,将温度变化信号送入单片机处理。
方案三:采用数字式集成温度传感器DS18B20作为感测温度的核心元件,直接输出数字温度信号供单片机处理。
对于方案一,采用热敏电阻有价格便宜、元件易购的优点,但热敏电阻对温度的细微变化不敏感,在信号采集、放大、转换过程中还会产生失真和误差,并且由于热敏电阻的R-T关系的非线性,其本身电阻对温度的变化存在较大误差,虽然可以通过一定电路予以纠正,但不仅将使电路复杂稳定性降低,而且在人体所处温度环境温度变化中难以检测到小的温度变化。故该方案不适合本系统。
对于方案二,采用热电偶和桥式测量电路相对于热敏电阻其对温度的敏感性和器件的非线性误差都有较大提高,其测温范围也非常宽,从-50摄氏度到1600摄氏度均可测量。但是依然存在电路复杂,对温度敏感性达不到本系统要求的标准,故不采用该方案。
对于方案三,由于数字式集成温度传感器DS18B20的高度集成化,大大降低了外接放大转换等电路的误差因素,温度误差很小,并且由于其感测温度的原理与上述两种方案的原理有着本质的不同,使得其温度分辨力极高。温度值在器件内部转换成数字量直接输出,简化了系统程序设计,又由于该传感器采用先进的单总线技术(1-WRIE),与单片机的接口变的非常简洁,抗干扰能力强。关于DS18B20的详细参数参看下面“硬件设计”中的器件介绍。
3
2.1.2控制核心的选择
方案一:采用电压比较电路作为控制部件。温度传感器采用热敏电阻或热电偶等,温度信号转为电信号并放大,由集成运放组成的比较电路判决控制风扇转速,当高于或低于某值时将风扇切换到相应档位。
方案二:采用单片机作为控制核心。以软件编程的方法进行温度判断,并在端口输出控制信号。
对于方案一,采用电压比较电路具有电路简单、易于实现,以及无需编写软件程序的特点,但控制方式过于单一,不能自由设置上下限动作温度,无法满足不同用户以及不同环境下的多种动作温度要求,故不在本系统中采用。
对于方案二,以单片机作为控制器,通过编写程序不但能将传感器感测到的温度通过显示电路显示出来,而且用户能通过键盘接口,自由设置上下限动作温度值,满足全方位的需求。并且通过程序判断温度具有极高的精准度,能精确把握环境温度的微小变化。故本系统采用方案二。 2.1.3显示电路
方案一:采用共阴数码管显示,动态扫描显示方式。 方案二:采用液晶显示屏LCD显示。
对于方案一,该方案成本低廉,显示明确醒目,在夜间也能看见,功耗极低,显示驱动程序的编写也相对简单,这种显示方式得到广泛应用。不足的地方是扫描显示方式是使LED逐个点亮,因此会有闪烁,但是人眼的视觉暂留时间为20MS,当数码管扫描周期小于这个时间时人眼将感觉不到闪烁,因此可以通过增大扫描频率来消除闪烁感。
对于方案二,液晶体显示屏具有显示字符优美,不但能显示数字还能显示字符甚至图形的优点,这是LED数码管无法比拟的。但是液晶显示模块价格昂贵,驱动程序复杂,从简单实用的原则考虑,本系统采用方案一。 2.1.4调速方式
方案一:采用变压器调节方式,运用电磁感应原理将220V电压通过线圈降压到不同的电压,控制风扇电机接到不同电压值的线圈上可控制电机的转速,从而控制风扇风力大小。
方案二:采用晶闸管构成无级调速电路。
对于方案一,由于采用变压器改变电压调节,有风速级别限制,不能适应人性化要求。且在变压过程中会有损耗发热,效率不高,发热有不安全因素。
4
对于方案二,以电位器控制晶闸管的导通角大小,可实现由最大风速到关闭的无级别调速,可将风力调节在关闭无风到最大风之间的任意风力,实现“自由风”。且在调速环节中基本无电力损耗。故本系统采用方案二。 2.1.5控制部件
方案一:采用数模转换芯片AD0832控制,由单片机根据当前温度值送出相应数字量到AD0832,由AD0832产生模拟信号控制晶闸管的导通角,从而配合无级调速电路实现温控时的自动无级风力调节。
方案二:采用继电器,继电器的接有控制晶闸管导通角的电阻的接入电路与否由单片机控制,根据当前温度值在相应管脚送出高/低电平,决定某个继电器的导通角控制电阻是否接入电路。
对于方案一,该方案能够实现在风扇处于温控状态时也能无级调速,但是D/A转换芯片价格较高,与其温控状态下无级调速功能相比性价比不高。
对于方案二,虽然在温控状态下只能实现弱/大风两级调速,但采用继电器价格便宜,控制可靠,且出于在温控状态时无级调速并不是特别需要的功能,综合考虑采用方案二
2.2 系统简述
该系统主要是以MCS-51单片机为控制核心进行扩展的。 2.2.1功能简述
本系统由集成温度传感器、单片机、LED数码管、继电器、双向晶闸管、蜂鸣器及一些其他外围器件组成。使用具有价廉易购的AT89S52单片机编程控制,通过修改程序可方便实现系统升级。
1.利用单片机和键盘实现对温度,电压,频率等参数的检测既不同参数是做做模式的转换。
2.利用单片机和芯片 DS18B20扩展的温度采集电路,来实现对室内温度的检测。 3.利用单片机和芯片 6N137 扩展的电机控制电路,来实现在不同模式下电机的不同工作方式。
4.利用电机来模拟对温度参数的调节。
5.利用单片机和数码管组成的显示电路,为用户提供电路的工作信息。 6.报警。
5
2.2.2主要性能参数
温度人工设定: 0到100摄氏度;
温度采集:范围-55到125摄氏度,误差在±0.5℃ 内; 电机工作方式:无既调速。 2.2.3系统框图
温度传感器单片机数码管显示 555 无级调速器 被控对象 AD转换 人工控制
图 2-1 系统框图
6
3系统总体硬件设计
3.1单片机
3.1.1单片机简介
AT89C52 是一种带4K字节闪存可编程可擦除只读存储器(FPEROM)256B片内RAM的低电压,高性能CMOS8 位微处理器。该器件采用ATMEL 高密度非易失存储器制造技术制造,与工业标准的MCS-51 指令集和输出管脚相兼容。由于将多功能8 位CPU 和闪烁存储器组合在单个芯片中,ATMEL 的AT89C52 是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 3.1.2芯片AT89S52的引脚图
AT89S51240引脚的双列直插封装(DIP方式)。AT89S52的引脚图如图3-1所示。
图3-1 AT89S52引脚图
7
3.1.3 AT89S52各管脚功能
VCC:供电电压。 GND:接地。
P0 口:P0 口为一个8 位漏级开路双向I/O 口,每脚可吸收8TTL 门电流。当P1 口的管脚第一次写1 时,被定义为高阻输入。P0 能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH 编程时,P0 口作为原码输入口,当FIASH 进行校验时,P0输出原码,此时P0 外部必须被拉高。
P1 口:P1 口是一个内部提供上拉电阻的8 位双向I/O 口,P1 口缓冲器能接收输出4TTL门电流。P1 口管脚写入1 后,被内部上拉为高,可用作输入,P1 口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH 编程和校验时,P1 口作为第八位地接收。
P2 口:P2 口为一个内部上拉电阻的8 位双向I/O 口,P2 口缓冲器可接收,输出4 个TTL 门电流,当P2 口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2 口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2 口当用于外部程序存储器或16 位地址外部数据存储器进行存取时,P2 口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2 口输出其特殊功能寄存器的内容。P2 口在FLASH 编程和校验时接收高八位地址信号和控制信号。
P3 口:P3 口管脚是8 个带内部上拉电阻的双向I/O 口,可接收输出4 个TTL 门电流。当P3 口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3 口将输出电流(ILL)这是由于上拉的缘故。P3 口也可作为AT89C51 的一些特殊功能口。P3.0:RXD(串行输入口);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(外部数据存储器读选通)。P3 口同时为闪烁编程和编程校验接收一些控制信号。
RST:复位输入。当振荡器复位器件时,要保持RST 脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH 编程期间,此引脚用于输入编程脉冲。在平时,ALE 端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE 脉冲。如想禁止ALE 的输出可在SFR8EH 地址上置0。此时,ALE 只有在执行MOVX,MOVC 指令是ALE 才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE 禁止,置位无效。/PSEN:外部程序存储器的选通信号。在由外部程序存储
8
器取指期间,每个机器周期两次/PSEN 有效。但在访问外部数据存储器时,这两次有效的/PSEN 信号将不出现。/EA/VPP:当/EA 保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1 时,/EA 将内部锁定为RESET;当/EA 端保持高电平时,此间内部程序存储器。在FLASH 编程期间,此引脚也用于施加12V 编程电源(VPP)。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出温度采集电路的设计。
3.2 温度采集电路的设计
3.2.1芯片DS18B20简介
BS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器。它具有微型化、低功耗、高性能抗干扰能力、强易配处理器等优点,特别适合用于构成多点温度测控系统,可直接将温度转化成串行数字信号给单片机处理,且在同一总线上可以挂接多个传感器芯片,它具有三引脚TO-92小体积封装形式,温度测量范围-55~+125℃,可编程为9~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可在远端引入,业可采用寄生电源方式产生,多个DS18B20可以并联到三根或者两根线上,CPU只需一根端口线就能与多个DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。从而可以看出DS18B20可以非常方便的被用于远距离多点温度检测系统。
3.2.2 DS18B20芯片内部结构介绍
图3-2 DS18B20内部结构图
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址
9
序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码
(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。
设置寄存器位于高速闪存的低5个字节,这个寄存器中的内容被用来确定温度的转换精度。寄存器各位的内容如表3-1所示:
表3-1DS18B20 的设置寄存器各位内容
BIT7 TM
该寄存器的低五位一直都是 1 , TM 是测试模式位,用于设置 DS18B20 在工作模式还是在测试模式。在 DS18B20 出厂时该位被设置为 0 ,用户不要去改动。 R1 和 R0 用来设置分辨率,如表3-2所示:( DS18B20 出厂时被设置为 12 位)。
表3-2分辨率设置
R1
R0
分辨率
温度最大转换时间
0 0 1 0
0 1 0 0
由表3-2可知,设定的分辨率越高,所需要的温度数据转换时间就越长。因此,在实际应用中要在分辨率和转换时间权衡考虑。
9位 10位 11位 12位
93.75ms 187.5ms 375ms 750ms
BIT6 R1
BIT5 R0
BIT4 1
BIT3 1
BIT2 1
BIT1 1
BIT0 1
10
DS18B20 温度传感器的内部存储器包括一个高速暂存 RAM 和一个非易失性的可电擦除的 E2RAM, 后者存放高温度和低温度触发器 TH 、 TL 和结构寄存器。数据先写入 RAM ,经校验后再传给 E2RAM 。
暂存存储器包含了 8 个连续字节,前两个字节是测得的温度信息,第一个字节的内容是温度的低八位 TL ,第二个字节是温度的高八位 TH 。第三个和第四个字节是 TH 、 TL 的易失性拷贝,第五个字节是结构寄存器的易失性拷贝,这三个字节的内容在每一次上电复位时被刷新。第六、七、八个字节用于内部计算。第九个字节是冗余检验字节,可用来保证通信正确。 DS18B20 的分布表3-3所示:
表3-3 DS18B20 的暂存寄存器分布
寄存器位置 地址
温度低八位数
0
温度高八位数
1
2
3
4
5
高温阈值
低温阈值
保留
保留
计数剩余值 6
每度记数值 7
8 CRC校验
在64 b ROM 的最高有效字节中存储有循环冗余校验码( CRC )。主机根据 ROM 的前 56 位来计算 CRC 值,并和存入 DS18B20 中的 CRC 值做比较,以判断主机收到的 ROM 数据是否正确。 3.2.3芯片DS18B20的温度计算
DS18B20温度传感器是用16位符号扩展的二进制补码读数形式提供,以0.0625摄氏度形式表示,其中S为符号位。
DS18B20用12位存贮温度值,最高位为符号位,图3-3所示,为DS18B20的温度存储方式负温度S=1正温度S=0:
0550H为+85,0191H为25.0625,FC90H为-55。
温度低字节 MSB 温度高字节 LSB S
S
S
图3-3 温度数据值格式
11
S S
3.2.4芯片DS18B20测量原理
如图3-4所示,图中低温度系数振荡器的振荡频率受温度的影响很小,用于生产固定频率的脉冲信号送给减法计数器1;高温度系数振荡器随着温度变化其振荡频率明显改变,所以产生信号作为减法计数器2的脉冲输入。
图3-4还有隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产
生的时钟脉冲进行计数,进而完成温度测量。计数门的开启时间由高温系数振荡器来决定,每次测量前,首先将-55℃所对应的一个基数分别置入减法计时器1和温度寄存器中,减法计时器1和温度寄存器被预置在-55℃所对应的一个基数值。
斜率累预置 低温度系数振荡器 加器 计数比预置 温度寄存器 减减法计数器1 减到0 高温度系数振荡器 减法计数器2 图3-4 DS18B20测温度原理
减法计数器1对低温度系数振荡器产生的脉冲信号进行减法计数,当减法计数器1的预置值降到0时,温度寄存器的值加1,减法计数器1的预置值重新装入,并重新开始对低温度系数振荡器产生的脉冲信号进行计数。如此循环,直到减法计数器2计数到0时,停止温度寄存器数的累加,此温度寄存器的数值就是测量温度。 3.2.5 DSl8B20工作过程及时序
DSl820工作过程中的协议如下
初始化;ROM操作命令;存储器操作命令;处理数据 1初始化
单总线上的所有处理均从初始化开始 2 ROM操作品令
总线主机检测到DSl820的存在便可以发出ROM操作命令,
12
Read ROM(读ROM) [33H] Match ROM(匹配ROM) [55H] Skip ROM(跳过ROM] [CCH] Search ROM(搜索ROM) [F0H] Alarm search(告警搜索) [ECH] 3存储器操作命令 指令 代码
Write Scratchpad(写暂存存储器) [4EH] Read Scratchpad(读暂存存储器) [BEH] Copy Scratchpad(复制暂存存储器) [48H] Convert Temperature(温度变换) [44H] Recall EPROM(重新调出) [B8H] Read Power supply(读电源) [B4H] 4时序
主机使用时间隙(time slots)来读写DSl820的数据位和写命令字的位 (1)初始化
主机总线to时刻发送一个复位脉冲(最短为480us的低电平信号)接着在tl时刻释放总线并进入接收状态DSl820在检测到总线的上升沿之后等待15-60us接着DS1820在t2时刻发出存在脉冲(低电平持续60-240 us) 。
(2)写时间隙
当主机总线t o时刻从高拉至低电平时就产生写时间隙从to时刻开始15us之内应将所需写的位送到总线上DSl820在t后15-60us间对总线采样若低电平写入的位是0,若高电平写入的位是1,则连续写2位间的间隙应大于1us。
(3)读时间隙
主机总线to时刻从高拉至低电平时总线只须保持低电平l7us之后在t1时刻将总线拉高产生读时间隙,读时间隙在t1时刻后t2时刻前有效tz距to为15us,也就是说tz时刻前主机必须完成读位,并在to后的60us一120us内释放总线。 3.2.6DSl8B20与单片机的接口电路
DSl8B20可以有两种供电方式:一种是采用电源供电方式,此时DSl8B20的1管脚接地,2管脚作为信号线,3管脚接电源;另一种是寄生电源供电方式,如图3-5所示,单片机端口接单线总线,为保证在有效的DSl8B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。
13
单 片 机
图3-5 DSl8B20两种供电方式
单 片 机 3.3频率检测电路
3.3.1基本原理
被测输入信号通过脉冲形成电路进行放大与整形(可由放大器与门电路组成),然后送到单片机入口,单片机计数脉冲的输入个数。计数结果经LED数码管显示,从而得到被测信号频率。
电路实现的关键是设法取得准确的一秒定时,并让计数器只计数一秒,这样计数结果则为频率值。实现的方法是利用单片机内的16位定时/计数器,用定时器/计数器0作为定时器,实现一秒定时;用定时器/计数器1作为计数器,对输入的脉冲进行计数。所以通过单片机每秒测量P3.4的脉冲数来作为频率的值。由于P3.4的第2功能是外部脉冲计数引脚T0,所以只需美妙读取计数器T0的值作为频率值即可。 3.3.2 555电路
555电路是一种数字,模拟混合型的中规模集成电路,555电路的内部电路方框图如图3-6所示。它含有两个电压比较器,一个基本RS触发器,一个放电开关管T,
14
2VCC31VCC32VCC31VCC3
比较器的参考电压由三只 5KΩ的电阻器构成的分压器提供。它们分别使高电平比较器A1 的同相输入端和低电平比较器A2的反相输入端的参考电平为 和 。A1与A2的输出端控制RS触发器状态和放电管开关状态。当输入信号自6脚,即高电平触发输入并超过参考电平时 ,触发器复位,555的输出端3脚输出低电平,同时放电开关管导通;当输入信号自2脚输入并低于 时,触发器置位,555的3脚输出高电平,同时放电开关管截止。
RD是复位端(4脚),当RD=0,555输出低电平。平时RD 端开路或接VCC
图3-6 555内部框图及管脚
VC是控制电压端(5脚),平时输出1/3VCC作为比较器A1 的参考电平,当5脚外接一个输入电压,即改变了比较器的参考电平,从而实现对输出的另一种控制,在不接外加电压时,通常接一个0.01μf的电容器到地,起滤波作用,以消除外来的干扰,以确保参考电平的稳定。
T为放电管,当T导通时,将给接于脚7的电容器提供低阻放电通路。 555定时器主要是与电阻、电容构成充放电电路,并由两个比较器来检测电容器上的电压,以确定输出电平的高低和放电开关管的通断。这就很方便地构成从微秒到数十分钟的延时电路,可方便地构成单稳态触发器,多谐振荡器,施密特触发器等脉冲产生或波形变换电路。 3.3.3频率产生电路
如图3-7,由555定时器和外接元件R1、R2、C构成多谐振荡器,脚2与脚6直接相连。电路没有稳态,仅存在两个暂稳态,电路亦不需要外加触发信号,利用电源通过R1、R2向C充电,以及C通过R2向放电端 Ct 放电,使电路产生振荡。和V CC2VCC之间充电和放电,其波形如图6-3 (b)所示。输出信号的时间参数是 315
13
T=tw1+tw2, tw1=0.7(R1+R2)C, tw2=0.7R2C
555电路要求R1 与R2 均应大于或等于1KΩ ,但R1+R2应小于或等于3.3MΩ。
外部元件的稳定性决定了多谐振荡器的稳定性,555定时器配以少量的元件即可获得较高精度的振荡频率和具有较强的功率输出能力。因此这种形式的多谐振荡器应用很广。
(a) (b)
图3-7多谐振荡器
本设计就是利用555来组成频率可跳得多谐振荡器,电路数出借T0,当改变R3时,输出频率随之改变。
3.4电压检测电路
3.4.1AD0809
ADC0809是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件。它是逐次逼近式A/D转换器,可以和单片机直接接口。
16
图3-8 ADC0809的内部逻辑结构
由图3-8可知,ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。
(2). 引脚结构
图3-9 ADC0809管脚图
IN0-IN7:8条模拟量输入通道 。
ADC0809对输入模拟量要求:信号单极性,电压范围是0-5V,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路。
地址输入和控制线:4条 。
ALE为地址锁存允许输入线,高电平有效。当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进
17
转换器进行转换。A,B和C为地址输入线,用于选通IN0-IN7上的一路模拟量输入。通道选择表如表3-4所示。
表3-4通道选择表
C 0 0 0 01 1 1 1 1
B 0 0 1 1 0 0 1 1
A 0 1 0 1 0 1 0 1
选择的通道
IN0 IN1 IN2 IN3 IN4 IN5 IN6 IN7
数字量输出及控制线:11条
ST为转换启动信号。当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平。EOC为转换结束信号。当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。OE=1,输出转换得到的数据;OE=0,输出数据线呈高阻状态。D7-D0为数字量输出线。
CLK为时钟输入信号线。因ADC0809的内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为500KHZ。
VREF(+),VREF(-)为参考电压输入。 3.4.2机理
单片机本身只能识别和处理一种离散的数字信号,而在实际的控制系统中,需要监测和控制的是一些电压、电流等随时间连续变化的电物理量,所以为了实现单片机对一个应用系统的控制和检测,A/D转换电路是必不可少的设计环节。
A/D转换由上述集成电路0809完成。0809具有8路模拟信号输入端口,其中地址线 (23~25脚)可决定对哪一路模拟信号进行A/D转换。22脚为地址锁存控制,当输入为高电平时,对地址信号进行锁存。6脚为测试控制,当输入一个22s宽高电平脉冲时,开始开始A/D转换。7脚为A/D转换结束标志,当A/D转换结束时,7脚输出高电平。9脚为A/D转换数据输出允许控制,当OE脚为高电平时,A/D转换数据从该端口输出。l0脚为0809的时钟输入端,利用单片机30引脚的六分频晶振频率再通过14024Z分频得到 1MHz时钟。电路如图3-10示
18
图3-10电压测量电路
3.5键盘控制电路设计
在这种行列式矩阵键盘非编码键盘的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。当确认有按键按下后,下一步就要识别哪一个按键按下。对键的识别通常有两种方法:一种是常用的逐行扫描查询法;另一种是速度较快的线反转法。
对照图3-11的4*4键盘,说明线反转法工作原理。首先辨别键盘中有无键按下,有单片机I/O口向键盘送全扫描字,然后读入行线状态来判断。方法是:向行线输出全扫描字00H,把全部列线置为低电平,然后将列线的电平状态读入累加器A中。如果有按键按下,总会有一根行线电平被拉至低电平从而使行线不全为1。判断键盘中哪一个键被按下是通过将列线逐列置低电平后,检查行输入状态来实现的。方法是:依次给列线送低电平,然后查所有行线状态,如果全为1,则所按下的键不在此列;如果不全为1,则所按下的键必在此列,而且是在与零电平行线相交的交点上的那个键。
3.6电源电路
电源电路采用LM7805集成稳压器作为稳压器件,用典型接法,9 V电源整流滤波后送入端接一个470U除纹波,得到
19
LM7805稳压,在输出和0.1U电容进一步滤5V稳压电源。
图3-11 4*4键盘
3.7数码管显示电路
3.7.1 8255芯片
8255A是Intel公司生产的可编程并行I/O口芯片,具有3个8位的并行I/O口,分三种工作方式,可通过编程干煸其功能,因而使用灵活,通用性强。本设计将单片机的P0口利用8255外扩,完成单片机的数码显示部分。可编程接口芯片8255A中文内容摘要本文着重介绍可编程并行接口8255A的功能应用和具体的编程实现. 8255A采用40条引脚的双列直插式(DIP)封装, 其引脚有,CS:片选信号(输入),RD:读信号(输入),WR:写信号(输入),A1,A0:片内寄存器选择信号(输入),D7~D0:与CPU侧连接的数据线(双向),PA7~PA0:A口外设数据线(双向),PB7~PB0:B口外设数据线(双向),PC7~PC0:C口外设数据线(双向),RESET:复位信号(输入).内部结构由以下四部分组成: 数据端口A、B、C;A组控制和B组控制;读/写控制逻辑电路;数据总线缓冲器. 8255A具有三个相互独立的输入/输出通道:通道A、通道B、通道C.8255A有三种工作方式方式0:基本输入/输出方式,无应答信号。A、B、C均可设成此方式。方式1:应答式输入输出,数据传输采用应答方式, A口、B口可工作在此方式下,征用C口部分位作为应答信号。方式2:双向传输方式。只有A口可设成此方式。
8255A引脚如图3-12示,内部结构如图3-13。
20
图3-12 8255引脚图
3.7.2显示电路
显示部分包括如图3-14:两个共阴数码管、NPN型三极管、电阻等。其连接方式如下:应用单8255扩展口PA口连接数码管,用PB口端口作为数码管的片选信号输出端口,其中要用9013(NPN型)三极管做驱动。为了防止烧坏数码管,所以给数码管各段各加一个680欧姆的限流电阻。要显示的数据通过PA口送给数码管显示,通过PB端口分别对数码管进行位选,事实上数码管是间断被点亮的,只是其间断时间十分短,扫描周期在20ms以下,利用人眼视觉暂留,我们基本看不出它们的闪烁。
21
图3-13 8255内部结构图
图3-14显示电路
22
3.8无级调速电路
此电路如图3-15所示,包括:双向可控硅,双触发二极管、滑动变阻器、电容。 该电路为无级调速电路,通过调节滑动变阻器的阻值来改变通过双向二极管的电流,控制双向晶闸管的导通角,从而控制电机的转速。
图3-15无级调速电路
23
4 软件部分的设计
4.1按键输入软件去抖动
其实,作为一个按键从没有按下到按下以及释放是一个完整的过程,也就是说,当我们按下一个按键时,总希望某个命令只执行一次,而在按键按下的过程中,不要有干扰进来,因为,在按下的过程中,一旦有干扰过来,可能造成误触发过程,这并不是我们所想要的。因此在按键按下的时候,要把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除掉,一般情况下,我们可以采用电容来滤除掉这些干扰信号,但实际上,会增加硬件成本及硬件电路的体积,这是我们不希望,总得有个办法解决这个问题,因此我们可以采用软件滤波的方法去除这些干扰信号,一般情况下,一个按键按下的时候,总是在按下的时刻存在着一定的干扰信号,按下之后就基本上进入了稳定的状态。具体的一个按键从按下释放的全过程的信号图如图4-1所示:从图中可以看出,我们在程序设计时,从按键被识别按下之后,延时5ms以上,从而避开了干扰信号区域,我们再来检测一次,看按键是否真得已经按下,若真得已经按下,这时肯定输出为低电平,若这时检测到的是高电平,证明刚才是由于干扰信号引起的误触发,CPU就认为是误触发信号而舍弃这次的按键识别过程。从而提高了系统的可靠性。由于要求每按下一次,命令被执行一次,直到下一次再按下的时候,再执行一次命令,因此从按键被识别出来之后,我们就可以执行这次的命令,所以要有一个等待按键释放的过程,显然释放的过程,就是使其恢复成高电平状态。
图4-1按键机械接触干扰图
4.2 主程序
监控的软件在整个系统中起着极其重要的作用,他在系统运行的过程中,对硬件进行实时的控制。由于该监控系统工作比是很复杂,所以操作系统采用单程线地方法
24
系统工作过程如图4-2:第一步对硬件及参数进行初始化;第二步进入线程,系统开始工作。进入线程后,根据选择的工作模式开始工作。与工作模式相关的参数采集设定等都是在相应子程序中完成的。
数码管显示 图4-2系统主程序流程图
N 温度监控及超限报警 温度Y N 模拟电压监控机超限报警 电压频率N Y 频率监控及超限报警 键盘扫描 初始化 开始 25
4.3频率测量程序
开机上电启动后,系统会自动进入开机界面,在数码管上显示hello的欢迎词。然后,操作者按下矩阵键盘的A键可以切换到频率模式,这时,单片机对频率进行采样,并通过数码管显示当前频率值。操作者按下B键可以设置报警电路的上线,在数码管上,需要设置的数据会自动闪烁,便于操作者设置,当设置完成后,系统会自动调处设置模式,按下B键调回频率检测界面。在监控界面下,如果检测到的测量值大于操作节的设定值,那么蜂鸣器会发出警报声。
初始化程序主要用于设置定时器的工作模式,计数器的初值以及中断屏蔽位。该段程序分两部分:第一部分是对定时器相关存储器的设置;第二部分是中断允许的设置。中断程序主要实现频率值得读取。该段程序实现的是设定每50秒中断一次,中断20次时计时一秒,这是读取计数器1的值也就是当前的频率值。然后,读取的数值进行处理后,通过它调用数码管显示程序显示出来。
图4-3频率程序流程图
中断出子程序设置限超限Y报警 设置限设置YN设置YN设置限子程序中断入N
26
4.4电压测量程序
开机上电启动后,系统会自动进入开机界面,在数码管上显示hello的欢迎词。然后,操作者按下矩阵键盘的A键可以切换到电压模式,这时,单片机对电压进行采样,并通过数码管显示当前电压值。操作者按下B键可以设置报警电路的上线,在数码管上,需要设置的数据会自动闪烁,便于操作者设置,当设置完成后,系统会自动调处设置模式,按下B键调回电压检测界面。在监控界面下,如果检测到的测量值大于操作节的设定值,那么蜂鸣器会发出警报声。
图4-4电压程序流程图
子程序设置限超限Y报警 设置YN
N子程序4.5温度测量程序
操作者按下矩阵键盘的A键可以切换到温度模式,这时,单片机对温度进行采样,并通过数码管显示当前温度值。操作者按下B键可以设置报警电路的上线,在数码管
27
上,需要设置的数据会自动闪烁,便于操作者设置,当设置完成后,系统会自动调处设置模式。
温度检测的程序分为3个部分,首先,CPU向BS18B20发送控制字44H,启动BS18B20进行温度转换。其次CPU向BS18B20发控制字BEH,命令BS18B20准备读取温度测量结果。再次,读取转换后的测量结果,叫并给寄存器,等待进一步处理。
同样,超限报警电路是通过比较当前读数与设定限定值来实现的。程序主线控中,实施的比较读数与设定限定值,如果检测到的测量值大于操作节的设定值,则将报警标志位置位,蜂鸣器会发出警报。 4.5.1 读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节。在读出时须进行CRC校验,校验有错时不进行温度数据的改写。流程图如图4-5:
完 Y 图4-5 读出温度子程序流程图
28
发DS18B20CRC校验正发跳过ROM命令 移入温度发读取温度命Y N 读取操作,CRC结束 9字节N
4.5.2温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令。当采用12位分辨率时,转换时间约750ms。在本程序设计中,采用1s显示延时法等待转换完成。流程图如图4-6:
图4-6 温度转换命令子程序流程图
4.5.3 计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值的正负判断。流程图如图4-7:
温度Y N 置“+”计算整数位温度BCD码 开始 计算小数位温度结束 发温度转换开发跳过发DS18B20复 温度值取补码置“-” 结束 图4-7 计算温度子程序流程图
29
天津职业技术师范大学2010届本科生毕业设计
结 论
将本电路用硬件做出来,用编程器将KEIL软件对源程序编译生成的.HEX文件烧入AT89C52单片机,将单片机插入到目标板中,连好线。进行测试。
可以对温度进行自由设定,到那时必须在0-100摄氏度单位内频率检测及超限警报;定时的对频率进行检测,如果超过设定的值,通过蜂鸣器发出警告;
模拟电压检测及超限警报;定时的对模拟电压进行检测,如果超过设定的上限,通过蜂鸣器发出警告;
温度检测及超限警报;定时的对温度进行检测,如果超过设定的值,通过蜂鸣器发出警告;
当前温度高于于所设的温度的限度时,可以对无极降温度操作。
30
天津职业技术师范大学2010届本科生毕业设计
参考文献
[1]. 单片机原理与应用技术 .江力 主编 .清华大学出版社 .2006 [2]. 微型计算机接口技术 . 王兆月等 编著. 机械工业出版社 .2006 [3]. 数字电子技术 . 江晓安等 编著. 西安电子科技大学出版社 .1993 [4]. ME300B说明书 .伟纳电子 编著. 伟纳电子出版 .2006
[5]. 计算机工程(第35卷 第三期).顾春阳,任玲,王广林 基于单片机的水箱温度自动测控系统设计 2009年 2月
[6].电路(第五版).邱关源 罗先觉 编著.高等教育出版社.2006 [7].Protel DXP电路设计.林刚等 编著.清华大学出版社.2005
[8].单片机在中频热推弯管机温度控制上的应用 毛有武; 吴树森; 罗吉荣; 熊闰珍 热加工工艺 2003-04-30 期刊
[9].采用单片机控制的热处理系统 谢志远; 辛开远 电力情报 1995-09-30 期刊
[10].温度远程无线自动控制系统的设计 杨穗; 杨恢先; 王子菡; 陶霞 电子器件 2005-12-26 期刊
[11].基于语音的温度控制系统设计 孙世君; 吴秀娟 丹东纺专学报 2005-03-25 期刊 0 45
[12].温度控制方法及其装置 陈国光; 杨帅杰; 高继生 华为技术有限公司 2006-01-04 专利
[13].单片机实现温度自动控制系统研究 刘春英; 刘盾 天津职业技术师范学院学报 2000-09-28 期刊
[14]..光纤温度传感器在永磁共振磁体温控系统中的应用 陈文波; 罗斌斌 中国医疗器械信息 2007-10-25 期刊
[15]一种冰箱温度控制方法 张献峰; 郑新建 河南新飞电器有限公司 2006-04-12 专利
[16]一种智能控制器在铍青铜热处理中的应用 薛凌云 测控技术 2004-04-18 期刊
31
天津职业技术师范大学2010届本科生毕业设计
致 谢
经过两个多月的忙碌和工作,本次毕业设计已经接近尾声,作为一个本科生的毕业设计,由于经验的匮乏,难免有许多考虑不周全的地方,如果没有导师的督促指导,以及一起工作的同学们的支持,想要完成这个设计是难以想象的。
在这里首先要感谢我的导师徐丽娟老师。徐老师平日里工作繁多,但在我做毕业设计的每个阶段,从查阅资料到设计草案的确定和修改,中期检查,后期详细设计,装配草图等整个过程中都给予了我悉心的指导。我的设计较为复杂烦琐,但是徐老师仍然细心地纠正图纸中的错误。除了敬佩徐老师的专业水平外,她的治学严谨和科学研究的精神也是我永远学习的榜样,并将积极影响我今后的学习和工作。
其次要感谢我的同学对我无私的帮助,特别是在软件的使用方面,正因为如此我才能顺利的完成设计,感谢所有的兄弟姐妹们,在生活与学习中,对我的关怀与帮助。怀念我们一起经历的点点滴滴。
我要感谢我的母校,是母校给我们提供了优良的学习环境;另外,我还要,感谢大学期间授我业、解我惑的全体老师,是你们教会我专业知识。没有他们的谆谆教导,我就不可能完成毕业设计。
在此,我再说一次谢谢!
32
天津职业技术师范大学2010届本科生毕业设计
附录1原理图
33
天津职业技术师范大学2010届本科生毕业设计
附录2源程序代码
#include sbit DQ P1^2; //通信引脚声明 sbit p1_3=ox93; //蜂鸣器引脚声明 sbit p3_3=oxb3; //ADC0809转换结束监视引脚声明 #define TURE 1 / #define FALSE 0 #define TIMEMODE OX15 //定时计数器模式 #define TIME1usH_C oxFC #define TIME1usL_C ox18 #define PORTA ox8FF //8255A口地址 #define PORTB ox9FF //8255B口地址 #define PORTC oxAFFF //8255C口地址 #define CADDR oxBFFF //8255控制字地址 #define ADC0809 oxF0FF //ADC0809地址 #define uchar unsigned char #define unint unsigned int bit flash; //闪烁控制位 bit cl_flash; //蜂鸣器间歇发声控制位 bit clkflag; //蜂鸣器使能标志位 bit if_keypress; //按键监控使能标志位 bit warning_set; //设置限度值标志位 bit hunset,tenset,sinset,bitset; uchar g_b1msFlag,g_b100msFlag,g_b6swapFlag; //定使用寄存器 uchar keypresscnt; //按键计数器 uchar waening_tam,waening_freq,waening_vol; uchar modecnt; uchar Keynum; unint frequency,vol; 34 天津职业技术师范大学2010届本科生毕业设计 void delay(unsigned int N); //延时子程序 uchar Reset(void); uchar read_bit(void); void write_bit(unsigned char bitval); void write_Byte(unsigned char val); uchar read_Byte(void); void WriteData(unsigned int Addr,unsigned char Data); uchar ReadData(unsigned int Addr); void Start(void); //开机界面程序 void Testtemperature(void); void Testfrequency(void); void TestVoltage(void); void Printer(void); void Delay(void); void Ini(void); //初始化子程序 uchar Keyboard(void); uchar Handiekey(void); uchar show[8]; //8位显示数码管组 code uchar word[10]={ox3f,ox06,ox5b,ox4f,ox66,ox6d,ox7d,ox07,ox7f,ox6f}; //0-9 code uchar hello[8]={ox00,ox00,ox76,ox79,ox38,ox38,ox3f,ox00}; //HELLO显示码 void main(void) { Ini(); while(1) { Keynum=Handlekey(); //按键处理 switch(Keynum) //ABCDEF键处理 { 35 天津职业技术师范大学2010届本科生毕业设计 case ox0a: //切换工作模式 modecnt++; if(modecnt==4) modecnt=0; clkflag=0; break; case oxob: //设置限制 clkflag=0; warningset=~warningset; keypresscnt=0; break; default: break; } switch(modecnt) //判断工作模式 { case 0: Start(); break; case 1: Testtemperature(); break; case 2: Testfrequency(); break; case 3: TestVoltage(); break; default: break; } 36 天津职业技术师范大学2010届本科生毕业设计 Printer() } } //--------------------------- //延时子程序 //--------------------------- void delay(unsigned int N) { int i; for(i=0;i return(deceive_ready); } uchar read_bit(void) { uchar i; DQ=0; DQ=1; 37 天津职业技术师范大学2010届本科生毕业设计 for(i=0;i<3;i++); return(DQ); } void write_bit(uchar bitval) { DQ=0; if(bitval==1) DQ=1; delay(5); DQ=1; } void write_Byte(uchar val) { uchar i,temp; EA=0: for(i=0;i<8;i++) { temp=val>>i; temp=temp&px01; write_bit(temp); delay(5); } EA=1; } uchar read_Byte(void) { uchar i,m,receive_data; m=1; receive_data=0; EA=0; 38 天津职业技术师范大学2010届本科生毕业设计 for(i=0;i<8;i++) { if(read_bit()) { receive_data=receive_data+(m<delay(6); } EA=1; return(receive_data); } //--------------------------- //初始化程序 //--------------------------- void Ini(void) { g_b1msFlag,g_b100msFlag,g_b6swapFlag=0; cl_flash=1; warning_tam=40; warning_freq=20; warning_vol=5: hunset,tenset,sinset,bitset=0; modecnt=0; if_keypress=0; keypresscnt=0; TMOD=TIMEMODE; TH1=TIME1usH_C; TL1=TIME1usL_C; TH0=0; TL0=0; TR1=TURE; tR0=FALSE; 39 //初始化标志位 天津职业技术师范大学2010届本科生毕业设计 ET1=1; //此处只允许Time1r中断 EA=1; //8255工作模式 WriteData(CADDR,ox81); WriteData(PORTC,oxff); } //--------------------------- //开机程序 //--------------------------- void Start(void) { show[0]=hello[0]; //显示HELLO show[1]=hello[1]; show[2]=hello[2]; show[3]=hello[3]; show[4]=hello[4]; show[5]=hello[5]; show[6]=hello[6]; show[7]=hello[7]; }//--------------------------- //温度采样子程序 //--------------------------- void Testtemperature(void) { uchar Hbyte,Lbyte,task; while(Reset()); //复位 write_Byte(oxcc); //一次采样 write_Byte(ox44); while(Reset()); write_Byte(oxcc); write_Byte(oxbe); Lbyte=read_Byte(); 40 天津职业技术师范大学2010届本科生毕业设计 Hbyte=read_Byte(); if(warning_set) ( clkflag=0; show[0]=ox40; show[1]=ox40; show[2]=ox40; show[3]=ox00; switch(keypresscnt) //设置限度值 { case 0: if_keypress=0; hunset=1; tenset=0; sinset=0; break; case 1: if(if_keypress) { warning_tam=keynum*100+warning_tam-(warning_tam/100)*100; hunset=0; tenset=1; if_keypress=0; } break; case 2: if(if_keypress) { warning_tam=keynum*10+warning_tam-((warning_tam%100)/10)*10; tenset=0; sinset=1; 41 天津职业技术师范大学2010届本科生毕业设计 if_keypress=0; } break; case 3: if(if_keypress) { warning_tam=keynum+warning_tam-warning_tam%10; sinset=0; if_keypress=1; keypresscnt=0; warning_set=~warning_set; } break; default; break; } task=warning_tam; if(cl_flash&hunset) show[4]=ox00; else { show[4]=word[(task/100)]; } if(cl_flash&tenset) show[5]=ox00; else { task=task%100; show[5]=word[(task/10)]; } if(cl_flash&sinset) 42 天津职业技术师范大学2010届本科生毕业设计 show[6]=ox00; else { task=task%10; show[6]=word[task]ox80; } show[7]=word[0]; } else { show[0]=ox07; show[1]=ox79; show[2]=ox73; show[3]=ox00; task=((Lbyte&oxf0))>>4((Hbyte&ox0f))<<4; if(task>=warning_tam) //判断是否超限 clkflg=1; else clkflg=0; show[4]=word[(task/100)]; task=task%100; show[5]=word[(task/10)]; task=task%10; show[6]=word[task]ox80; show[7]=word[((Lbyte&ox0f)*10)/16]; } } //--------------------------- //频率采样子程序 //--------------------------- void Testfrequency(void) { 43 天津职业技术师范大学2010届本科生毕业设计 if(warning-set) { clkflag=0; show[0]=ox40; show[1]=ox40; show[2]=ox40; show[3]=ox00; switch(keypresscnt) { case 0: if_keypress=0; tenset=1; sinset=0; break; case 1: if(if_keypress) { warning_freq=keynum*10+warning_rweq-(warning_freq/10)*10; sinset=1; tenset=0; if_keypress=0; } break; case 2; if(if_keypress) { warning_freq=keynum+warning_rweq-warning_freq%10; sinset=0; if_keypress=0; keypresscnt=0; warning_set=~waring_set } 44 天津职业技术师范大学2010届本科生毕业设计 break; default: break; } if(cl_flash&&tenset) show[6]=ox00; else show[6]=word[(warning_freq/10)]; if(cl_flash&&sinset) show[7]=ox00; else show[7]=word[(warning_freq%10)]; } else { show[0]=ox71; show[1]=ox77; show[2]=ox79; show[3]=ox00; show[4]=ox00; show[5]=ox00; show[6]=word[frequency/10]; show[7]=word[frequency%10]; if(frequency>=warning_freq) clkflag=1; else clkflag=0; } } 45 天津职业技术师范大学2010届本科生毕业设计 //--------------------------- //电压采样子程序 //--------------------------- void TestVoltage(void) { if(warning_set) { clkflag=0; show[0]=ox40; show[1]=ox40; show[2]=ox40; show[3]=ox00; switch(keypresscnt) { case 0: if_keypress=0; sinset=1; break; case 1: if(if_keypress) { warning_vol=keynum; sinset=0; if_keypress=0; keypresscnt=0; warning_set=~ warning_set; } break; default; 46 天津职业技术师范大学2010届本科生毕业设计 break; } if(cl_flash&&sinset) show[5]=px00; else show[5]=word[warning_vol]ox80; show[6]=word[0]; show[7]=word[0]; } else { show[0]=ox3e; show[1]=ox3f; show[2]=ox38; show[3]=ox00; show[4]=ox00; WriteData(ADC0809,ox00); while(!p3_3); vol=ReadData(); if((vol/51}>=warning_vol) clkflag=1; else clkflag=0; show[5]=word[vol/51]ox80; vol=vol%51; showp6]=word[(vol*10)/51]; vol=(vol*10)%51; show[7]=word[(vol*10)/51]; } } 47 //启动一次采样及转换 天津职业技术师范大学2010届本科生毕业设计 //--------------------------- //显示子程序 //--------------------------- void Printer(void) { unint i; uchar MaSk,mask=ox01; for(i=0;i<8;i++) { MaSk=mask; mask=mask<<1; WriteData(PORTA,show[i]); WriteData(PORTB,MASK); Delay(); WriteData(PORTA,ox00); WriteData(PORTB,MASK); } } void WriteData(unint Addr,ucgar Data) { *((uchar xdara*)Addr)=Dara; } unsigned char ReadData(unsigned int Addr) { return*((unsigned char xdata*)Addr); } //--------------------------- //延时程序 //--------------------------- 48 天津职业技术师范大学2010届本科生毕业设计 void Delay(void) { int i,j; for(i=0;i<20;i++) for(j=0;j<5;j++); } //--------------------------- //键盘扫描程序 //--------------------------- unsigned char Keyboard(void) { unsigned char scan,keypress=ox00; unsigned int i; unsigned char MASK,mask=ox10; for(i=0;i<4;i++) { MASK=-mask; mask=mask<<1; WriteData(PORTC,MASK); scan=ReadData(PORTC); if((scan&ox0f)!ox0f) { if_keypress=1; //按键监视位置1 keypresscnt++; //按键计数器位置1 keypress=scan; ) while((ReadData(PORTC)&ox0f); //等待按键释放 } return keypress; } 49 天津职业技术师范大学2010届本科生毕业设计 uchar Handlekey(void) { unsigned char handlekey; switch(Keyboard()) { case oxee: handlekey=ox01; break; case oxed: handlekey=ox02; break; case oxeb: handlekey=ox03; break; case oxe7: handlekey=ox04; break; case oxde: handlekey=ox05; break; case oxdd: handlekey=ox06; break; case oxdb: handlekey=ox07; break; case oxd1: handlekey=ox08; break; case oxbe: handlekey=ox09; break; case oxbd: 50 天津职业技术师范大学2010届本科生毕业设计 handlekey=ox00; break; case oxbb: handlekey=ox0a; break; case oxb7: handlekey=ox0b; break; case ox7e: handlekey=ox0c; break; case ox7d: handlekey=ox0d; break; case ox7b: handlekey=ox0e; break; case ox77: handlekey=ox0f; break; default: handlekey=oxff; break; } return handlekey; }//--------------------------- //定时器1中断服务 //--------------------------- void Timer1_int(void) interrupt 3 { TH1=TIME1usH_C; TL1=TIME1usL_C; 51 天津职业技术师范大学2010届本科生毕业设计 if(clkflag&&cl_flash&&flash) P1_3=-P1_3; if(g_b6swapFlag==6) { g_b6swapFlag=0; flash=-flash; } if(g_b1msFlag==100) { g_b1msFlag=0; g_b6swapFlag++; g_b100msFlag++; if(g_b100msFlag==10) { g_b100msFlag=0; if(modecnt==2) { TR0=TUTE; frequency=TL0; TH0=TL0=0; } else { TR0=FALSE; TH0=TL0=0; } } cl_flash=-cl_flash; } g_b1msFlag++; } 52 天津职业技术师范大学2010届本科生毕业设计 53 因篇幅问题不能全部显示,请点此查看更多更全内容