资源描述
单片机应用系统设计 课程名称_单片机原理与接口技术 题目名称_家居安全监视系统 学生学院 信息工程学院 专业班级 学 号 学生姓名 指导教师 _ 2011 年 6 月 22 日目录一、单片机课程设计任务书3二、家居监视系统设计项目简介5三、家居监视系统功能描述6A、家居安全监视系统基本介绍6B、家居安全监视系统主要功能6C、家居安全监视系统使用说明61、主机62、从机8D、家居安全监视系统技术指标81、主机82、从机9四、家居安全监视系统电路原理图9五、家居安全监视系统程序框图13六、家居安全监视系统程序清单18A、主机程序清单18B、从机程序清单35七、收获与体会44一、单片机课程设计任务书(适合08级通信工程方向单片机课程设计)一、 课程设计题目:单片机应用系统设计基于单片机的题目自拟二、 总体要求:本课程设计的题目机设计内容自选,学生可以根据平时的观察、了解单片机实际的应用系统,弄清其结构和功能,结合单片机课程及其他相关课程的知识,充分发挥自身的想象力和创造力,自行选定设计项目,但总体应达到以下要求:1、 用89S51CPU,12M时钟,常规的上电和手动复位电路2、 包括3个以上的独立式按键3、 至少2位LED数码显示器及其接口4、 一路蜂鸣器输出5、 至少有2路输入信号,可以是模拟量或数字量三、 课程设计具体要求:选定好设计项目后,课程设计应达到以下要求1、 编写项目功能说明书,确定应用系统的功能和具体参数2、 设计电路原理图3、 制作硬件4、 设计和调试程序5、 课程设计报告四、 课程设计报告内容及要求1、 课程设计任务书2、 设计项目简介3、 电路原理图4、 系统功能描述5、 程序框图6、 程序清单7、 收获与体会五、 验收及评分标准1、 硬件制作20%2、 课程设计报告 60%3、 功能展示及答辩 20%六:参考题目:1、 基于单片机的智能电风扇控制器2、 基于单片机的多功能洗衣机程序控制器3、 基于单片机的多功能灯光控制器4、 基于单片机的单片机多机通信系统5、 基于单片机的智能温度控制系统6、 基于单片机的多功能数字电子钟7、 基于单片机的多功能防盗报警装置二、家居监视系统设计项目简介随着生活水平提高,人们的物质财富越来越多,需要保护的财产也越来越多,对人身安全也越来越重视。使得人们对住所的安全性越来越重视,家居安防的重要性越来越大,市场对家居安防系统的需求增大。本家居安全监视系统设计用于对家庭各个入口的监视,使得屋主时刻掌握屋内的安全状态和遭遇入侵的位置,大大提高了家庭的安全性。三、家居监视系统功能描述A、 家居安全监视系统简介家居安全监视系统是基于89S52单片机的家居安防系统。该系统包含了三大模块:检测模块、显示模块、控制模块。检测模块仅与从机连接,由3个红外接近开关和一个金属接近开关组成,红外接近开关最大检测范围为80cm,用于房间入口物体进出的检测,金属接近开关最大检测范围为4mm,用于大门开关检测。显示模块由LCD1602(用于主机)和数码管、LED灯(用于从机)组成。控制模块由轻触开关组成,用于调整各系统参数。B、家居安全监视系统主要功能分别给主机、从机上电后,可分别对主机、从机的时间进行调整,其中主机嵌入了万年历功能,便于用户日常生活中对时间、日期的把握和当遇到入侵事件时,对发生的时刻的掌握。从机仅有时分显示,只用于开关监视系统的判断。将主机、从机时间调整正确后,用户可在主机对监视系统进行监视时间段设置和监视系统总开关设置(主机同时自动将设置好的参数发送至从机,设置完毕后,只要系统不断电便可持续正常工作)。当进入系统监视时间段后,若监视系统总开关为1(即打开),监视系统开始工作,从机进入监视状态,处理传感器返回数据,当检测到大门被打开或者小房间有物体进出后,从机拉响警报、打开照明灯并显示CALL 110警告入侵者,同时不断向主机发送入侵信息,主机拉响警报并在屏幕显示入侵位置。若用户判定警报可解除,可在主机关闭监视系统开关(将G清零),监视系统关闭,警报消除。若要重新打开监视功能,将监视系统总开关重新打开即可(本系统也可用于家用保险柜安全监视:三个红外接近开关安装在保险柜的三个上左右三个侧面,金属接近开关安装于保险柜柜门)。C、 家居安全监视系统使用说明1、主机主机用LCD1602液晶显示屏显示,是用户操作主要平台。液晶显示器显示内容布局如下图所示:当用户按下K1键时系统进入模式1调秒模式。K2键用于增加,K3键用于减少。当用户再次按下K1键时系统进入模式2调分模式。K2键用于增加,K3键用于减少。当用户再次按下K1键时系统进入模式3调时模式。K2键用于增加,K3键用于减少。当用户再次按下K1键时系统进入模式4调日模式。K2键用于增加,K3键用于减少。当用户再次按下K1键时系统进入模式5调月模式。K2键用于增加,K3键用于减少。当用户再次按下K1键时系统进入模式6调年模式。K2键用于增加,K3键用于减少。当用户再次按下K1键时系统进入模式7监视系统开启时间设置模式。K2键用于增加,K3键用于减少。当用户再次按下K1键时系统进入模式8监视系统关闭时间设置模式。K2键用于增加,K3键用于减少。当用户再次按下K1键时系统进入模式9监视系统总开关设置模式。K2键用于置一即开启总开关,K3键用于清零即关闭总开关。(发现入侵后,大门和房间的标志消失)。当用户再次按下K1键时,系统恢复正常状态。此时K2、K3键无效。2、从机当从机处于正常状态时,数码管显示布局如下图所示:当用户按下K1键时系统进入模式1调分模式。K2键用于增加,K3键用于减少。当用户再次按下K1键时系统进入模式2调时模式。K2键用于增加,K3键用于减少。当用户再次按下K1键时, 系统恢复正常状态。此时K2、K3键无效。当监视系统总开关处于打开状态时,LED6发光。LED1,2,3,4随传感器实时数据亮灭。当监视系统处于监视状态发现入侵后,数码管显示CALL 110。D、家居安全监视系统技术指标 1、主机输入电压:5V12V消耗电流 DC20mA工作环境温度:-20+70 2、从机输入电压:5V12V消耗电流 DC80mA响应时间2ms工作环境温度:-20+55标准检测物体:太阳光10000LX以下 白炽灯3000LX以下(红外接近开关)指向角:15,有效距离3-80CM可调(红外接近开关)检测物体:透明或不透明体(红外接近开关)、铁、钴、镍等物质(金属接近开关)检测距离:04mm(金属接近开关) 四、家居安全监视系统电路原理图(如后所示)五、家居安全监视系统程序框图A、主机程序运行流程图主机上电后进入正常工作状态,用户可通过K1进行调整模式选择,选择完模式后,使用K2、K3进行对当前模式的参数进行调整。从而实现万年历的修改、对监视系统开关的控制。在模式调整或正常显示状态情况下,主机在后台不断发送监视系统开关数据到从机,和接收从从机发送过来的传感器实时检测数据并进行进一步处理。B、从机程序运行流程图从机上电后进入正常工作状态,用户可通过K1进行调整模式选择,选择完模式后,使用K2、K3进行对当前模式的参数进行调整。(从机仅提供小时和分钟模式调整)在模式调整或正常显示状态情况下,从机不断发送传感器实时检测数据到主机,并不断接收从主机发送过来的监视系统开关状态数据,并对接收到的数据进行处理从而配合对传感器返回数据处理。C、监视系统工作流程图主机每秒发送一次监视系统总开关状态和监视系统开关时间至从机,发送前先判断4DH为0还是1,当4DH的数据为0时,将TIME1的数据放入发送数据帧的低5位,将KEY放至第6位,第7位清零。当4DH为1时,将TIME2的数据放入数据帧低5位,将KEY放至第6位,第7位置一。从机接收到数据后,先判断接收到的数据帧第7位为0还是1,决定将数据帧的低5位送至TIME1还是TIME2,同时取出数据帧中的第6位存入KEY。从机同样每秒发送一次传感器数据至主机,仅占用数据帧的高4位,分别为大门的金属接近开关和房间1,2,3的红外接近开关实时数据。D、 传感器工作流程图传感器没检测到大门开启或物体靠近时,传感器输出高电平,检测到后输出低电平。红外接近开关提供检测距离可调功能,可调整范围为380cm,金属接近开关检测范围为04mm。E、万年历程序框图调整模式下对万年历的调整情况类似于本框图,故不再臃述。六、家居安全监视系统程序清单A、主机程序清单如下:WARN EQU 2FH ;传感器数据TIME2 EQU 7CH ;监视系统关闭时间TIME1 EQU 7DH ;监视系统开启时间COUNT0 EQU 7FHCOUNT1 EQU 7EHSEC EQU 30HMIN EQU 31HHOU EQU 32HDAY EQU 33HMON EQU 34HYEAL EQU 35H /年份低8位,BCD码表示个位,十位YEAH EQU 36HLEAP BIT F0 ;闰年标志位KEY BIT 1FH ;监视系统总开关RS BIT P2.5 ;LCD 数据/命令选择端(H/L)RW BIT P2.6 ;LCD读/写选择端(H/L)EP BIT P2.7 ;LCD 使能控制MODE_REG EQU 6FH ;模式寄存器MODE BIT P3.2UP BIT P3.3DOWN BIT P3.4ORG 0000HLJMP MAINORG 000BHLJMP T_0ORG 0023HLJMP SP_INTORG 0030H;主程序MAIN: MOV SCON,#11010000B ;采用方式三,接收允许 MOV PCON,#80H ;波特率加倍 MOV TMOD,#00100010B /初始化定时器,模式2,定时200us MOV TH0,#56 MOV TL0,#56 MOV TH1,#243 /设置波特率4808 MOV TL1,#243 MOV IE,#10010010B /开总中断,串行中断和定时器0中断 MOV IP,#00000010B/定时器中断优先级最高 MOV COUNT0,#25 MOV COUNT1,#200 MOV SEC,#45 MOV MIN,#0 MOV HOU,#0 MOV DAY,#22 MOV MON,#6 MOV YEAL,#11H MOV YEAH,#20H MOV P2,#0FFH ;关闭数码管显示 MOV P0,#0 ;对P0清零 MOV WARN,#11110000B ;对传感器状态赋初值,为安全状态 MOV TIME1,#18 MOV TIME2,#23 CLR 4DH ;用于判断传送time1还是time2数据 SETB TR0;开定时器0中断 SETB TR1;开定时1中断 ;LCD初始化; MOV P0,#00000001B/清屏,光标复位 LCALL ENABLE;写指令 MOV P0,#00111000B/设置LCD 为16X2 显示,5X7 点阵,八位数据接口 LCALL ENABLE MOV P0,#00001100B/设置LCD 开显示及光标形式(光标不闪烁,不显示-) LCALL ENABLE MOV P0,#00000110B /LCD 显示光标移动设置(光标地址指针加1,整屏显示不移动) LCALL ENABLE MOV DPTR,#TABLE0/将TABLE0地址赋给DPTR寄存器 MOV MODE_REG,#0/将模式寄存器清零,即初始化状态为正常显示,不能进行调整工作;主程序;WAIT: LCALL KEY_SCAN LCALL DISP LJMP WAITSEND: ;发送数据 JNB 4DH,SNEXT ;判断当前应该发TIME1还是TIME2数据 MOV A,TIME1 LJMP SNEXT1SNEXT:MOV A,TIME2 ADD A,#10000000BSNEXT1:JB KEY,KNEXT ;将KEY即总开关状态标志位加入到发送数据的第6位 LJMP KNEXT0KNEXT: ADD A,#01000000BKNEXT0:MOV SBUF,A;发送SLOOP:JBC TI,SEXIT;判断是否发送完毕 SJMP SLOOPSEXIT: RET;键盘扫描;KEY_SCAN:JNB MODE,GO_MODE JNB UP,GO_UP JNB DOWN, GO_DOWN0 RETGO_MODE:INC MODE_REG MOV A,MODE_REGCJNE A,#10,GO_MODE1MOV MODE_REG,#0GO_MODE1:LCALL DELAY30MS JNB MODE,GO_MODE1 JNB UP,GO_UP JNB DOWN,GO_DOWN0 RETGO_DOWN0:LJMP GO_DOWN;增;GO_UP:CJNE A,#0,GO_UP1 RETGO_UP1:MOV A,MODE_REG XRL A,#1 JZ GO_UP_SEC0 MOV A,MODE_REG XRL A,#2 JZ GO_UP_MIN0 MOV A,MODE_REG XRL A,#3 JZ GO_UP_HOU0 MOV A,MODE_REG XRL A,#4 JZ GO_UP_DAY0 MOV A,MODE_REG XRL A,#5 JZ GO_UP_MON0 MOV A,MODE_REG XRL A,#6 JZ GO_UP_YEA0 MOV A,MODE_REG XRL A,#7 JZ GO_UP_TIME0 MOV A,MODE_REG XRL A,#8 JZ GO_UP_TIME2 MOV A,MODE_REG XRL A,#9 JZ GO_UP_KEY0 RETGO_UP_MIN0:LJMP GO_UP_MINGO_UP_SEC0:LJMP GO_UP_SECGO_UP_HOU0:LJMP GO_UP_HOUGO_UP_DAY0:LJMP GO_UP_DAYGO_UP_MON0:LJMP GO_UP_MONGO_UP_YEA0:LJMP GO_UP_YEAGO_UP_TIME0:LJMP GO_UP_TIMEGO_UP_TIME2:LJMP GO_UP_TIME3GO_UP_KEY0:LJMP GO_UP_KEY;调整报警电路开关;GO_UP_KEY:SETB KEY;监视器总开关置一,即打开总开关GO_UP_KEY1:LCALL DELAY30MS JNB UP,GO_UP_KEY1 RET;调整开启报警检测电路时间GO_UP_TIME:INC TIME1 MOV A,TIME1CJNE A,#24,GO_UP_TIME1MOV TIME1,#0GO_UP_TIME1:LCALL DELAY30MS JNB UP,GO_UP_TIME1 RET ;调整关闭报警检测电路时间GO_UP_TIME3:INC TIME2 MOV A,TIME2CJNE A,#24,GO_UP_TIME4MOV TIME2,#0GO_UP_TIME4:LCALL DELAY30MS JNB UP,GO_UP_TIME4 RET ;调整日数;GO_UP_DAY:INC DAY MOV A,MON;判断当前月 CJNE A,#2,NO20 ;是否为2月 LCALL LEAPYEAR MOV C,LEAP JC LEAPMON0 /是二月则先判断是否是闰年 MOV A,DAY ;平年2月处理 CJNE A,#29,GO_UP_DAY1 MOV DAY,#1 LCALL GO_UP_MONGO_UP_DAY1:LCALL DELAY30MS JNB UP,GO_UP_DAY1 RETLEAPMON0:MOV A,DAY /闰年二月的处理,若到达29号,则回到1号 CJNE A,#30,GO_UP_DAY2 MOV DAY,#1 LCALL GO_UP_MONGO_UP_DAY2:LCALL DELAY30MS JNB UP,GO_UP_DAY2 RETNO20: MOV A,MON /不是二月,判断其是否是小月 XRL A,#4 JZ LITMON0 MOV A,MON XRL A,#6 JZ LITMON0 MOV A,MON XRL A,#9 JZ LITMON0 MOV A,MON XRL A,#11 JZ LITMON0 MOV A,DAY /是大月 CJNE A,#32,GO_UP_DAY3 MOV DAY,#1 LCALL GO_UP_MON MOV A,MONGO_UP_DAY3:LCALL DELAY30MS JNB UP,GO_UP_DAY3 RETLITMON0: MOV A,DAY /小月的处理,若到达30号,则回到1号 CJNE A,#31,GO_UP_DAY4 MOV DAY,#1 LCALL GO_UP_MONGO_UP_DAY4:LCALL DELAY30MS JNB UP,GO_UP_DAY4 RET;调整年份;年份用BCD码存储GO_UP_YEA:INC YEAL/年份加一 MOV A,YEAL ANL A,#0FH /判断加一后,YEAL的低4位BCD码是否为10 CJNE A,#10,GO_UP_YEA1 /未满10直接跳出 MOV A,YEAL /满10 后,YEAL高4位BCD码加一 ANL A,#0F0H ADD A,#00010000B/低4位清零 MOV YEAL,A CJNE A,#10100000B,GO_UP_YEA1 /判断YEAL高4位是否满10 MOV YEAL,#0 INC YEAH/YEAH加一,余下处理同YEAL MOV A,YEAH ANL A,#0FH CJNE A,#10,GO_UP_YEA1 MOV A,YEAH ANL A,#0F0H ADD A,#00010000B MOV YEAH,A CJNE A,#10100000B,GO_UP_YEA1 MOV YEAH,#0 GO_UP_YEA1:LCALL DELAY30MS JNB UP,GO_UP_MON1 RET;调整月份;GO_UP_MON:INC MON MOV A,MONCJNE A,#13,GO_UP_MON1MOV MON,#1LCALL GO_UP_YEAGO_UP_MON1:LCALL DELAY30MS JNB UP,GO_UP_MON1 RET;调整小时;GO_UP_HOU:INC HOU MOV A,HOUCJNE A,#24,GO_UP_HOU1MOV HOU,#0LCALL GO_UP_DAYGO_UP_HOU1:LCALL DELAY30MS JNB UP,GO_UP_HOU1 RET;调整分钟;GO_UP_MIN:INC MIN MOV A,MINCJNE A,#60,GO_UP_MIN1MOV MIN,#0LCALL GO_UP_HOUGO_UP_MIN1:LCALL DELAY30MS JNB UP,GO_UP_MIN1 RET;调整秒钟;GO_UP_SEC:INC SEC MOV A,SECCJNE A,#60,GO_UP_SEC1MOV SEC,#0LCALL GO_UP_MINGO_UP_SEC1:LCALL DELAY30MS JNB UP,GO_UP_SEC1 RETDELAY30MS:MOV R6,#50D2: MOV R5,#100 DJNZ R5,$ DJNZ R6,D2 RET;减;GO_DOWN:CJNE A,#0,GO_DOWN1 RETGO_DOWN1:MOV A,MODE_REG XRL A,#1 JZ GO_DOWN_SEC0 MOV A,MODE_REG XRL A,#2 JZ GO_DOWN_MIN0 MOV A,MODE_REG XRL A,#3 JZ GO_DOWN_HOU0 MOV A,MODE_REG XRL A,#4 JZ GO_DOWN_DAY0 MOV A,MODE_REG XRL A,#5 JZ GO_DOWN_MON0 MOV A,MODE_REG XRL A,#6 JZ GO_DOWN_YEA0 MOV A,MODE_REG XRL A,#7 JZ GO_DOWN_TIME0 MOV A,MODE_REG XRL A,#8 JZ GO_DOWN_TIME2 MOV A,MODE_REG XRL A,#9 JZ GO_DOWN_KEY0 RETGO_DOWN_MIN0:LJMP GO_DOWN_MINGO_DOWN_SEC0:LJMP GO_DOWN_SECGO_DOWN_HOU0:LJMP GO_DOWN_HOUGO_DOWN_DAY0:LJMP GO_DOWN_DAYGO_DOWN_MON0:LJMP GO_DOWN_MONGO_DOWN_YEA0:LJMP GO_DOWN_YEAGO_DOWN_TIME0:LJMP GO_DOWN_TIMEGO_DOWN_TIME2:LJMP GO_DOWN_TIME3GO_DOWN_KEY0:LJMP GO_DOWN_KEY;调整监视系统电路开关:清零。关总监视系统开关GO_DOWN_KEY:CLR KEYGO_DOWN_KEY1: LCALL DELAY30MS JNB DOWN,GO_DOWN_TIME1 RET;调整开启监视系统时间GO_DOWN_TIME:DEC TIME1 MOV A,TIME1CJNE A,#-1,GO_DOWN_TIME1MOV TIME1,#23GO_DOWN_TIME1:LCALL DELAY30MS JNB DOWN,GO_DOWN_TIME1 RET ;调整关闭监视系统时间GO_DOWN_TIME3:DEC TIME2 MOV A,TIME2CJNE A,#-1,GO_DOWN_TIME4MOV TIME2,#23GO_DOWN_TIME4:LCALL DELAY30MS JNB DOWN,GO_DOWN_TIME4 RET ;调整日数;GO_DOWN_DAY: DEC DAY MOV A,MON DEC A /判断上一个月是否为2月 CJNE A,#2,NO21 LCALL LEAPYEAR MOV C,LEAP JC LEAPMON1 /是二月则先判断是否是闰年 MOV A,DAY CJNE A,#0,GO_DOWN_DAY1 MOV DAY,#28 LCALL GO_DOWN_MONGO_DOWN_DAY1:LCALL DELAY30MS JNB DOWN,GO_DOWN_DAY1 RETLEAPMON1:MOV A,DAY /闰年二月的处理,若到达29号,则回到1号 CJNE A,#0,GO_DOWN_DAY2 MOV DAY,#29 LCALL GO_DOWN_MONGO_DOWN_DAY2:LCALL DELAY30MS JNB DOWN,GO_DOWN_DAY2 RETNO21: MOV A,MON DEC A /不是二月则判断大小月 XRL A,#4 JZ LITMON1 MOV A,MON DEC A XRL A,#6 JZ LITMON1 MOV A,MON DEC A XRL A,#9 JZ LITMON1 MOV A,MON DEC A XRL A,#11 JZ LITMON1 /判断是否是小月 MOV A,DAY /是大月 CJNE A,#0,GO_DOWN_DAY3 MOV DAY,#31 LCALL GO_DOWN_MONGO_DOWN_DAY3:LCALL DELAY30MS JNB DOWN,GO_DOWN_DAY3 RETLITMON1: MOV A,DAY /小月的处理,若到达30号,则回到1号 CJNE A,#0,GO_DOWN_DAY4 MOV DAY,#30 LCALL GO_DOWN_MONGO_DOWN_DAY4:LCALL DELAY30MS JNB DOWN,GO_DOWN_DAY4 RET;调整年份;GO_DOWN_YEA: MOV A,YEAL CJNE A,#0,YEAN1 /判断当前年是否能被100整除 MOV YEAL,#99H /如能被100整除,则将调整后的年份两位赋99 MOV A,YEAH CJNE A,#0,YEAN2 /判断当前年的BCD码前两位是否为0 MOV YEAH,#99H /如为0,则调整后年份的前两位赋99 LJMP GO_DOWN_YEA1YEAN1:MOV A,YEAL /如不能被100整除,则判断YEAL低4位是否为0 ANL A,#0FH CJNE A,#0,YEAN11 CLR C /YEAL低四位为0 时,高四位减一,低四位赋9,即YEAL减去6 MOV A,YEAL SUBB A,#6 MOV YEAL,AYEAN11:DEC YEAL /低四位不为0,则进行正常减一操作 LJMP GO_DOWN_YEA1YEAN2:MOV A,YEAH /同YEAL处理 ANL A,#0FH CJNE A,#0,YEAN21 CLR C MOV A,YEAH SUBB A,#6 MOV YEAH,AYEAN21:DEC YEAHGO_DOWN_YEA1:LCALL DELAY30MS JNB DOWN,GO_DOWN_MON1 RET;调整月份;GO_DOWN_MON:DEC MON MOV A,MONCJNE A,#0,GO_DOWN_MON1MOV MON,#12LCALL GO_DOWN_YEAGO_DOWN_MON1:LCALL DELAY30MS JNB DOWN,GO_DOWN_MON1 RET;调整小时;GO_DOWN_HOU:DEC HOU MOV A,HOU CJNE A,#-1,GO_DOWN_HOU1 MOV HOU,#23LCALL GO_DOWN_DAYGO_DOWN_HOU1:LCALL DELAY30MS JNB DOWN,GO_DOWN_HOU1 RET;调整分钟;GO_DOWN_MIN:DEC MIN MOV A,MIN CJNE A,#-1,GO_DOWN_MIN1 MOV MIN,#59LCALL GO_DOWN_HOUGO_DOWN_MIN1:LCALL DELAY30MS JNB DOWN,GO_DOWN_MIN1 RET;调整秒钟;GO_DOWN_SEC:DEC SEC MOV A,SEC CJNE A,#-1,GO_DOWN_SEC1 MOV SEC,#59LCALL GO_DOWN_MINGO_DOWN_SEC1:LCALL DELAY30MS JNB DOWN,GO_DOWN_SEC1 RET;定时器0中断T_0: PUSH ACC PUSH PSW DJNZ COUNT0,EXTI0/定时1s MOV COUNT0,#20 DJNZ COUNT1,EXTI0 MOV COUNT1,#250 CPL 4DH LCALL SEND /发送TIME1、TIME2数据 JNB KEY,NEXT000 MOV A,WARN /判断WARN是否正常,发现入侵时,将P1.2取反,蜂鸣器按0.5HZ的频率发出响声 CJNE A,#11110000B,NEXT0 LJMP NEXT00NEXT0:CPL P1.2 LJMP NEXT000NEXT00:SETB P1.2NEXT000:INC SEC /秒 MOV A,SEC CJNE A,#60,EXTI0 MOV SEC,#0 INC MIN /分 MOV A,MIN CJNE A,#60,EXTI0 MOV MIN,#0 INC HOU /时 MOV A,HOU CJNE A,#24,EXTI0 MOV HOU,#0 INC DAY /日 MOV A,MON CJNE A,#2,NO2 /判断是否是二月 LCALL LEAPYEAR /是二月则先判断是否是闰年 MOV C,LEAP JC LEAPMON /调至闰年二月处理子程序 MOV A,DAY CJNE A,#29,EXTI0 /平年二月处理 INC MON MOV DAY,#1 EXTI0:POP PSW POP ACC RETI NO2: MOV A,MON /不是二月 XRL A,#4 JZ LITMON MOV A,MON XRL A,#6 JZ LITMON MOV A,MON XRL A,#9 JZ LITMON MOV A,MON XRL A,#11 JZ LITMON /判断是否是小月 MOV A,DAY /是大月 CJNE A,#32,EXTI0 MOV DAY,#1 MOV A,MON INC MON CJNE A,#12,EXTI0 /判断该大月是否是12月 MOV MON,#1 INC YEAL/年份加一 MOV A,YEAL ANL A,#0FH CJNE A,#10,EXTI0 MOV A,YEAL ANL A,#0F0H ADD A,#00010000B MOV YEAL,A CJNE A,#10100000B,EXTI0 MOV YEAL,#0 INC YEAH/年份高位加一 MOV A,YEAH ANL A,#0FH CJNE A,#10,EXTI0 MOV A,YEAH ANL A,#0F0H ADD A,#00010000B MOV YEAH,A CJNE A,#10100000B,EXTI0 MOV YEAH,#0 POP PSW POP ACC RETILITMON:MOV A,DAY /小月的处理,若达到31号,则回到1号 CJNE A,#31,EXTI0 MOV DAY,#1 INC MON POP PSW POP ACC RETILEAPMON: MOV A,DAY /闰年二月的处理,若到达30号,则回到1号 CJNE A,#30,EXTI0 MOV DAY,#1 INC MON POP PSW POP ACC RETILEAPYEAR:MOV A,YEAL /判断是否闰年子函数 ,闰年则leap置一,否则清零 MOV B,#4 /判断其能否被4整除, DIV AB MOV A,B CJNE A,#0,LEAP0 /不能被4整除,为平年,将闰年标志位清零跳出 MOV A,YEAL CJNE A,#0,LEAP1 /判断其能否被100整除,能被4整除不能被100整除的为闰年,将闰年标志位置一 MOV A,YEAH /能被100整除,判断其能否被400整除 MOV B,#4 DIV AB MOV A,B CJNE A,#0,LEAP0/能被100整除不能被400整除为平年,将标志位清零LEAP1:SETB LEAP/能被400整除,为闰年,将闰年标志位置一 RETLEAP0:CLR LEAP RET;串行通信中断;SP_INT:PUSH ACC PUSH PSW JB TI,EXT_SP /若为发送位引起的中断为干扰,跳出中断LOOP: JNB RI,LOOP /判断是否接收完数据,接收完后,对RI清零 CLR RI MOV A,SBUF/存储接收到的数据 MOV WARN,A/将从机发送过来的监视数据存放到主机的监视数据存储器EXT_SP:POP PSW POP ACC RETIDISP: ;年显示; MOV P0,#80H /写入起始显示地址 LCALL ENABLE /写指令 MOV A,YEAH /显示年份BCD码的最高位 SWAP A ANL A,#0FH LCALL WRITE/写数据 MOV A,YEAH ANL A,#0FH LCALL WRITE MOV A,YEAL SWAP A ANL A,#0FH LCALL WRITE MOV A,YEAL ANL A,#0FH LCALL WRITE MOV A,#11 LCALL WRITE ;月显示; MOV P0,#85H /写入起始显示地址 LCALL ENABLE MOV A,MON LCALL TRA /调用进制转换子程序 MOV A,21H LCALL WRITE MOV A,20H LCALL WRITE MOV A,#11 LCALL WRITE ;日显示; MOV P0,#88H /写入起始显示地址 LCALL ENABLE MOV A,DAY LCALL TRA MOV A,21H LCALL WRITE MOV A,20H LCALL WRITE ;
展开阅读全文