ImageVerifierCode 换一换
格式:DOCX , 页数:34 ,大小:369.11KB ,
资源ID:27996035      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/27996035.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(模块三水温自动控制标准系统.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

模块三水温自动控制标准系统.docx

1、模块三水温自动控制标准系统 项目三 水温自动控制系统第一节 系统分析1.1 水温控制系统概述温度控制无论在工业生产过程中,还是在日常生活中都起着非常重要的作用,过低的温度或过高的温度都会使水资源失去应有的作用,从而造成水资源的浪费。特别是在当前全球水资源极度缺乏的情况下,我们更应该掌握好对水温的控制,把身边的水资源好好地利用起来。以单片机为核心的水温自动控制系统,可以实时采集现场温度数据,并和目标温度进行比较,根据两者之差采用PID等控制算法调整是电热丝的功率实现水温的精确控制,从而提高生产效率,改善人民的生活水平。1.2 设计任务和主要内容1.基本要求一升水由1kW的电炉加热,要求水温可以在

2、一定范围内由人工设定,并能在环境温度降低时实现自动调整,以保持设定的温度基本不变。2.主要性能指标 温度设定范围:,最小区分度为。 控制精度:温度控制的静态误差。 用十进制数码显示实际水温。3.扩展功能 具有通信能力,可接收其他数据设备发来的命令,或将结果传送到其他数据设备。 采用适当的控制方法实现当设定温度或环境温度突变时,减小系统的调节时间和超调量。 温度控制的静态误差。第二节 系统设计温度测控系统结构框图如图3. 1所示,设计中被控对象为 lL净水,采用 lkW 电炉进行加热。本设计主要以单片机为控制核心,利用 PID控制算法进行水温度的恒温控制。 水人机接口单片机温度测量电炉电源模块功

3、率调节图3.1 系统结构图AC220V单片机系统由电源模块、温度测量模块、功率调节模块、人机接口模块和单片机核心模块五个部分组成,电源模块为系统提供12V、+5V直流工作电源;温度测量模块完成对水的温度测量;功率调节模块实现对水的加热控制;人机接口模块实现温度值的设定、显示、单片机和PC之间的通信等功能。下面分别讲述各模块的具体设计思想和应用功能。模块一、电源模块电源模块选用标准的开关电源模块,其中12V直流电源的输出电流为1A,+5V直流电源的输出电流为500mA。模块二、人机接口模块人机接口模块由6位共阴式数码显示LED接口电路、44矩阵结构的16键键盘接口电路、和RS232串行通信接口转

4、换电路三部分组成。人机接口模块需完成温度的设定、显示和数据通信等功能,下面分别讲述这三方面功能的具体实现。21温度显示1硬件原理系统中通过键盘设定的温度和实际测量的温度均通过6位共阴式数码管进行显示,采用三个二合一的数码显示模块实现6位数码显示,数码显示电路采用动态显示方式以简化硬件结构。显示电路如图3.2所示。显示电路的字型码由并行IO口扩展芯片8255的PA口PA0PA7输出,经反相驱动电路ULN2003反相驱动后接到数码管的段码线a、b、c、d、e、f、g、dp上。显示电路的位码由并行IO口扩展芯片8255的PB口PB0PB5输出,同样经反相驱动电路ULN2003反相驱动后接到数码管的位

5、码线CM1CM6上。每片ULN2003提供7路反相驱动,第8根段码线dp由第二片ULN2003的第一路反相驱动控制。动态显示电路的工作原理在前面章节中已经讲过, 在此不再重复。并行IO口扩展芯片8255的四个端口PA、PB、PC、PD经译码电路译码,端口地址分别为0x8000、0x8001、0x8002、0x8003。在本系统中并行IO口扩展芯片8255的PA口、PC口作为通用的输出口、PB口作为通用的输入口。因此在初始化8255时因向8255的命令控制端口PD口置0x82。图3.2 显示接口电路2、显示驱动程序设计数据定义在系统中设定一个长度为6的全局变量类型的数组dis_buf作为显示缓冲

6、区,当显示“0”“9” 之间字符时在缓冲区中存放十六进制数0x000x09之间的数;当显示字符“0.”“9.” 之间字符时在缓冲区中存放十六进制数0x100x19之间的数;下标值从小到大的数组元素在数码管上的显示顺序为从右向左。每次调用显示程序,都是将显示缓冲区中的全部数据逐一转换为相应的字型码送到对应的数码管上进行显示。由于采用共阴的数码管,且显示驱动为反相驱动,因此显示程序应输出共阳式的字型码,字型码存放在字型码表table中。显示字符、缓冲数据、字型码的三者对照关系见表3.1。显示字符缓冲数据字型码显示字符缓冲数据字型码“0”0x000xc0“0.”0x100x40“1”0x010xf9

7、“1.”0x110x79“2”0x020xa4“2.”0x120x24“3”0x030xb0“3.”0x130x30“4”0x040x99“4.”0x140x19“5”0x050x92“5.”0x150x12“6”0x060x82“6.”0x160x02“7”0x070xf8“7.”0x170x78“8”0x080x80“8.”0x180x00“9”0x090x90“9.”0x190x10“A”0x0a0x88“A.”0x1a0x08“B”0x0b0x83“B.”0x1b0x03“C”0x0c0xc6“C.”0x1c0x46“D”0x0d0xa1“D.”0x1d0x21“E”0x0e0x86“

8、E.”0x1e0x06“F”0x0f0x8e“F.”0x1f0x0e暗0x200xff0x210xbfP0x220x8cY0x230x91程序流程开始置8255命令字置位码初值i=0查当前字符的字型码并送PA口位码送PC口延时1ms位码左移1位+i6?关闭显示结束YN图3.3 显示驱动程序流程图程序代码#include /* 头文件reg51.h中包含了单片机特殊功能寄存器定义,通过宏命令include可以将这些定义包含进来*/#define uchar unsigned char /*定义无符号字符型缩写数据类型名称uchar*/#define ledlen 6 /*定义显示数据长度为6*/

9、#define PA_8255 XBYTE0x8000 /*定义PA_8255代表在外部数据空间中地址为0x8000的8255的PA口*/#define PC_8255 XBYTE0x8002 /*同上*/#define PD_8255 XBYTE0x8003uchar idata ledbufledlen=0x20,0x20,0x20,0x20,0x20,0x20; /*在单片机内部间接寻求空间中定义显示缓冲区,初值为0x20*/uchar code table32=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc

10、6,0xa1,0x86,0x8e,0x40,0x79,0x24,0x30,0x19,0x12,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e,0xff,0xbf,0x8c,0x91;/*在程序存储器空间中定义字型码表*/void delay(unsigned char CNT) /*延时子程序,延时时间为CNT ms*/ uchar i; while (CNT- !=0) for (i=200; i !=0; i-);void displayled() uchar i, j; uchar pos; uchar led; PD_8255=0x82; po

11、s = 0x20; / 从左边开始显示 for (i = 0; i = 1; / 位码右移1位 PC_8255 = 0; / 关所有八段管 【例3.1】从左到右显示0,1,2,3,4,5void main(void) /*循环调用显示程序,显示字符0,1,2,3,4,5*/ uchar i; for(i=0;i6;i+) ledbuf5-i=i;displayled();练习【例3.2】在右边的三位数码管上显示58,其它数码管上不显示任何内容。22键盘输入221独立式键盘输入1.硬件原理本系统中采用独立式键盘结构,电路如图3.4所示,设有减1、加1、功能、确认四个按键,这四个键分别接在8255

12、的PB0、PB1、PB2、PB3引脚上。当没有键按下时,PB0PB3引脚上都是高电平“1”;当有键按下时,则该键按接的PB口引脚为低电平“0”。例如按下“减1”键时,则PB0引脚为低电平“0”,其它引脚为高电平“1”。单片机检测PB0PB3的引脚电平情况,就可知道有没有键按下?以及按下的是哪个键?图3.4独立式键盘电路图2键盘扫描程序流程键盘的硬件结构比较简单,但在系统中要保证键盘的可靠输入,则必需遵循一个较为复杂的处理过程,键盘的扫描过程一般包括以下几个步骤:查询是否有键控下单片机检测8255的PB口PB0PB3四个引脚是否全为高电平“1”?如果全为“1”,则说明没有键按下;如果不全为“1”

13、,则说明有键按下。查询按下键所在的位置 单片机将得到PB0PB3的信号取反,PB0PB3中的为1的位便是键所在的位置。求取键值本系统中键值如表3.2所示。表3.2 键名、键值对照表键名没键按下减1加1功能确认键值0x000x010x020x040x08注:当没键按下时,键值为0。键的抖动处理当用手按下一个键时,往往会出现所按键在闭合位置和断开位置之间跳几下才稳定到闭合状态的情况;在释放一个键时,也会出现类似的情况,这就是键抖动。抖动的持续时间不一,通常不会大于10ms。若抖动问题不解决,就会引起对闭合键的多次读入。对于键抖动最方便的解决方法就是当发现有键按下后,不是立即进行扫描,而是延时10m

14、s后再进行。由于键按下的时间持续上百毫秒,延时后再扫描也不迟,扫描到键并求取键值后并不立即结束,还必须等键释放,在检测到键释放状态时才结束扫描,返回上一级程序。根据以上描述,键盘扫描流程如图3.5所示。开始扫描键盘延时去抖动扫描键盘求取键值保存键值YN图3.5 独立式键盘扫描程序流程图有键按下?Y有键按下?Y键释放否?11键值=0x00结束NN延时等键释放3键盘扫描程序根据图3.5编写键盘扫描程序,如下所示:#define PB_8255 XBYTE0x8001 /*8255 PB口为键盘扫描口*/uchar keyscan() uchar i,j; i=PB_8255&0x0f; /*扫描键

15、盘*/ if (i=0x0f ) return(0); /*没键时返回键值=0*/ displayled(); /*调用显示程序延时去抖动*/ displayled(); displayled(); i=PB_8255&0x0f; if (i=0x0f) return(0); j=i&0x0f; while (PB_8255&0x0f!=0x0f) /*等键释放*/ displayled(); displayled(); displayled(); return(j); /*返回键值*/【例3.3】循环检测键盘,将扫到的键值显示在最右边的数码管上。#include #define uchar

16、unsigned char #define uint unsigned int uchar idata ledbuf6=0x20,0x20,0x20,0x20,0x20,0x20;uchar kbscan(vold);void displayled(void);void main(void) uchar key_val; PD_8255=0x88; /*8255 PA、PB、PC0PC3口为输出;PC4PC7为输入*/ while(1) key_val=kbscan(); if (key_val!=0xff) ledbuf0= key_val; 【例3.4】结合键盘和显示设定水温控制系统的目标

17、温度,设定值显示在最右边的数码管上,温度设定范围4090,最小区分度为1。1. 主程序mian()1)变量说明全局变量key_flag是设定/修改标志单元。初值为0,在按功能键后变为1,表示在修改个位数;再按一次功能键后变为2,表示在修改十位数;连续按功能键可循环切换。在按确认键后又恢复成初值0。全局变量temp_set存储设定的目标温度值。2)功能说明首先将显示缓冲置0x20,使得6个数码管全暗设置key_flag初值,初始化8255初始化完成后进入死循环,在循环中调用键盘扫描程序捕获按键,扫到键后调用温度设定子程序tmpset(),对按键进行处理,处理后再调用显示程序显示当前设定情况。主程

