老年公寓智能控制系统
目录
摘要
Abstract
第1章 前言
1.1 课题背景和意义 1
1.2 国内发展现状 1
1.3 主要研究内容 1
第2章 系统的总体方案
2.1 系统的功能设计
2.2 设计方案的论述
2.3 总体结构框图 3
第3章 系统的硬件设计 4
3.1 硬件系统的构成 4
3.2 单片机的介绍 4
3.3 单片机最小系统 5
3.3.1控制器模块 5
3.3.2 复位电路 6
3.3.3 时钟电路 6
3.4 键盘模块设计 7
3.5 报警模块设计 9
3.6 显示模块设计 9
3.7 视频监控模块设计 11
3.8 控制模块设计 11
第4章 系统的软件设计 12
4.1 Keil uVision4软件的使用 12
4.2 系统主程序设计 13
4.3 键盘扫描程序设计 14
4.4 显示程序设计 15
第5章 仿真与调试 16
5.1 Proteus ISIS软件 16
5.2 仿真调试结果 17
第6章 结束语 18
参考文献 19
答谢辞 20
附录
摘 要
本次课题为老年公寓智能控制系统,其实也就是病人请求值班医生或护士进行诊断、护理的紧急呼叫工具。传统的病房呼叫系统缺乏新意,功能不全,不能根据老人病情进行优先选择的能力,功能单一,因此,本次设计在传统呼叫系统基础上加以改进,弥补不足。
本次毕业设计以三年所学专业知识为基础,以AT89C51单片机为系统核心,其中系统硬件电路主要包括:时钟电路、复位电路、键盘电路、LED显示电路、报警电路,软件部分对各部分电路用高级语言进行程序编写设计。设计一个具有优先选择功能的紧急呼叫系统,每个老人房间床位旁都有一个呼叫按钮,当老人需要帮助的时候,按下床位呼叫按键,值班室便会有蜂鸣器响起,产生声光报警,并在值班室的数码管上显示床位号。多人同时按下时可判断病情进行优先级判断,首先显示优先级最高的床号,医护人员接受响应后,可终止当前呼叫。然后通过proteus仿真软件设计系统仿真电路图,并对系统进行仿真调试。在此基础上,考虑一些病情严重到无法按呼叫按钮的老人,在其床位合适位置安装摄像头,进行实时监控。
第1章 前 言 1.1、选题背景和意义 伴随着人口老龄化,现代科技日益发达,全国各地的医院和老年公寓不断增加。在以往医院或老年公寓,病人遇到突发情况时,由于向医护人员得不到及时的救助,往往错过了最佳治疗的时间,最后造成不可挽回的伤痛,因此,一种新型临床呼叫仪器的研制成为近些年来的研究热点之一。目前当今的一些大型医院和老年公寓都会配备智能的基本呼叫系统, 若不安装此系统,可能会导致老人们出现紧急情况无法找到医护人员,对老人的安全有极大威胁,因此,呼叫系统对老人的日常生活和安全性都至关重要。 老年公寓智能控制系统就是一种呼叫和监控系统,在医院等公开场所都是非常普遍的,是一种重要的工具,用于保证老人与医务人员及时沟通,可以使老年公寓的服务质量得到很大的提高。整个系统是由安设在护士值班室的呼叫主机和分别设立在老人床位的呼叫分机、LED显示等设备来组成,如果有老人按了呼叫按钮,护士站的呼叫主机就会发出报警信号,以便在值班室能及时了解情况。 1.2、国内发展现状 呼叫控制系统的发展,已经取得了很大的成就,并且已经进入商业化阶段,现如今,基本所有医院都配备这个控制系统。因此依据时代的发展,养老院和老年公寓也在逐渐的普及呼叫系统,提高行业的服务水平。 目前市场上已经出现了许多种型号不一、功能各异的医院病房和老年公寓呼叫系统,其中主要也就分为两大类:有线式和无线式。无线式病房呼叫系统不存在铺设线路的问题,但是可靠性差,而且无线电波会干扰其他医疗仪器设备。本文设计的是有线式的,适合较小的医院病房和老年公寓使用,具有成本低,易于操作、安装和维护非常简单等特点,而且具有可靠稳定,对其他医疗设备不会产生干扰的特点;但受到布线较多,影响美观,故不适宜较大的医院。 1.3、主要研究内容
1、熟悉AT89C51单片机功能及工作特性,掌握其接口扩展方法。
2、对键盘模块和显示器模块进行选型比较,得出各种型号优劣比。
3、采用面向对象的思想分层次、分模块构建设计的总体框架。 4、熟练使用Keil uVision4和Proteus仿真软件
第2章 系统总体设定 2.1、系统的功能设计 设计系统的基本功能: 1)老人按下任何一个床位(16张)的呼叫按钮,护工值班室都会立即显示老人的床号,(若连续按两次及以上将不重复显示)蜂鸣器发出报警。 2)若有多个床位按下呼叫按钮,则进行循环显示。 3)接受呼叫后,数码管不再显示并且报警停止。 设计系统的拓展功能: - 当多个病房同时呼叫时,系统进行优先级判断,首先显示病情危重,优先级最高的床号。
- 在老人重病房装上摄像头,值班室护士可通过摄像头实时监控老人情况。
2.2设计方案的论述 方案一 利用AT89C51单片机外加作地址锁存器用的一块带三态输出的8位锁存器74LS373芯片和一块EPROM芯片构成一个完整的最小系统电路,以此为基础在智能装置配置2个数码管显示器和X行Y列矩阵键盘,可通过扩展8255或8279之类的并行1/0芯片来完成。常常使用的设计方法,显示和键盘搜索按下键均按动态扫描的方法进行,显示电路接口由P1口和P2口组成,键盘接口由P2口和P3口组成。在显示功能完成过程中,P1口锁存器显示字母的八段字形码,P2口的高6位(P2.7-P2.2)锁存器显示字符的位选码。AT89C51按分时方式执行程序进入到键盘搜索时,经P2.7-P2.2输出键盘扫描的行选码,键盘的列输入由P3口的P3.7-P3.4承担缓冲功能。利用P2.7-P2.2输出数据代码是通过改变程序计数器高6位的数值实现。 方案二 利用AT89C51自身接口实现数码管静态显示和键盘扫描,使用AT89C51单片机外加作地址锁存用的两块8位三态锁存器74LS373芯片构成一个完整的最小系统电路。以此为基础,在智能装置中配置2个数码管显示器,以及4行4列矩阵键盘,可以不扩展I/O芯片,利用AT89C51自身I/O口便实现上述功能。P0口的八个端口作为LED的段选,用P1口做键盘电路的接口。 综上所述,方案一中键盘显示均采用动态扫描方式,所以软件实现起来简单,但硬件电路比较复杂,I/O浪费严重,没有合理利用I/O口。而方案二电路简单,并且软件实现也不是太复杂,合理利用单片机I/O口,由此,权衡利弊之后,本设计选用方案二。
本病房呼叫系统主要由AT89C51单片机、按键模块、LED数码管显示模块、蜂鸣器报警模块及复位电路等部分组成,其系统结构图如图2.1所示。该系统控制16间房间,床位旁设置呼叫开关,护士站设有显示灯、蜂鸣器和一个数码显示器。当有两位以上患者按下呼叫开关时,护士值班室的数码管上只显示优先权最高的病房床位号,并且蜂鸣器发出警报声音来提醒值班护士。我们根据老人患者的病情给他们编级由l到 16的逐级递减,当两个以上的患者同时按下呼叫按钮时,护士值班室的数码管首先显示患者病情最严重的病床号。例如,2、6、15号病房同时按下呼叫按钮时,护士值班室显示的数字为“2”,因为2号病房的优先级最高,其他病房优先级别依次递减。全部处理完毕后,没有病房呼叫,此时值班室的数码管无显示,同时蜂鸣器报警停止。
图2.1 总体结构框图(见附件) 总体结构框图功能阐述: - 床位按键为输入部分,通过老人或病人手动按键来向单片机传输命令。
- 微控制器采用通用型AT89C51单片机为核心,通过软件编程对输入处理并对输出控制。
- 输出部分包括数码管显示和蜂鸣器报警,可以将输入信号在数码管上显示出来并通过蜂鸣器报警提醒护士等医护人员。
- 可以控制老人房间摄像头实时显示老人身体状况,协助呼叫系统共同监控。
综合流程描述: 老人按下按键,向单片机输入信号,经过AT89C51进行一系列处理后,信号通过输出系统显示在LED显示屏幕上,并驱动蜂鸣器报警提醒。如果同时有多个输入信号,利用控制器编程处理数据判断优先级,在数码管上显示优先级最高的病床号,值班室护士收到提醒后,可通过按键结束显示和报警。 第3章 系统的硬件设计 3.1 硬件系统的构成 主要硬件部分以AT89C51单片机为核心,与键盘电路、显示电路、报警电路和控制电路共同构成。如下图3.1为硬件示意图:
图 3.1 硬件构成示意(见附件)
3.2、单片机的介绍: 单片机是非常典型的嵌入式微控制器(Microcontroller Unit),它将各种部件集成到一块硅片上,部件中包括中央处理器CPU,运算器,控制器,存储器,多种I/O口,输入输出设备等构成,相当于一个微型的计算机。单片机具有体积小、集成度高、可靠性高、速度快、易于扩展、性价比高等众多优点。因为单片机相当于一个微型计算机,在电子类专业课程里经常与单片机打交道,学习使用单片机,对计算机的原理与结构都有很大的帮助。单片机的各种优点也使它最先被用于工业控制领域。单片机不断发展,从最初的4位或8位已经发展到了32位,处理能力飞速提升。现在我们所有日常用到的电子产品中基本都有集成的单片机。单片机应用领域如下: - 智能仪器仪表的应用。 如:示波器等。
- 工业控制中的应用。 如:测控系统等。
- 家用电器中的应用。 如:洗衣机、电冰箱等。
- 计算机网络和通信中的应用。 如:移动电话等。
- 医用设备中应用。 如:监护仪、病床呼叫系统等。
3.3、单片机最小系统 单片机的最小系统是由单片机、电源供电电路、晶振电路、复位电路和时钟电路构成的。 图3.2 单片机最小系统 3.3.1 控制器模块 控制器选择AT89C51单片机,这款单片机最常见,大学里使用最多,并且可以实现系统的所有功能,因此选择AT89C51单片机。 图3.2 AT89C51引脚图 AT89C51的主要特点: 1、与MCS-51兼容
2、4K字节可编程FLASH存储器 3、1000写/擦循环
4、全静态工作:0Hz-24MHz 5、三级程序存储器锁 6、128×8位内部RAM
7、32根可编程I/O线
8、两个16位定时器/计数器
9、5个中断源,2个中断优先级
10、低功耗的闲置和掉电模式
11、片内振荡器和时钟电路 3.3.2 复位电路: RST为复位信号使能端,当复位引脚出现两个机器周期以上的高电平,便可以使内部进行复位。复位电路有两种方式:上电自动复位和按钮复位。选用按钮复位,简易方便,节省资源,更加符合本系统的设计。如下图所示: 图3.3 复位电路 3.3.3 时钟电路: 时钟是时序的基础,AT89C51片内由一个反相放大器构成振荡器,可以由它产生时钟。时钟有两种产生方式,内部方式和外部方式。本系统采用内部方式,在XTAL1和XTAL2端外接石英晶体做定时元件,内部反相放大器自激振荡,产生时钟。选用12MHz晶振和30pF电容。如下图3.4所示: 图 3.4 时钟电路 3.4、键盘电路设计 1)键盘方式的选用: 独立式键盘:每个按键占用一条I/O线,按键数量较多时,I/O口利用率不高,I/O口浪费较大,但程序编写简单,适合需要较少按键的设计。 矩阵式键盘:矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接,若需要设计一个4*4键盘,只需要一个并行端口和8条引线即可,可节省较多的I/O 口。本系统按键较多,因此采用矩阵式键盘是合理的。 如下图所示: 图3.5 键盘电路图 2)键盘工作方式 CPU对键盘进行扫面的时候,有两个重要的问题:第一个是要及时,必须保证用户每次按键都能识别并做出响应;第二个是扫描时间不能占用过多,因为CPU的工作非常多,因此要根据CPU的情况选择合适的键盘工作方式。常用的键盘工作方式有三种:编程扫描工作方式、中断工作方式、定时扫描工作方式。本设计综合考虑选择中断工作方式。 中断工作方式:当键盘有按键按下时,硬件会产生中断信号,CPU响应中断申请后,对键盘进行扫描,并在有按键按下时转入相应的键功能处理程序。该方式优点:因为在无键按下时不进行键扫描,因此大大提高了CPU的效率,同时确保每次按键都能及时响应。 3)键的识别功能: 判断键盘中是否有键按下,若有键按下,则确定其所在行列位置。 识别按键通常有两种方法:行扫描法和线反转法。 a、行扫描法步骤: (1)确定是否有键按下,将全部行线置于低电平,然后检测列线的状态,只要有一列为低电平,则说明有按键被按下,若所有列线为高电平,则键盘中无按键按下。 (2)若有键按下,需确定按键所在的行列位置。即对键盘进行逐行扫描。 (3)键的抖动处理。用软件延时消除抖动,即当有键按下时,不要立即逐行扫描,而是延时10ms后在进行。等待按键稳定后重新判断一次,以躲避触电抖动期。 b、线反转法步骤: (1)把输出线定为行线,输入线定为列线。输出线都设置为0,这时呈现低电平0的便是按键所在列线,如果都不为0,则确定没有键被按下。 (2)在把输出线设定用列线,输入线设定为行线,输出线都设置为0,然后,这行线中呈现低电平0的按键所在列,然后便确定按键的位置(M,N)。 (3)一次按键处理。有时,为了确保一个按键只被处理一次,可以根据是否释放按钮判断,如果按键释放,则启动按键操作的执行。 在应用过程中仍需要软件延时消除抖动的问题。抖动消失后,便可直接得到键的位置。 4)按键抖动及消除 按键抖动会将一次按键操作识别成多次操作,因此为了克服误按和误判,需要消除按键抖动,一般有两种消除方法:硬件电路消除法和软件延时法。因为硬件延时成本高,硬件麻烦,因此不采用,本方案采用软件延时。 软件延时法:当判断有键按下时,用软件延时15ms,等按键稳定后在次判断,以此消除误按的抖动期。 3.5、报警电路设计 利用三极管作为控制开关,用单片机P3.1口控制,利用三极管当开关电路可以保护单片机,并起到放大电流的作用,当三极管基极为低电平时,发射极截止,为高电平时,发射极导通。显示器显示床号同时发出声光报警。通过编程令单片机执行中断程序。
图3.6 报警电路 3.6、显示电路设计 1)显示模块的选择方案 方案一:采用LCD1602液晶屏显示,它是一种专门用来显示字母、数字和符号等的点阵型液晶模块。它由若干个点阵字符位组成,每个点阵字符位都可以显示一个字符,每位和每行之间都有一个点距的间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形,显示效果不好,并且可视角度小。 方案二:采用七段LED数码管显示,七段LED数码管由数个LED组成一个阵列,并封装在一个标准的外壳里。其中由七个细长的发光二极管组成数字显示,另外一个圆形的发光二极管显示小数点,所以实际是八段。当发光二极管导通时,相应的一个点发光。控制相应的二极管导通,可显示出各种字母以及0-9数字,显示效果好,可视角度大,其控制简单,使用也方便。 综合比较下,显示模块选用七段LED数码管作为系统显示方案。 2)LED 显示原理 LED是一种特殊半导体材料制成的PN结,因为掺杂浓度过高,当正向偏置时,会产生大量的电子-空穴复合,把多余的能释放变为光能。LED显示器具有工作电压低、体积小、寿命长等特点。LED显示器件有单个、七段、和点阵式等几种类型。七段数码管属于LED发光器件的一种。 为适用于不同的驱动电路,有共阴极和共阳极两种,为了使LED数码管可以显示不同的符号和数字,要为LED数码管输入相应的代码,因为这些代码可使LED相应的段发光,从而显示不同字形,因此改代码段也称为段码,又称字型码。 为了显示数字和字母,需要点亮对应的发光二极管,就需要译成二进制码。译码有硬件和软件两种方法,硬件译码电路的优点是计算机时间开销小,但成本较高,软件译码省去硬件设备,成本低,本系统采用软件译码。 图3.7 七段LED显示器的两种结构 3)七段LED显示方式 按照显示方式,七段LED数码管有静态显示和动态显示两种显示方式。 a、静态显示:静态显示系统在每一次显示输出后能够保持显示不变,仅在待显数字需要改变时,才更新数字显示器中锁存的内容。这种显示方式优点是占用机时少,显示稳定可靠。缺点是显示位数多时,占用I/O口多。 b、动态显示:控制器应定时地对各个显示器进行扫描,显示器件分时轮流工作,每次只能显示一个器件,但由于人的视觉暂留现象,所以仍然感觉所有器件在同事显示。这种显示方式优点是使用硬件少,占用I/O口少。缺点是占用机时长,只要不执行显示程序,就会立刻停止显示。 静态显示方式,LED各显示段的工作电流是恒定的,动态显示方式LED各显示段工作电流是脉动的。利用74LS373和显示器组成显示系统,本系统采用静态显示。 4)地址锁存器74LS373: ]] 图3.8 锁存器74LS373 当三态端OE为有效低电平,使能端G为有效高电平时,输出跟随输入变化;当G端有高变低时,输出端8位信息被锁存,直到使能端G再次有效。 3.7 视频监控模块 考虑老人中可能有病情非常严重或者手不方便按下按钮的情况,因此,安装一个视频监控,对老人实时监测。 监控模块选择方案 方案一:有线视频监控 有线监控是一种比较传统的方法,其布线复杂,浪费端口,扩展性较弱,施工难度高,移动性很低,如果需要移动,则费时费力,并且安装成本和维护成本高。 方案二:无线视频监控 随着无线技术的发展,无线传输技术已经广泛的应用在各行各业中。其安装简单方便、扩展性好、性价比高。 综合对比,无线有着很多优势,并且由于不需要布线,并且无线传输所需安装成本很低,并且容易维护。因此选择方案二。 3.8 控制模块 值班护士控制的响应按键,由单片机复位键充当,当老人按下呼叫按钮时,值班室收到报警后,按下响应按键,通过编写程序使单片机执行中断程序,令数码管熄灭、振铃停止。 第4章 系统的软件设计 4.1、Keil uVision4软件 Keil uVision4 软件是众多单片机应用开发的优秀软件之一,在整个大学中,经常与其打交道,它集编辑,编译,仿真于一体,支持汇编,PLM语言和 C 语言的程序设计,界面友好,易学易用。 图4.1 Keil界面 Keil C51的使用步骤: - 新建文件夹,新建工程。例:文件夹为C51,文件名为proj1。
- 选择Atmel里的AT89C51。
- 创建c文件。单击File菜单,单击New选项,首先保存该空白代码文件,单击工具条上的保存按钮,然后更改文件名。
- 将C文件加入项目。回到编辑界面后,工作区出现一个target1,鼠标左键单击+号,然后在Source Group1上单击鼠标右键,选择Add Files to “source group1”在弹出的界面中选择要加入的c文件 ,左键单击Add按钮,然后单击Close按钮。
(5) 然后进行程序的编写,写好程序进行编译检查是否有错误。 (6) 在 Keil 软件中把目标程序编辑好,编译无误后,生成单片机可以执行的 hex头文件,然后通过USB转接口线把程序烧到单片机系统板中,然后运行该程序,观察系统的运行状态。 4.2、系统主程序设计 程序设计步骤包括绘制程序流程图,编写程序,运行调试,仿真模拟等步骤。 系统软件设计均采用模块化设计,整个程序主要包括主程序、键盘扫描程序、显示程序。所有程序均采用单片机C语言编写。
图4.2 主程序流程图(见附件)
主程序程序描述: 首先,每个存储单元的初始化,设置定时器的初始值,接收键,然后继续扫描键盘,如果扫描到有键按下,判断是否有多个按键同时按下,若只有一个按键按下,则查看床位标志显示的数字,然后在数码管显示屏中显示床号。若有多个按键同时按下,则判断优先级,选择优先级最高的床号显示,最后,处理完所有房间的呼叫后,系统复位,继续循环进行下一次判断。 4.3、键盘扫描程序设计 键盘扫描依照线反转法进行设计,先判断是否有键按下,若有键按下,则延时15ms,消除抖动误按,在判断一次按键,再通过软件获取键值,再由单片机输出到LED数码管显示。 键盘扫描程序流程图: 图4.3 键盘扫描程序流程图
4.4 、显示程序流程图 显示程序用来判断是否需要显示和如何显示,设计流程图如下:
图4.4 显示程序流程图(见附件)
显示程序描述: 床位数显示标志设置为N,从1开始,判断N是不是为0,如果不是0,说明有呼叫,然后床位号显示出来,然后从原本的键值数加1继续扫描,依此类推直到键值到16,以确定是否有别的病房呼叫。键值到16后则跳转,再循序扫描,如果N为0,表示无呼叫,则继续扫描下一个床号。
第五章 仿真与调试 本系统采用AT89C51单片机作为整个系统的核心,主要电路模块有:晶振电 路、系统复位电路、响铃报警电路和LED数码显示电路。完成了系统的硬件设计、软件编程之后,我们需要依据设计要求将系统正常运行,因此必须进行硬件和软件的调试。 如图5.1 硬件电路图 5.1 Proteus ISIS软件 Proteus是EDA工具软件。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。该软件最大的优点在于能够对常用微控制器进行仿真,适合于刚刚接触单片机以及进行数模电综合仿真的用户使用.主要功能如下: - 满足单片机软件仿真系统的所有标准。
- 具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、键盘和LCD系统仿真的功能。
- 目前支持的单片机类型有:8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。
- 支持大量的存储器和外围芯片。
5.2 仿真调试结果 启动电源,显示屏无显示,在按下6号键时,界面部分显示06,指示灯闪烁,蜂鸣器报警;如果未按下复位键,再按下2号键时,界面显示02,并循环显示,指示灯闪烁,蜂鸣器报警。由此看出该系统具有记忆功能,所以不会忽略之前所按下的键,依次按下各个按键,相应病房号均会相应显示。该设计反映了控制电路的可行性和稳定性。 按下6键显示 按下2键显示
按下10键显示 按下15键显示
综上所述,本系统实现了主要功能:显示床号,指示灯闪烁,蜂鸣器报警提醒值班人员。通过Proteus软件仿真,能达到上述结论,满足课题题目,达到目标要求。 第6章 结束语 辗转两个月过去了,毕业设计到了尾声,刚开始选题的时候,心中非常担心,因为不知道自己能不能完成,在老师的建议下,最终确定题目为老年公寓智能控制系统。 刚刚着手做的时候,脑子里没有什么内容,不知从何写起,因为需要大学里所需的专业知识,但是学的不是很扎实,因此已经遗忘许多,为此又复习了大二所学习的单片机应用技术和C语言。对设计的核心单片机,时钟电路,复位电路,报警电路,矩阵键盘,LED数码显示,都重新复习了一遍,整个设计是模块化的,各个模块构成一个整体框架,从而完成整个系统。 做的过程中出现很多问题,我查阅相关资料,独立解决不了的问题,我请教了同学和老师,同学们很热心的帮助我,老师也不辞辛苦的指导我,并且督促我们的进度,最终基本上实现了目标要求。 在这里,我想感谢在这次毕业设计中帮助我的指导老师和同学,此次设计我学到了很多知识,并且把以前遗忘的又重新复习了一遍,这次独立的设计让我体会到只要努力,就可以克服一切困难。
答谢辞
辗转两个月过去了,毕业设计到了尾声,刚开始选题的时候,心中非常担心,因为不知道自己能不能完成,在老师的建议下,最终确定题目为老年公寓智能控制系统。
刚刚着手做的时候,脑子里没有什么内容,不知从何写起,因为需要大学里所需的专业知识,但是学的不是很扎实,因此已经遗忘许多,为此又复习了大二所学习的单片机应用技术和C语言。对设计的核心单片机,时钟电路,复位电路,报警电路,矩阵键盘,LED数码显示,都重新复习了一遍,整个设计是模块化的,各个模块构成一个整体框架,从而完成整个系统。做的过程中出现很多问题,我查阅相关资料,独立解决不了问题,我请教了同学和老师,同学们很热心的帮助,指导老师更是尽心竭力进行辅导。
最后要感谢在整个论文写作过程中帮忙过我的每一个人。首先,也是最主要感谢的是我的指导老师,黄宇航老师。在整个过程中他给了我很大的帮忙,在论文题目制定时,他首先帮助我确定了题目的方向,同时又帮我具体分析,使我最后选取老年公寓智能控制系统。在完成初稿后,老师每周都会给我们认真查看论文,指出了我存在的很多问题。一步步改,不断完善我的论文设计。在此十分感谢黄宇航老师的细心指导,才能让我顺利完成毕业论文。
附录
单片机源程序如下:
- #include <reg51.h>
- #define uint unsigned int
- #define uchr unsigned char
- sbit led0=P2^2;
- sbit buzzer=P2^3;
- sbit dula=P2^6; //声明段选线选通端
- sbit wela=P2^7; //声明位选线选通端
- sbit clear=P3^4;
- uchr key,shi,ge,count;
- uchr code tab[]={
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71,
- 0x76,0x79,0x38,0x3f};
- /*延时子函数,xms为形参*/
- void delay(uint xms)
- {
- uint x,y;
- for(x=xms;x>0;x--)
- for(y=110;y>0;y--);
- }
-
- /*矩阵键盘扫描子程序*/
- void matrixkeyscan()
- {
- uint temp;
- P3=0xf7; //给P3口赋值
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0) //检测是否有键按下
- {
- delay(6); //延时去抖
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0) //再次检测是否有键按下
- {
- temp=P3;
- switch(temp)
- {
- case 0x77:
- key=1;
- break;
- case 0xb7:
- key=2;
- break;
- case 0xd7:
- key=3;
- break;
- case 0xe7:
- key=4;
- break; //判断按下的是哪个键
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- } //等待按键释放
- }
- }
- P3=0xfb;
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(6);
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=P3;
- switch(temp)
- {
- case 0x7b:
- key=5;
- break;
- case 0xbb:
- key=6;
- break;
- case 0xdb:
- key=7;
- break;
- case 0xeb:
- key=8;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- }
- }
- }
- P3=0xfd;
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(6);
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=P3;
- switch(temp)
- {
- case 0x7d:
- key=9;
- break;
- case 0xbd:
- key=10;
- break;
- case 0xdd:
- key=11;
- break;
- case 0xed:
- key=12;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- }
- }
- }
- P3=0xfe;
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(6);
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=P3;
- switch(temp)
- {
- case 0x7e:
- key=13;
- break;
- case 0xbe:
- key=14;
- break;
- case 0xde:
- key=15;
- break;
- case 0xee:
- key=16;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- }
- }
- }
- }
- /*主函数*/
- void alarm()
- {
- buzzer=~buzzer;
- led0=~led0;
- delay(30);
- }
- void display(uchr num)
- {
- if(key!=0) //若有键按下,则进入该循环进行处理
- {
-
- dula=1;
- P0=tab[num/10];
- dula=0;
- P0=0x00;
- wela=1;
- P0=0xfe;
- wela=0;
- delay(100);
-
- dula=1;
- P0=tab[num%10];
- dula=0;
- P0=0x00;
- wela=1;
- P0=0xfd;
- wela=0;
- delay(100);
- alarm();
- }
- }
- void main()
- {
- P0=0x00;
- while(1)
- {
- matrixkeyscan();
- display(key);
- }
- }
-
复制代码
所有资料51hei提供下载:
important.doc
(1.99 MB, 下载次数: 32)
|