毕业设计(论文)-单片机水温控制系统设计.doc_第1页
毕业设计(论文)-单片机水温控制系统设计.doc_第2页
毕业设计(论文)-单片机水温控制系统设计.doc_第3页
毕业设计(论文)-单片机水温控制系统设计.doc_第4页
毕业设计(论文)-单片机水温控制系统设计.doc_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本科生毕业论文(设计)系(院) 物理与电子工程学院 专 业 电子信息工程 论文题目 水温控制系统 学生姓名 指导教师 班 级 2008级电信2班 学 号 完成日期:2012 年 04月 05日水温控制系统 设 计【摘要】该水温控制系统采用单片机进行温度实时采集与控制。温度信号由“一线总线”数字化温度传感器ds18b20提供,ds18b20在30+85c范围内, 固有测温分辨率为0.5 。水温实时控制采用继电器控制电热丝进行升温控制。系统具备较高的测量精度和控制精度,能完成升温和降温控制。关键字:stc89c52 ds18b20 水温控制1 前言 一些价格比较昂贵和具有极大观赏性的鱼出现在大家的眼球,比如蝴蝶鱼,银龙鱼,但是它们对于水温的要求比较苛刻,因此饲养这种鱼类需要对温度进行严格的控制,使其有一个正常的生活环境。2 总体设计方案21设计任务设计并制作一个水温自动控制系统,控制对象为1l净水,容器为搪瓷器皿。水温可以在一定范围内由人工设定,并能在环境温度降低时实现自动控制,以保持设定的温度基本不变。22方案选择 根据题目要求系统模块分可以划分为:温度测量模块,显示电路模块,加热模块,控制模块。221控制器模块部分根据题目要求,控制器主要用于对温度测量信号的接受和处理、控制电热丝和风扇使控制对象满足设计要求、控制显示电路对温度值实时显示以及控制键盘实现对温度值的设定等。对控制器的选择有以下三种方案:方案一:采用fpga作为系统控制器。fpga功能强大,可以实现各种复杂的逻辑功能,规模大,密度高,它将所有器件集成在一块芯片上,减少了体积,提高了稳定性,并且可应用eda软件仿真、调试,易于进行功能扩展。fpga采用并行的i/o口方式,提高了系统的处理速度,适合作为大规模实时系统控制核心。由温度传感器送来的温度信号,经fpga程序对其进行处理,控制加热装置动作。但由于本设计对数据处理的速度要求不高,fpga的高速处理的优势得不到充分体现,并且其成本偏高,引脚较多,硬件电路布线复杂。output显示电路加热装置测温部分键盘输入控制部分input图2.2.1 系统基本模块方框图方案一:采用fpga作为系统控制器。fpga功能强大,可以实现各种复杂的逻辑功能,规模大,密度高,它将所有器件集成在一块芯片上,减少了体积,提高了稳定性,并且可应用eda软件仿真、调试,易于进行功能扩展。fpga采用并行的i/o口方式,提高了系统的处理速度,适合作为大规模实时系统控制核心。由温度传感器送来的温度信号,经fpga程序对其进行处理,控制加热装置动作。但由于本设计对数据处理的速度要求不高,fpga的高速处理的优势得不到充分体现,并且其成本偏高,引脚较多,硬件电路布线复杂。方案二:采用模拟运算放大器组成pid控制系统。对于水温控制是足够的。但要附加显示、温度设定等功能,要附加许多电路,稍显麻烦。方案三:采用atmel公司的stc89c52作为系统控制器。单片机算术运算功能强,软件编程灵活、自由度大,可用软件编程实现各种算法和逻辑控制,并且其功耗低、体积小、技术成熟和成本低等优点。基于以上分析拟订方案二,由at89c52作为控制核心,对温度采集和实时显示以及加热装置进行控制。222加热装置有效功率控制模块部分根据题目,可以使用电热炉进行加热,控制电热炉的功率即可以控制加热的速度。当水温过高时,关掉电热炉进行降温处理,让其自然冷却。在制作中,我们装设一个小电风扇,当水温超高时关闭电炉开启风扇散热,当需要加热时开启电炉关闭风扇。由于加热的功率较大,考虑到简化电路的设计,我们直接采用220v电源。对加热装置控制模块有以下两种方案:方案一:采用可控硅来控制加热器有效功率。可控硅是一种半控器件,应用于交流电的功率控制有两种形式:控制导通的交流周期数达到控制功率的目的;控制导通角的方式控制交流功率。由交流过零检测电路输出方波经适当延时控制双向可控硅的导通角,延时时间即移相偏移量由温度误差计算得到。可以实现对交流电单个周期有效值周期性控制,保证系统的动态性能指标。该方案电路稍复杂,需使用光耦合驱动芯片以及变压器等器件。但该方案可以实现功率的连续调节,因此响应速度快,控制精度也高。方案二:采用继电器控制。使用继电器可以很容易实现地通过较高的电压和电流,在正常条件下,工作十分可靠。继电器无需外加光耦,自身即可实现电气隔离。这种电路无法精确实现电热丝功率控制,电热丝只能工作在最大功率或零功率,对控制精度将造成影响。但可以由多路加热丝组成功率控制,由单片机对温差的处理实现分级功率控制提高系统动态性能。基于以上分析以及现有器件限制选择方案二,采用继电器控制省去光耦和交流过零检测电路,在软件上选用适当的控制算法,同样可以达到较好的效果。223温度采集模块部分题目要求温度静态误差小于等于0.2,温度信号为模拟信号,本设计要对温度进行控制和显示,所以要把模拟量转换为数字量。该温度采集模块有以下三种方案:方案一:利用热电阻传感器作为感温元件,热电阻随温度变化而变化,用仪表测量出热电阻的阻值变化,从而得到与电阻值相应的温度值。最常用的的是铂电阻传感器,铂电阻在氧化介质中,甚至在高温的条件下其物理,化学性质不变。由铂电阻阻值的变化经小信号变送器xtr101将铂电阻随温度变化的转换为420ma线形变化电路,再将电流信号转化为电压信号,送到a/d转换器adc0809.即将模拟信号转换为数字信号。该方案线性度优于0.01。方案二:采用温度传感器ad590k。ad590k具有较高精度和重复性,良好的非线性保证0.1的测量精度。加上软件非线性补偿可以实现高精度测量。ad590将温度转化为电流信号,因此要加相应的调理电路,将电流信号转化为电压信号。送入8为a/d转换器,可以获得255级的精度,基本满足题目要求。 方案三:采用数字温度传感器ds18b20。ds18b20为数字式温度传感器,无需其他外加电路,直接输出数字量。可直接与单片机通信,读取测温数据,电路简单。如图2.2.2 所示 。图2.2.2 ds18b20测温电路基于以上分析和现有器件所限,温度采集模块选用方案三。ds18b20与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现912位的数字值读数方式。并且从ds18b20读出的信息或写入ds18b20的信息仅需要一根口线(单线接口)读写,因而使用ds18b20可使系统结构更趋简单,可靠性更高。他在测温精度、转换时间、传输距离、分辨率等方面带来了令人满意的效果。224 键盘与显示模块部分根据题目要求,水温要由人工设定,并能实时显示温度值。对键盘和显示模块有下面两种方案: 方案一:采用液晶显示屏和通用矩阵键盘。液晶显示屏(lcd)具有功耗小、轻薄短小无辐射危险,平面直角显示以及影象稳定不闪烁,可视面积大,画面效果好,抗干扰能力强等特点。但由于只需显示三位温度值,信息量比较少,且由于液晶是以点阵的模式显示各种符号,需要利用控制芯片创建字符库,编程工作量大,控制器资源占用较多,其成本也偏高。方案二:采用三位led七段数码管分别显示温度的十位、个位和小数位。按键采用单列3按键进行温度设定。数码管具有:低能耗、低损耗、低压、寿命长、耐老化,对外界环境要求较低。同时数码管采用bcd编码显示数字,程序编译容易,资源占用较少。根据以上论述,采用方案二。本系统中,采用了数码管的动态显示,节省单片机的内部资源。2.2.5系统各模块的最终方案根据以上分析,结合器件和设备等因素,确定如下方案: 1. 采用at89c52单片机作为控制器,分别对温度采集、led显示、温度设定、加热装置功率控制。2. 温度测量模块采用数字温度传感器ds18b20。此器件经软件设置可以实现高分辨率测量。 3. 电热丝有效功率控制采用继电器控制,实现电路简单实用,加上温度变化缓慢可以满足设计要求。4. 显示用led数码管显示实时温度值,用enter、up、down三个单键实现温度值的设定。 outputled数码管继电器ds18b20键盘输入stc89c52input图2.2.3 系统基本框图系统的基本框图如图2.2.3 所示。cpu(stc89c52)首先写入命令给ds18b20,然后ds18b20开始转换数据,转换后通过89c52来处理数据。数据处理后的结果就显示到数码管上。另外由键盘设定温度值送到单片机,单片机通过数据处理发出温度控制信息到继电器。ds18b20可以被编程,所以箭头是双向的。3 硬件设计与实现31总体电路框图本系统的执行方法是循环查询执行的,键盘扫描也是用循环查询的办法,由于本系统对实时性要求不是很高,所以没有用到中断方式来处理。各模块关系图如图3.1.1所示。单片机初始话模块继电器控制模块键盘扫描模块(扫描有无enter键按下)ds18b20得到温度值,存放到buffer中处理温度值,换算成bcd码温度显示模块图3.1.1 总体电路框图3.2主要单元电路的设计3.2.1核心器件ds18b20的介绍ds18b20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有ltm8877,ltm8874等等。主要根据应用场合的不同而改变其外观。封装后的ds18b20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。独特的单线接口方式,ds18b20在与微处理器连接时仅需要一条口线即可实现微处理器与ds18b20的双向通讯。支持多点组网功能,多个ds18b20可以并联在唯一的三线上,最多只能并联8个,实现多点测温,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定。在使用中不需要任何外围元件。 ds18b20有4个主要的数据部件:光刻rom中的64位序列号是出厂前被光刻好的,它可以看作是该ds18b20的地址序列码;ds18b20中的温度传感器可完成对温度的测量,以12位转化为例;用16位符号扩展的二进制补码读数形式提供,以0.0625/lsb形式表达,其中s为符号位。 图3.2.1 ds18b20内部结构 图3.2.2 ds18b20封装示意图图3.2.3 ds18b20测温电路(1)dsi8b20的测温功能的实现:其测温电路的实现是依靠单片机软件的编程上。 当dsi8b20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的0,1字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式以0062 5lsb形式表示。温度值格式如表3.2.4所示,其中“s”为标志位,对应的温度计算:当符号位s=0时,直接将二进制位转换为十进制;当s=1时,先将补码变换为原码,再计算十进制值。dsi8b20完成温度转换后,就把测得的温度值与 th做比较,若tth或t rom操作命令 - 存储器操作命令- 处理数据 初始化 单总线上的所有处理均从初始化开始 rom操作命令 总线主机检测到dsl820的存在便可以发出rom操作命令之一这些命令如表3.2.5所示表3.2.5 rom操作命令表指令代码read rom(读rom)33hmatch rom(匹配rom)55hskip rom(跳过romcchsearch rom(搜索rom)f0halarm search(告警搜索)ech 存储器操作命令如表3.2.6所示表3.2.6 存储器操作命令表指令代码write scratchpad(写暂存存储器)4ehread scratchpad(读暂存存储器)behcopy scratchpad(复制暂存存储器)48hconvert temperature(温度变换)44hrecall eprom(重新调出)b8hread power supply(读电源)b4h(3)温度转换算法及分析由于ds18b20转换后的代码并不是实际的温度值,所以要进行计算转换。温度高字节(ms byte)高5位是用来保存温度的正负(标志为s的bit11bit15),高字节(ms byte)低3位和低字节来保存温度值(bit0 bit10)。其中低字节(ls byte)的低4位来保存温度的小数位(bit0 bit 3)。由于本程序采用的是0.0625的精度,小数部分的值,可以用后四位代表的实际数值乘以0.0625,得到真正的数值,数值可能带几个小数位,所以采取小数舍入,保留一位小数即可。也就说,本系统的温度精确到了0.1度。算法核心:首先程序判断温度是否是零下,如果是,则ds18b20保存的是温度的补码值,需要对其低8位(ls byte)取反加一变成原码。处理过后把ds18b20的温度copy到单片机的ram中,里面已经是温度值的hex码了,然后转换hex码到bcd码,分别把小数位,个位,十位的bcd码存入ram中。3.2.3加热控制部分由于本系统要控制电热丝加热,功率较大,因此要借助功率电路。在器件选择上留足余量,增加安全性。加热部分采用继电器控制,电路简单可靠。电路如图3.3.1所示。当实测温度低于设定值时,由单片机输出高电平信号。三极管9014导通,继电器开始工作对水加温。2.2.3键盘、显示、控制器部分本设计中采用动态显示方式驱动3个七段数码管,分别显示温度的十位、个位和小数位。数码管采用共阴极,由于at89c52单片机每个i/o的拉电流只有12ma。所以在位码和段码都加上了同相驱动器。键盘采用按键开关经上拉电阻分别接p1.0、p1.1、p1.2口上,起到控制、上调和下调作用。每按上调和下调键,设定温度值增1减1。单片机xtal2、xtal1接12mhzj晶振,提供系统时钟基值。另reset接复位按键。原理图如图3.3.2所示。图3.3.1 继电器控制图3.3.2 键盘、显示、控制器部分原理图4.系统软件设计系统的软件设计采用汇编语言,对单片机进行变成实现各项功能。主程序对模块进行初始化,而后调用读温度、处理温度、显示、键盘、和继电器各模块。用的是循环查询方式,来显示和控制温度。4.1读取ds18b20温度模块子程序每次对da18b20操作时多要按造ds18b20工作过程中的协议进行。初始化- rom操作命令- 存储器操作命令- 处理数据 程序流程图如图4.1.1所示。3.2数据处理子程序由于ds18b20转换后的代码并不是实际的温度值,所以要进行数据处理。由于本程序采用的是0.0625的精度,小数部分的值,可以用后四位代表的实际数值乘以0.0625,得到真正的数值,数值可能带几个小数位,所以采取四舍五入,保留一位小数即可。也就说,本系统的温度精确到了0.1度。首先程序判断温度是否是零下,如果是,则ds18b20保存的是温度的补码值,需要对其低8位(ls byte)取反加一变成原码。处理过后把ds18b20的温度copy到单片机的ram中,里面已经是温度值的hex码了,然后转换hex码到bcd码,分别把小数位,个位,十位的bcd码存入ram中。数据处理子程序流程图如图3.2.1所示。开始开始初始化ds18b20存在?rom操作命令存储操作命令读取温度值返回是否图3.1.1读取ds18b20温度子程序流程图返回数据传递温度是否为负?bcd码转换求补运算图3.2.1数据处理子程序流程图3.3键盘扫描子程序按键功能: 1. enter p1.0(k2)控制键2.up p1.1(k3)加1键3. down p1.2(k4)减1键键盘子程序流程图如图3.3.1所示。开始enter_flag为1?enter键是否按下?是否有enter键按下?是否有up键按下?是否有down键按下?display显示返回主程序enter子程序flag=1up子程序down子程序是是是是是否否否否否图3.3.1键盘子程序流程图3.4主程序流程图总模块流程图如图3.1.1所示。本软件设计采用循环查询来处理各个模块,温度是缓慢变化量所以可以满足性能要求。图3.1.1所示为系统主程序流程图否初始化开始调用a/d转换子程序ds18b20存在?数据处理子程序显示子程序键盘扫描子程序继电器控制子程序错误处理显示888是图3.1.1主程序流程图4. 系统测试4.1 静态温度测试测试方式:由于种种条件的限制,采用模拟加热方式进行测试。利用继电器的指示灯来显示继电器的动作。红灯表示加热,绿灯表示降温。测量仪器:空调温度显示屏测试结果如表4.1.1所示:表4.1.1 测试结果数据标准温度/2022252728测量温度/19.822.124.726.827.6误差/0.20.10.30.20.44.2动态温控测量测试方式:加热方式用体温对传感器ds18b20进行加热。设定控制温度,记录超调温度,稳态误差。超调温度与加热的功率有关,这里不再测量。测量仪器:空调温度显示屏测量结果如表4.2.1所示:表4.2.1 测试结果数据设定温度/29303335超调温度/1.30.91.10.6稳态误差/0.20.40.20.44.3结果分析有以上的测量结果可见,系统基本上达到了所要求的指标,静态测温的精度主要由ds18b20来决定。在控温指标中,影响系统的性能的因素很多。最关键的是加热系统本身的物理性质及控制算法。由于条件的限制,在本设计中采用体温进行测试。 附录1: 产品使用说明本水温控制系统能在099范围内设定任意温度值,超出此范围将有出错显示888,之后返回到99或0。通过按enter键确认开始温度设定;p1.1的up键为加1键,每按一次使设定温度值加1p1.2的down键为减1键,每按下一次设定温度值减1。设置完温度要在按erter键确认温度设定完成,之后显示实测温度值。当温度传感器没有接入时也将有出错提示显示888。附录2: 元件清单 元 件 数 量(个)at89s52 1ds18b20 17404 212mhz晶振 1继电器 1数码管 3按键开关 49014 21n4007 1发光二极管 21k8排阻 1100电阻 33k 44.5k 1500 1200 1 电解电容10f 130pf 228附录3 : 系统硬件原理图 附录4:软件程序清单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 key_buf_g data 39h ;键盘输入后,的个位值 key_buf_s data 49h ;键盘输入后,的十位值 k_enter equ p1.0 ;输入数据确认按钮 k_up equ p1.1 ;上调按钮 k_down equ p1.2 ;下调按钮 p_ds18b20 equ p3.0 ;读取ds18b20的输入端口 p_switch equ p1.7 ;继电器控制端口,1加热,0断开 p_fan equ p1.5 ;风扇控制,1-降温,0-断开 flag equ 20h.0 ;标志位,确定是否存在ds18b20,1-存在,0-不存在 enter_flag equ 20h.1 ;键盘输入的标志位,为0说明键盘正在输入,为1说明键盘输入退出;程序开始执行 org 0000h ljmp main org 0100hmain: mov sp,#60h ;初始化 mov key_buf_g,#00h ;由于key_buf是由用户输入的,所以先赋值初始化 mov key_buf_s,#00hnext: lcall read_temp ;调用读温度子程序 jb flag,normal ;判断是否有ds18b20的存在 call err ;不存在时显示错误信息ajmp nextnormal: lcall data_deal;处理从ds18b20得到的数据 lcall set_dis_buf;赋值给dis_buf_x,g,s, lcall display;调用数码管显示子程序 lcall scan_key;扫描键盘 lcall switch;处理继电器 ajmpnext;程序名称:err;功能:程序出错处理,显示三个8,即888;入口参数:无;出口参数:dis_buf_x,dis_buf_g, dis_buf_s, err:mov dis_buf_x,#08h ;如果没有找到ds18b20,那么就显示错误,错误显示为888 mov dis_buf_g,#08h mov dis_buf_s,#08h lcall display ret ;程序名称:data_deal;功能:处理采集后的的数据;入口参数:temperature_l;出口参数:dis_buf_g, dis_buf_s,dis_buf_xdata_deal: mov a,temperature_h ;判温度是否零下 anl a,#80h jz tempc1;a为0,说明是正数,跳往tempc1,如果是负数,则对低8为进行补码处理 clr c mov a,temperature_l;二进制数求补(双字节) cpl a;取反加1 add a,#01h mov temperature_l,a;取补码后存回temperature_l,此时temperature_l里面的值就可以表示温;度了,不过还要继续处理一下。 mov a,temperature_h cpl a addc a,#00h ;高位temperature_h取反,加上从低位temperature_l进来的位 mov temperature_h,a ;写回temperature_h mov temperature_hc,#0bh sjmp tempc11tempc1: mov temperature_hc,#0ah tempc11:mov a,temperature_hc swap a mov temperature_hc,a mov a,temperature_l anl a,#0fh ;取a低4位(小数位,单位是0.0625),得出来的数要乘以0.0625,通过查表来算出值 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 lcall htob ;转换hex值成为bcd码 mov temperature_l,a ;temperature_l目前存入的是十位和个位的bcd编码 anl a,#0f0h swap a orl a,temperature_hc ;temperature_hc low位 = 十位数 bcd mov temperature_hc,a mov a,temperature_l anl a,#0fh swap a ;temperature_lc hi位 = 个位数 bcd orl a,temperature_lc mov temperature_lc,aret; 小数部分码表tempdottab: db 00h,00h,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-02h;0.0625*4 = 0.25-03h;0.0625*5 = 0.3125-03h;以此类推.;程序名称:htob;功能:十六进制转 bcd;入口参数:a;出口参数:r7htob: mov b,#064h ;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是否是存在的;入口参数:无;出口参数:flaginit_temp: setb p_ds18b20 nop clrp_ds18b20 ;主机发出延时537微秒的复位低脉冲 movr0,#6bh movr1,#04htsr1: djnzr0,$ mov r0,#6bh djnz r1,tsr1 setb p_ds18b20 ;然后拉高数据线,释放总线进入接受状态 nop nop nop movr0,#32htsr2: jnb p_ds18b20,tsr3 ;等待ds18b20回应p djnzr0,tsr2 ljmptsr4;延时tsr3: setbflag;置标志位,表示ds1820存在 ljmptsr5tsr4: clrflag;清标志位,表示ds1820不存在 ljmptsr7tsr5: movr0,#06bhtsr6: djnzr0,tsr6;时序要求延时一段时间tsr7: setbp_ds18b20 ret;程序名称:read_temp;功能:读取ds18b20的数据;入口参数:temperature_l,temperature_h;出口参数:无read_temp: setb p_ds18b20 lcallinit_temp ;先复位ds18b20 jbflag,tss2 ret ;判断ds1820是否存在?若ds18b20不存在则返回tss2:mova,#0cch ;跳过rom匹配 lcallwrite_18b20 mova,#44h ;发出温度转换命令 lcallwrite_18b20;lcalldisplay ;等待ad转换结束,12位的话750微秒 lcallinit_temp ;准备读温度前先复位 mova,#0cch ;跳过rom匹配 lcallwrite_18b20 mova,#0beh ;发出读温度命令 lcallwrite_18b20 lcallread_18b20 ;将读出的温度数据保存到35h/36h ret;具体的步骤:初始化完后当拉低电平开始产生写时隙15微妙之内送入一位数据1560微妙1820来;采样读取它 ;程序名称:write_18b20;功能:将a保存的数值写入ds1820中,有具体的时序要求,详细参考附图的说明;入口参数:a 寄存器;出口参数:无write_18b20: movr2,#08h;一共8位数据,串行通讯 clrcwr1:clrp_ds18b20 movr3,#07h djnzr3,$ rrca;循环右移 movp_ds18b20,c movr3,#3ch djnzr3,$;23*2 = 46微妙 setbp_ds18b20 nop djnzr2,wr1;a里面一共是8位,所以要送8次 setbp_ds18b20;释放总线 ret;程序名称:read_18b20;功能:读取18b20中的数据,由于是串行通讯,每次读取一个,循环8次读取;入口参数:temprature_l;出口参数:无read_18b20: movr4,#02h;将温度高位和低位从ds18b20中读出 movr1,#temperature_lre00:mov r2,#08h;数据一共有8位re01:clr c setb p_ds18b20 nop nop clrp_ds18b20 nop nop nop setbp_ds18b20 movr3,#09hre10:djnz r3,re10 movc,p_ds18b20 movr3,#3chre20:djnz r3,re20 rrca djnz r2,re01 movr1,a decr1 djnz r4,re00 ret;程序名称:scan_key;功能:扫描键盘;入口参数:dis_buf_g,dis_buf_s, ;出口参数:key_buf_g,key_buf_s, 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_sk_loop: jb enter_flag,quit;如果输入完成,enter_flag则为1,退出键盘程序 jb k_enter,kup call pro_enterkup: jb k_up,kdown call pro_upkdown:jb k_down,loopa call pro_downloopa:lcall display sjmp k_loopquit: ret;程序名称:pro_enter;功能:确认键盘输入和退出键盘输入;入口参数:enter_flag;出口参数:enter_flagpro_enter: call k_delay jb k_enter,k_loop ;按键抖动处理 setb enter_flag call k_delay ret;程序名称:pro_up;功能:数值上调处理;入口参数:key_buf_g,key_buf_s, ;出口参数:dis_buf_g,dis_buf_s, 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,#200error1:lcall err ;出错,显示888 djnz r0,error1 dec key_buf_s ;退回99 mov key_buf_g,#09hupnext: mov dis_buf_g,key_buf_g mov dis_buf_s,key_buf_smov dis_buf_x,#00h call k_delay ret;程序名称:pro_down;功能:数值下调处理;入口参数:key_buf_g,key_buf_s, ;出口参数:dis_buf_g,dis_buf_s, 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,#200error2:lcall err ;出错,显示888 djnz r0,error2 inc key_buf_s ;退回00 mov key_buf_g,#00hdownnext: mov dis_buf_g,key_buf_g ;增加完成后,赋值退出,然后display显示出来 mov dis_buf_s,key_buf_smov dis_buf_x,#00h call k_delay ret k_delay:;键盘抖动延时子程序mov r6,#250dl20ms_1:mov r7,#200djnz r7,$djnz r6, dl20ms_1ret;继电器控制switch: mov a,key_buf_g;三个buffer都是0的话,说明还没有

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论