18、序的源程序如下所示:uchar key_flag,temp_set;void main() uchar i = 0; uchar j; ledbuf0=0x00;ledbuf1=0x04; temp_set =40; key_flag=0; PD_8255=0x82; while(1) i=keyscan(); if (i!=0) tmpset(i); displayled(); / 显示当前设定值 2温度设定子程序tempset()1)输入输出参数入口参数:扫到的按键的键值key ;出口参数:每次输入或修改的中间结果保存在显示缓冲单元ledbuf0、ledbuf1中;确认后的最终结果保存在全

19、局变量temp_set中。2)功能说明 设定两位十进制数形式的目标温度值,具体过程如下:判断key的值,根据不同的值分别作如下处理:1 如果是8则表明检测到确认键,清修改标志单元key_flag置和小数点,温度设定值temp_set=ledbuf0+ledbuf110,并判别temp_set的值是否在4090之间?如果不在则temp_set仍为原来的值。2 如果是4则表明检测到功能键,修改标志单元key_flag的值和小数点位置,小数点的作用相当于光标。3 如果是2则表明检测到加1键,则根据key_flag的值情况,对相应的显示缓冲单元中的内容进行加1;若加1后大于9则归0。4 练习如果是1则

20、表明检测到减1键,则根据key_flag的值情况,对相应的显示缓冲单元中的内容进行减1;若减1后小于0则回到9。请读者根据以上叙述,画出子程序tempset的流程图,并上机调试程序。void tempset(unsigned char key )uchar temp_t;switch (key) case 0x08: /*确认键处理*/ key_flag=0; /*修改标志清0*/ ledbuf0=ledbuf0&0x0f; /*清小数点位*/ ledbuf1=ledbuf1&0x0f; temp_t=ledbuf0+ledbuf1*10; /*计算温度设定值*/ if !(temp_t90)

