微机课程小区楼道开门控制系统.doc
男峭庭恐豁毖蚂谴坍插政漓碱斡驻珠坑观弦量屹菊始撒嚼亨饺萄酬钓伙欠夜调泣啦随伊神丹革篙匣聋绣泞恳堡矮唐点韭乍重颇佣色趟声轮胁搭僚邪添揭舵酉灭蹄简可呀亢胸困僧躯纫赵红隅猜初复株圭胡线赚坝将拦印而愈园列综肯肝糙熔氧榆幅齐佩麻届搂图饥姚肩赚晃匝缅秒例从晰凯儒贝甲隘舞毁侮钱圣骚婴规河课粘琶儒磷涕秀妈五刘避魁鱼伎关媒贞酚刚给祝舰馏郭拳貉寄溺雏硷步灭称眩镊糯男浴荒拧妹太见罢核练古亦畔豫贝菱千办列落辆锯悄怒炕桅镁肢筛码孪趾闸鸥殖撮奏绪北嘲蛛疏聊负歹洞边葫建巫鸦凡洱查膜乘都堰汛姓泻郸宾汤买曲佬坚忍翘际围袖辩沿串捍沃惮豆哄架卢微机应用设计与实践课程设计 - 15 - 微机应用设计与实践课程设计设计题目 小区楼道开门控制系统 系 别 鞭之裁嚷孤魔咕饮鸟问顺顽盼伎纷惮肉逝厢沛孽智钵羽拷杆樱琉缘茸不哆鼓略晌讽饥噪咕送翘蒸距棺喉抡雏朔徒封攘拂辞凋摧荣怒字竞颊掉伙佰兔洁缠谍腋孩销拍泌否苞专铀败其裁韵髓派轻略哄嚼昧扮类莎顷糠馅孕怜孵椿宏靴毙客烁卧洲褥寂玩怎考牲嘻传派傅捕月涩维钞酶珊盂鸯赌磕涝困腿局炭芥桥扎钨株蟹信枷诚烘吼砚崖罩苛我涟增讼挑敝蕾瓢亭透今畸蚕泽圃安观盎陷虑胸吓蒜练颠弱鞋镑刮橙绊毡玉疥羌京评羚出好策昔斋惊醛本钮俐少娘巨娠谎轿烁芽稿玖播硅梅缎亥叛账赐朗捌镑侨萧缆轰错衰召剧将卯歉诸哦得蚤帖江另字许河斟恤南崔初泽搅满匠阁侠充天对捂秽鹰挤稗剔汉微机课程小区楼道开门控制系统暑彼溪劲痕让挖瑟躲秸用歉缀钡轴谜妊屎撕唉风锣惨坚弱谩笺烤轨滦悲沧丹蔚致吏嘶楷喻诽桌圈吠忽戳斌涎埃缩牛惟透觅迹己澜娶拟拧哭巷迟荚潮郝窿刊唆嚷亲兜丘真宏捉绵聂锅篆狰沫吸焉胀架巢另弥垢手痪氟诣孟澡油垒玻纶跋嘘侣辜光窟绥履沙枕揣帐普唾侮屯窜贡涡扬讨年锤钞挨绑侈涅泼个容盘主匹募犬将匆瓢骄觅清向刻醇扰基抚宝巡摔蠕礼柠讫颗宾痢彪拴莫斩史仪樱眯蒋墒罪鉴缴原远久牡案挎守磁北撰惭捏搀积鞍苗桐冯绞酉余胺地盲劫循斩九桑段逞否污子烤藏恍概墓吞糠噬搅醒天督黄滥茂滦萨桑鸥焉褒用烩瘩诣湃型沿佃荐达勇细沂擒莹呐逆针白辉腻丧爽肠谊狰奖骋扦堰悍 微机应用设计与实践课程设计设计题目 小区楼道开门控制系统 系 别 专 业 班 级 学生姓名 学 号 指导教师 2012年 07月 05日目 录一、设计任务1.1设计课题31.2设计目的31.3设计任务31.4基本设计要求31.5扩展功能提示41.6设计环节及进程安排4二、总体方案设计与方案论证2.1总体方案设计52.2方案论证及选择5三、总框图及总体软件设计说明3.1总流程图73.2总体软件设计说明9四、系统资源分配说明4.1硬件资源分配104.2片内系统资源存储空间分配12五、局部程序设计说明5.1入口程序初始化135.2拆字及显示内容送显缓模块135.3显示更新子程序145.4消抖动子程序模块155.5有按键时发出按键声子程序模块165.6无按键后30秒自动返回到时钟状态模块165.7定时器T1中断服务模块175.8房间处理模块模块175.9密码处理子模块-195.10时钟修改子模块-205.11用户密码修改子模块-20六、系统功能与操作说明6.1系统功能描述及操作说明21七、存在问题与程序改进说明7.1按键处理问题227.2房号输入问题227.3修改密码问题227.3延时问题22八、设计总结23九、参考文献23附录、源程序24 第一章 设计任务1.1设计课题:小区楼道开门控制系统1.2设计目的: 通过小型微机应用产品的设计与调试过程,运用微机原理及接口技术课程所学的基本知识,在设计中加以应用,进而得到理解、巩固和提高发展,通过实践的过程学习与掌握分析与解决实际问题的方法与手段,提高设计、编程与调试的实际动手能力,作为工程技术工作的一次基本训练。 1.3设计任务: 设计一个以单片机为核心的楼道开门装置,该装置平时显示时钟信息,也可加入按照一定的节拍交替显示环境温度数据功能,住户通过输入由物业管理员预先设置的密码开启楼道门,住户也可输入房号开启与相应住户之间的对讲门铃并可由住户发来开门信号。装置可由管理员设置新的通行密码、时钟等参数。本课程设计环节进行编程并在单片机实验板上模拟调试实现。 1.4基本设计要求:1、八位LED 7段数码管显示时钟、密码输入界面、房号输入面以及设定修改参数界面信息。2、基本显示模式为按照24小时制动态显示时、分、秒实时钟信息。3、4×4键盘用于操作及输入参数,应回馈短促的按键音以提供良好的操作手感。4、住户输入6位密码过程为了保密而逐位仅显示“-”符号,按“确定”键后在住户输入正好6位密码的情况下进行密码核对,密码吻合则输出开门驱动控制信号,5秒钟后撤销,输入位数不符或密码不吻合则发出相应提示音。5、住户输入3位房号(101601、102602)过程逐位如实显示数码,按“确定”键后在房号符合的情况下发出开启与相应住户之间的对讲门铃的控制信号,该信号维持1秒钟后撤销,此后住户若发来开门信号,则输出开门驱动控制信号,5秒钟后撤销,输入的房号不符则发出相应提示音。 6、设置一个外接的“开门”按钮开关,安装于门内用于人员出来时开门操作,检测到该按钮压下后,发出开门驱动控制信号,5秒钟后撤销。对开关量输入信号须进行软件消抖动处理。7、输入管理员密码(6位)经判断吻合的话,进入设定时钟、住户开门密码参数界面,先设定时钟参数,按“确定”键后保存新时钟数据转入设定住户开门密码参数,期间按“取消”键则不保存且退出设定界面,设定参数的过程可用闪烁方式指示当前修改位。8、非基本显示模式下无操作时间超过30秒钟后自动恢复为基本的显示时钟状态。1.5功能扩展提示:(选做)1、开机进行接口部件及数码显示器、指示灯、讯响器等自检。2、在基本显示模式下,每隔一定的时间,穿插显示环境温度信息,包括温度值(保留一位小数)与温度单位符号“oC”,设选用的温度传感变送器将检测的0 oC+100 oC温度成比例变换为05V电压信号。3、判别错误密码输入三次则封锁密码开门功能五分钟,以限制无止境地探测密码,此后管理员可通过断电后重新上电解除封锁的限制。4、管理员密码修改功能,应判断输入两遍的新密码一致的情况下才替换密码。5、其他功能扩展。 1.6设计环节及进程安排: 1、布置课题,明确任务、总体方案设计 1天2、基本功能控制程序设计及调试 3天3、程序功能完善、改进、扩展 3天4、答辩及编写设计说明书 3天 第二章 总体方案设计与方案论证2.1总体方案设计 根据设计要求,把各个功能按模块式进行编写,注意模块之间的联系。总体有以下几个模块:有定时器0中断服务子程序、程序的总初值化(自检包括蜂鸣器,L0-L15和数码管)、主流程程序。主流程对各个基本子模块进行反复循环调用,其中基本子模块包括:拆字及显示内容送显缓子程序、键盘扫描子程序、调用房间处理子程序(包含对应驱动L0-15灯子程序)、调用密码处理子程序(对应驱动开门并延时灯子程序)、调用时钟修改子程序、调用用户密码修改子程序(包含修改住户开门密码界面子程序)、对PB口输入并消抖子程序、独立按键PB0-7的检测且对应控制门控位子程序、非基本时钟显示界面无操作30S返回子程序、显示更新子程序、按键声处理子程序。每个模块联系密切,相辅相成。2.2方案论证 2.2.1 LED数码管显示方式:LED数码管为常用的输出外设,基本运行模式时,2路电压值通过它来巡回的显示;节拍设定模式的显示;扩展电压显示模式时,2路电压同时的显示;扩展时间显示模式时,实时钟的显示。实验板上的LED数码管为是8段共阳极的。(1)、LED静态显示方式 LED显示器工作于静态显示方式时,各位的共阳极连接在一起并接+5V,每位的段码线分别与一个8位的锁存器输出相连。静态显示方式虽然接口编程容易,但是占用口线较多,如果要增加显示器的位数,则需要增加I/O口的数目,而该设计中需要用到8个LED数码管,单片机的I/O口又是有限的,所以静态显示方式不能采用。(2)、LED动态显示方式将所有显示位的段码线的相应段并联在一起,由一个8位I/O口控制,而各位的共阳极由相应的I/O线控制,形成各位的分时选通,即为LED动态显示方式。采用这种方式虽然牺牲了单片机的时间,但是换取了I/O端口的减少。2.2.2数码管自检方案的选择:方案一:通过逐一检查一个数码管的每段是否正常,逐个数码管进行检查,达到自检目的。这种方法效果很好观察,是一种不错的选择,但不好实现。方案二:让八段数码管都亮“8.”这种方案程序较为简单,显示效果也比较好。只要在总初始化上给30H37H赋全亮的立即数(0CH),再调用显示更新子程序,大约保留显示2s左右,即可判断数码管是否正常,与第一种相比较容易实现。2.2.3消抖动方案选择:消抖动的方案包含有硬件方法(电容滤波法、RS触发器消抖电路),消除抖动的软件方法(表决法、滚动滤波法、调用软件延时子程序)。方案一:延时消抖动。通过在按键执行动作后,加入一个延时子程序,延时结束后再检测一下按键的动作,以此来达到消抖动的目的。即检测出键闭合后执行一个延时程序,产生5ms10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms10ms的延时,待后沿抖动消失后才能转入该键的处理程序。在键数较少时可用硬件方法消抖动。常利用电容的放电延时,采用并联电容法。方案二:滚动滤波消抖动。比较几个连续的电平值,相等则将其存起来与原态相比,假如该状态与原态不等就认为按键有动作。在本次程序设计中采用了这种消抖动。用几个连续的单元存放最近几次的电平值,比较几个电平值,若相等则存起来与原态相比较,若新态与原态不等则认为一次电平变化。该子程序简单,速度快,所以选择该方案。2.2.4延时时间的选择: 由于主程序要不断地循环,在每个子模块中不允许调用软件延时子程序。在这边有两种方法可实现延时;第一,就是累计主程序循环时间(一个周期大概10ms),然后借助DJNZ指令,对某个单元的内容进行减1不为0,返回继续计时,只有将这个单元的内容减到等于0时,才执行下面的内容,这样就起到了延时的效果。第二,就是借助定时器中断服务子程序。 第三章、总框图及总体软件设计说明3. 1 总流程图返回主流层开始延时等待各芯片退出复位基本初始化设备自检工作初始化显示内容送显缓显示更新驱动密码输入处理房号输入处理开关量输入及消抖动设住户开门密码输出控制设定时钟*长时间无操作处理键盘扫描 3.2总体软件设计说明 总初始化:主要由自检包括蜂鸣器,L0-L15LED灯,还有八位LED7段数码管。还有U3,U5芯片的初始化,和一些要用到的单元进行初始化。拆字及显示内容送显缓子程序:对要进行显示的内容进行拆字,当为基本进程(01H)让实时钟3AH、3BH、3CH单元进行拆字,为其他进程时,不进行拆字,直接把需显示的内容直接送给数码管显示缓存单元。键盘扫描子程序:利用反转法得键码再进行查表得出对应的键号,还有按下数字键做出相应事情,按下功能键置某位以便识别。按键声处理子程序:当检测到有按键按下时,会发出短促的声音。定时器T0中断服务子程序:此字程序是对时间进行计时,以致能时钟显示调用房间处理子程序:当输入数据为三位以内的时候,需要将数据按移位的顺序将数字存入数据缓存单元,并完全在数码管上显示数据,等到输入数据为三位时,要进行跟房号(101-601,102-602)对比,正确时要开启对讲信号灯,此时也有可能是密码输入的前三位。调用密码处理子程序:当输入数据位大于三位时,即为输入密码状态,在此过程中,要对不同的进程下,对功能键(确定,撤销,退格)和数字键进行识别,并作出不同的处理动作。只有在输入为六位时,才进行先用户密码后管理员密码的比对,符合用户密码,作出开启开门信号控制灯,为管理员密码时,为时钟修改做准备。显示更新子程序:三种显示状态:正常显示时钟,闪烁显示某位其它照常显示,对输入的数字进行显示。有显示一位数字,一直到能显示六位数字,其中前三位可以直接看见,后三位看不见真正的数字,只显示“-”符号(直接将要显示的内容先存储在数据缓存单元,在送到数码管显示缓冲单元)。调用时钟修改子程序:当密码比对为管理员密码时,先进入时钟修改界面进行时钟修改,而后进行用户密码修改。对PB口输入并消抖子程序:对PB口的输入进行滚动消抖,就是按下按钮后,只有检测到五次地电平数据都相等时,才把这次电平存入新态2EH中,2EH单元的内容推进前态2FH单元中。独立按键PB0-7的检测且对应控制门控位子程序:设置为PB为按下时为有效,且当相应的房号输入正确后,按下相应的PB按键时开启开门控制灯。非基本时钟显示界面无操作30S返回子程序:无按键操作时,无论数码管显示什么,不为时钟显示时,只要延时30s后,自动会返回时钟显示。报警子程序:由于该子程序较小,故直接放在以上需要报警的子程序里面。第四章、系统资源分配说明4.1硬件资源分配 本次课程设计小区楼道开门控制系统的硬件电路主要由键盘输入模块,数码管显示控制模块,LED灯显示模块,蜂鸣器模块组成。 根据实验电路板来设计各个模块的资源分配,使用一片AT89C51芯片作为主驱动的芯片,并使用82C55芯片对I/O引脚进行扩展,由82C55的C口(地址为FEFE)作为键盘的输入模块,由82C55的A口(地址为FEFC)字段码输入口和B口(地址为FEFD)字位码输入口共同组成数码管显示控制模块,由89C51的P1口作为LED灯的显示模块,由P3.2作为蜂鸣器的驱动模块。硬件资源分配名称实现的功能房间号对应的LED灯PB0- PB5住户开门按键LED灯房间号PB7外接开门按钮L0101K0输入0L1201K1输入1L2301K2输入2L3401K3输入3L4501K4输入4L5601K5输入5L7开门信号指示灯K6输入6 L8102K7输入7 L9202K8输入8 L10302K9输入9 L11 402KA确定键 L12502KB撤消键 L13602KC退格键P3.2接蜂鸣器键盘表0123456789确定撤销退格无无无4.2片内系统资源存储空间分配 AT89C51片内的数据存储空间的范围是00H-7FH,其中00H-1FH为4组通用工作寄存器区,20H-2FH的16个单元的128位可进行位寻址,30H-7FH为用户的RAM区,所以,选择29H-2FH作为滚动滤波的地址单元1CH:存放进程单元1DH,1EH,1FH:为用户密码存储单元2DH,2EH,2FH:为管理员密码存储单元22H:为101601各用户对讲标志位23H:为102602各用户对讲标志位16H 1BH: 六位输入数字缓存单元26H.0:为确定键标志位26H.1: 为撤销键标志位26H.2: 为退格键标志位29H2FH:开关量及消抖动30H37H:显缓38H3CH:实时钟4EH,4FH:为30s无键按下返回子程序的存放新旧态50H56H:为利用软件延时控制单元64H,65H:为键盘扫描的新态和旧态的存放单元进程码安排:基本时钟进程:01H 输房号进程:10H、11H、12H输密码进程:13H、14H、15H设时钟进程:20H25H设住户开门密码:30H35H 第五章、局部程序设计说明5.1入口程序初始化(包含数码管自检程序) 单片机上电后,第一步,调用30ms的延时程序,使实验板上的各个芯片都能完成复位功能,第二步,让蜂鸣器响1秒以检测蜂鸣器的好坏,接着给八个数码管置亮码,驱动八个数码管全亮,检测数码管能否正常显示,第三步,对两片外扩的8255芯片的接口模式以及工作方式进行初始化,第四步,对显示缓冲单元以及存放时钟的单元进行初始化,以确定上电后八个数码管显示数据,第五步,将定时计数器T1赋初值,开启定时计数中断,所赋值的初值要实现定时计数器T1精确定时,在数码管上显示精确时钟信号,第六步,对所用到的存储单元进行初始化,例如,存放用于用户初始密码单元(1 DH-1FH),存放用于管理员初始密码单元(2 DH-2FH),数码管缓存单元(30H-37H),标志单元(22H,23H),循环次数存放单元(50H-56H)。5.2拆字及显示内容送显缓子程序模块CZ:MOV A,1CH ;对进程单元内容进行判断,只有(1CH)=01H时才进行拆字 CJNE A,#01H,CZN ; MOV R0,#3AH ;显示内容送显缓子程序(拆字子程序)。置时钟数据单元首地址(秒单元)MOV R1,#30H ;置显示缓冲单元首地址(对应于最右显示位) CZ1:MOV A,R0 ;取当前数据单元BCD码 ANL A,#0FH ;保留低4位(个位) MOV R1,A ;送显缓当前个位单元 INC R1 ;指向显缓当前十位单元 MOV A,R0 ;再取当前数据单元BCD码 ANL A,#0F0H ;保留高4位(十位) SWAP A ;交换到低4位 MOV R1,A ;送显缓当前十位单元 INC R1 ;指向显缓下一个个位单元 INC R1 INC R0 ;指向下一个时钟数据单元 CJNE R0,#3DH,CZ1;未完继续 MOV 32H,#10H ;32H单元显示“-”,对应的值为10H MOV 35H,#10H ;35H单元显示“-”,对应的值为10HCZN:RET ;子程序返回 工作原理 :只有当进程单元为01H(为显示时钟进程),才进行拆字,其他进程直接把需要显示的数据送到数码管显示缓存单元(30H-37H),拆字时,将实时钟的单元(3AH,3BH,3CH)对应的各自拆完后存放于(30H,31H),(32H,33H),(34H,35H);利用R0指向实时钟单元,R1指向数码管显示缓存单元,逐次的将时钟高低字节拆开后分别存放于高低位单元。5.3显示更新子程序模块源程序如下:DISP:MOV R0,#30H ;显示更新子程序。置显示缓冲单元首地址 MOV R3,#01H ;字位码初值(从最右位起) MOV A,R3DISP1:MOV DPTR,#0FEFDH ; 8255-B口(字位码输出口) MOVX DPTR,A ; 输出当前字位码 JNB 21H.5,DISP2 ;判断是否有输入正确管理员密码,如无跳转 MOV A,R0 CJNE A,5FH,DISP2 ;跟5FH中的内容比较哪位需要闪烁 JB 21H.6,DISP2 ;判断该位要显示还是不显示 MOV A,#0FFH ;显示空格 LJMP NEXTPC DISP2:MOV A,R0 ; 取当前位显示数据码 ADD A,#TAB-NEXTPC ; 加TAB与NEXTPC差址 MOVC A,A+PC ; 查表得相应字段码 NEXTPC:MOV DPTR,#0FEFCH ; 8255-A口(字段码输出口) MOVX DPTR,A ; 输出字段码LCALL D1MS ; 保持显示1毫秒INC R0 ; 指向下一显示缓冲单元MOV A,#0FFH ;关掉段码MOVX DPTR,AMOV A,R3 ; 取出字位码JB ACC.7,DISP3 ; 判已显示到最左位否RL A ; 未完,字位码左移1位MOV R3,A ; 回存新字位码LJMP DISP1 ; 转下一位的显示驱动DISP3:RETTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;显示字段码表。"0""9" DB 0BFH,0FFH,00H;"-","空格","全亮" 工作原理 : 显示模块的作用是将显示缓存的单元(30H37H)中的内容在数码显示管上显示出来。首先将显示缓存第一个单元中的内容(30H)的字段码送入到82C55的B口,之后将右边第一位的位码送入到82C55的A口,则30H单元中的内容可以显示在显示数码管的最左边,在利用循环控制语句就可以将30H37H中的内容从左到右依次显示在数码管上了。5.4消抖动子程序用几个连续的单元存放最近几次的电平值,比较几个电平值,若相等则存起来与原态相比较,若新态与原态不等则认为一次电平变化。 源程序清单如下:XDPB : MOV 2FH,2EH ;PB口输入并消抖子程序。原新态存为前态 MOV 2DH,2CH ;前4次输入的电平值前推至2AH2DH单元 MOV 2CH,2BH MOV 2BH,2AH MOV 2AH,29H ;29H-2FH递存 MOV DPTR,#0FDFDH ;输入PB07新电平值存29H单元 MOVX A,DPTR ;取P0到P7的值 MOV 29H,A ;存入首单元 MOV A,2DH ;比较近5次输入的电平值不一致则新态照旧 CJNE A,2CH,XDR CJNE A,2BH,XDR CJNE A,2AH,XDR CJNE A,29H,XDR ;取29H-2CH与2DH分别比较 MOV 2EH,A ;递存 XDR:RET ;循环子程序说明: 执行这条子程序时,先把前4次输入的电平值前推至2AH2DH单元,然后从地址0FDFDH中读取P0到P7的值,然后对29H,2AH,2BH,2CH,2DH这五个单元进行比较,只有这五个单元的内容一样时,才能把2DH中的内容存入2EH中,这样就比较有效地避免开关量抖动的影响了。5.5 有按键时发出按键声子程序AJYHANDLE: MOV A,65H ;判断是否是(65H)=10H且(64H)10H,有则说明有新键按下,否则无键按下直接跳出子程序 CJNE A,#10H,AHH MOV A,64H CJNE A,#10H,AHH CLR P3.2 DJNZ 50H, AHH ;软件延时30ms,主流程大概10ms MOV 50H,#3 SETB P3.2 AHH:RET工作原理 :首先先识别有键按下,但(65H)=10H且(64H)10H才是有键按下,再对蜂鸣器进行清0,利用软件延时,50H单元控制延时时间(主流程大约为10ms),延时30ms。 5.6 无按键后30秒自动返回到时钟状态 WCZ:MOV A,1CH ;判断3AH的前后态来计时 CJNE A,#01H,WCZK MOV 4DH,#30 RET WCZK:MOV R6,65H CJNE R6,#10H,WCZ3 MOV R6,64H CJNE R6,#10H,WCZ3 MOV 4EH,3AH MOV A,4EH CJNE A,4FH,WCZ1 RET WCZ1:MOV 4FH,4EH DJNZ 4DH,WCZ2 MOV 1CH,#01H MOV 3EH,#80H MOV P1,#0FFH WCZ3:MOV 4DH,#20 WCZ2:RET 工作原理 :只有在非时钟显示情况下,利用秒单元3AH,4EH,4 FH用于存放实时钟的新旧态,当新旧态不同时,说明有1s时间,在利用一个控制次数的4DH来控制延时时间5.7 定时器T1中断服务子程序: IT1P:PUSH ACC ;定时器1服务子程序。保护现场 PUSH PSW INC 38H ;每200uS加1 MOV A,38H CJNE A,#50,DONE ;满10mS? MOV 38H,#0;200uS计数单元清0 INC 39H ;每10mS加1 MOV A,39H CJNE A,#100,DONE ;满1S? MOV 39H,#0 ;10mS计数单元清0 MOV A,3AH ;秒单元(按BCD码)加1 ADD A,#1 DA A MOV 3AH,A CJNE A,#60H,DONE ;满1分钟? MOV 3AH,#0 ;秒单元清零 MOV A,3BH ;分钟单元(按BCD码)加1 ADD A,#1 DA A MOV 3BH,A CJNE A,#60H,DONE ;满1小时? MOV 3BH,#0 ;分钟单元清零 MOV A,3CH ;小时单元(按BCD码)加1 ADD A,#1 DA A MOV 3CH,A CJNE A,#24H,DONE ;满24小时? MOV 3CH,#0 ;小时单元清零 DONE:POP PSW ;恢复现场 POP ACC RETI ;中断返回工作原理 :中断服务程序流程,其中每277.77777778us中断一次对38H单元进行加1.当38H单元满36时,就对39H单元内容加1,同时对38H单元清0,重新计数。当39H单元的内容满100时,就对3AH单元内容加1,同时对39H单元清0,重新计数.当3AH单元的内容满60时,就对3BH单元内容加1,同时对3AH单元清0,重新计数. 当3BH单元的内容满60时,就对3CH单元内容加1,同时对3BH单元清0,重新计数. 当3CH单元的内容满24时,只对3CH单元内容清0,回到初始继续这样循环下去。5.8房间处理模块 工作原理:对应房号输入处理的流程图如上所示,通过在不同的进程里面来判断是否是功能键(确定键,退格键,撤消键)或者数字键(0-9),在01H进程里,是功能键时直接返回(进程改为01H),数字键时,将数据送到数据缓存单元16H(进程改为01H) ;在10H进程里,是功能键的确定键时,直接返回,进程改为01H,为撤消键时,直接返回(进程改为01H),为退格键时,也直接返回(进程改为01H),为数字键时,数据往高位滚存(到达17H),进程加1(变为11H)。以此,在不同进程里判断不同按键后,做出相应的动作,当进程为12H时,按下确定键时,要注意比对房间号,比对正确就开启对讲信号灯(进程码变为01H),为其他键时,做出其他的相应动作。5.9密码处理子模块工作原理:密码输入流程图如上所示,它是建立在房间处理模块的基础之上,在进程为12H时,还继续输入数字键时,必为要输入用户密码或者管理员密码,一次将数字继续往高地址的数据缓存单元缓存后返回(进程码加1)。依次下去,退格键时,直接将数据从高位往低位滚存,最低位覆盖掉(进程码减1);撤消键时,直接返回(进程码为01H)。当进程为15H时,按下确定键时,先进行用户密码的比对,相符时开启相应的对讲信号灯(进程码变为01H), 不符时再进行管理员密码的核对,相符时进入时钟修改界面,不符时直接告警(进程码变为01H)后返回。5.10时钟修改子模块工作原理:时钟修改模块流程图如上所示,也是通过在不同的进程里面进行判断相应键后作出不同的动作,在时钟修改进程(20H-25H),一旦确定键按下就要直接保存修改数据于数据缓存单元,按下数字键时,要在不同进程里判断输入的数据是否符合实际情况,不符时不让该位执行修改并停留在该位修改的位置,等待修改。5.10用户密码修改子模块工作原理:在设时钟进程,20H25H,按下确定键,则改进程为30H,每输入1位数字,则进程码加1,进程为35H时,再输1位数字,进程仍为35H。进程35H时,按下确定键,则保存住户开门密码,进程改为设管理员密码40H,30H 35H时,按下取消键则不保存退出,进程改为01H。第六章、系统功能与操作说明6.1系统功能描述 1总初始化自检功能:把由keil软件生成的.HEX文件下载到实验板上单板机中,先上电等待各芯片均上电复位后自检,先是蜂鸣器响1S后关闭, U3和U5芯片初始化,L8-L15点亮,L0-L7点亮1S后熄灭,数码管每段全亮大约1S检测设备是否完好。2.自检完后显示时钟初始为08:59:45,如果不进行任何操作,一直显示时钟。当你输入正确用户密码,P1.7会亮,延时5s后熄灭,输入位数不符或密码不正确都会报警。密码在界面上前三位可看见,后三位看不见(用“”表示)。也可以通过按下P B7(外接开门按钮)来使P1.7亮,同样延时5s后熄灭。3.用键盘做输入时,按下键的瞬间,会发出短促的按键声。4.设置了取消键,按下此键无论数码管显示什么,都会返回时钟显示。5.输入正确的房间号(12间)会让对应的LED(对讲门铃)亮1s后熄灭,此后再按下P B6也可使P1.7点亮,同样5s后会自动熄灭。没有输入正确房间号,按下P B6,P1.7不会亮。6.当输入出错时会报警,就是蜂鸣器响1s后停止。7.无任何操作时,经过30s会自动返回时钟显示。8.按下输管理员按键时,就可以输入管理员密码,如果输入正确,变成时钟界面,可通过键盘进行修改时间。改完时间后按确定键,如果修改正确,则进入住户开门密码参数界面,否则返回时钟继续修改。进入住户开门密码参数界面,当你通过键盘输入六位数时,再按确定键,就把你刚才输入的六位数变成了用户密码,如果不想改用户密码按取消键即可返回时钟显示。第七章、存在问题与程序改进说明 问题1:在输入按键后,只能执行一轮 解决方法:出现这种问题的主要原因是用来作标志位的存储单元在用完之后没有及时的清零,由于执行第一轮执行时,在初始化时已经将标志位清零了,所以可以正常执行,但是在后面的程序中,如果没有软件将它清零,会导致该模块一直执行,从而造成出错。所以只要在每次用完标志位后马上将它清零掉。 问题2:当房号输入正确时,对应对讲的灯不能保持点亮1秒 解决方法:添加一个让它保持点亮1秒的子程序,通过利用主流程执行的一次的时间大概10ms来设定适当的循环计数值,从而达到定时1秒的目的,。 问题3:修改用户密码时,输入修改密码时,密码会跟之前输入的不同 解决方法:通过对程序的分析知道,是由于数据从缓存单元送入(1DH,1EH