21、|(temp40) temp_set=temp_t; /*如果设定值正确则保存*/ break;case 0x04: /*功能键处理*/ switch (key_flag) case 0x00: case 0x02: key_flag=0x01; /*置温度个位标志值*/ ledbuf0|=0x10; /*点亮个位小数点(相当于光标)*/ ledbuf1&=0x0f; /*灭十位小数点(相当于光标)*/ break; case 0x01: key_flag=0x02; /*置温度个位标志值*/ ledbuf1|=0x10; /*点亮十位小数点(相当于光标)*/ ledbuf0&=0x0f; /

22、*灭个位小数点(相当于光标)*/ break; default: break; break;case 0x02: /*加1键处理*/ switch (key_flag) case 0x00: break; case 0x01: ledbuf0+; /*个位加1*/ if (ledbuf0=0x1a) ledbuf0=0x10; /*加到十归0*/ break; case 0x02: ledbuf1+; /*十位加1*/ if (ledbuf1=0x1a) ledbuf1=0x10; break; default: break; break;case 0x01: /*减1键处理*/ switch

23、 (key_flag) case 0x00: break; case 0x01: ledbuf0-; /*个位减1*/ if (ledbuf0=0x0f) ledbuf0=0x19; /*减过0回9*/ break; case 0x02: ledbuf1-; /*十位减1*/ if (ledbuf1=0x0f) ledbuf1=0x19; break; default: break; break;default: break; 222距阵式键盘输入1硬件原理在单片机系统中距阵式键盘应用比较广泛,因此下面讲一下距阵式键盘的有关情况,假如系统中采用44距阵键盘作为输入设备,距阵键盘的连接情况如图3

24、.6所示。图3.6 键盘阵列图 从图中可以看到8255 PC口的低4位PC0PC3作为行扫描输出线; 8255 PC口的高4位PC4PC7作为列检测输入线。在距阵式键盘中判断是否有键按下?以及按下的是哪一个键?通常采用逐行扫描的方法,其过程如下: 查询是否有键控下 首先单片机向行扫描口PC0PC3输出全为“0”扫描码0xf0,然后从列检测线PC4 PC7输入列检测信号,只要有一列信号不为“1”,即PC口不为0xf0,则表示有键按下。接着要查出按下键所在的行、列位置。 查询按下键所在的行列位置 单片机将得到的信号取反,PC4PC7中的为1的位便是键所在的列。 接下来要确定键所在的行,需进行逐行扫

25、描。单片机首先使PC0接地,PC,lPC3为“1”,即向PC口发送扫描码0xfe,接着输入列检测信号,若为全“1”,表示不在第一行。接着使PC1接地,其余为“1”。再读人列信号。这样逐行发“0”扫描码,当输入列检测信号不全为“1”时,当前行便是按下键所在的行,将该行扫描码取反保留,当各行都扫描以后仍没有找到,则放弃扫描,认为是键的误动作。对得到的行号和列号译码,求得键值本系统中键值key_val=行号列号,键值如表3.3所示。表3.3 键名、行号、列号、键值对照表键名行号列号键值键名行号列号键值0000x008200x081010x019210x092020x02.220x0a3030x03删

26、除230x0b4100x04+300x0c5110x05-310x0d6120x06*320x0e7130x07确认330x0f键的抖动处理键抖动处理和独立式键盘相似,请读者自行分析。2键盘扫描程序处理流程单片机系统中键盘处理程序流程通常有程控扫描法、定时扫描法、中断扫描法,水温控制系统的温度变化比较慢,因此系统实时性要求不是很高,键盘处理可采用程控扫描法。键盘扫描处理流程如图3.7所示。开始发全0扫描码延时去抖动置行扫描码初值输出行扫描码行扫描码左移1位结束YN图3.7 键盘扫描程序流程图有键按下?Y有键按下?Y行扫完否?N本行有键?11Y求取键值1键值=0xff结束NN延时键释放否?YN3

27、键盘扫描程序下面是按图3.7编写的键扫描程序,函数名为kbscan(),扫描函数的返回值为键值,若无键按下,返回值为0xff。 #include #define uchar unsigned char #define uint unsigned int#define PC_8255 XBYTE0x8002#define PD_8255 XBYTE0x8003void displayled(void); void dlms(void) uchar i; for(i=200;i0;i-) uchar kbscan(void) *键扫描函数* uchar row,col,key_val; PC_82550xf0; *发全“0”行扫描码,列线输入* if (PC_8255&0xf0)!=0xf0) *若有键按下* displayled(); *通过调用显示程序实现延时去抖动* if (PC_8255&0xf0)!0xf0) row0xfe; *逐行扫描码* while(row&0x10)!0) PC_8255row; *输出行扫描码* if (PC_8255&0xf0!0xf0) *本行有键按下* col=(PC_8255&0xf0)|0x0f; key_val=(row)* (col)-1;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1