流程图:
本实验所有资料打包下载:
单片机实验.rar
(55.34 KB, 下载次数: 7)
实验报告论文如下:
单片机实验报告 ―自动报时系统设计实验 院系:电信学院自动化0106 姓名:王建冬 学号:200182012
一. 设计任务 1.时间显示功能。用6位数码管显示时,分,秒。 2.利用键盘可以设定当前时间(时,分,秒) 3.2个LED指示灯L1,L2来表示输出状态 4.作息时间表存于ROM中,时间表如下: 08:00开始工作 L1亮2s后灭,L2灭; 11:30 午休 L1亮2s后灭,L2亮一个小时后灭; 12:30下午工作开始 L1亮2s后灭,L2灭; 17:00下班 L1亮2s后灭,L2亮十分钟后灭; 二. 硬件连线图 (附录1) 三. 程序流程图 (附录2) 四. 程序 (附录3) 五. 操作说明 系统上电显示“LLLLLLLL”后,立即从初始时间7:56:30开始运行。当按下键盘last键后,进入修改模式,此时数码管对应小时的位置闪烁,时间不停,再按一下last,退出修改模式,显示正常。 在修改模式下:按下next键,转换要修改的位置,由数码管相应的位置闪烁,可知将要修改的是小时,分钟,还是秒,此时间也不停止;按下shift键,时间停止,相应的位置加一,如果指向秒的位置则清零,实现修改时间的功能。修改完毕,再按一下last,退出修改模式,显示正常。 六. 心得 通过实验,更好得理解了MCS-51单片机的硬件系统与指令系统,有了在ADEK51实验设备上开发单片机的能力,同时对键盘扫描/显示芯片8279有了一定的了解,并能熟练应用8279。 由于本实验有一定的复杂性及应用性,所以更强调系统的设计步骤、方法,在实验中还要不断的修改,以使程序尽可能的合理与简化,此次实验增加了自己的开发经验,为以后打下坚实的基础。
程序: - ;附录3:源程序
- ;说明:
- ;R0指向30,31,32的地址指针,初始值为30 全局
- ;R1函数toram的入口,指向20的地址指针 全局
- ;R2定时一秒的常数 全局
- ;R3接受按键 全局
- ;R4报警标志位 全局 r3,r4是函数toram用到的寄存器 局部
- ;R5计时器状态标志 全局 r5=00 计时器go r5=11 计时器stop
- ;R6修改状态标志 全局 r6=00 按键无效 r6=ff 进入修改状态,
- ;R7函数toram的入口,全局 一个压缩BCD码
- ;20H开始的8个数据单元存放时间的BCD码
- ;30H,31H,32H依次存放小时,分,秒的压缩BCD码
-
- Z8279 EQU 0FF82H
- D8279 EQU 0FF80H
- LEDMOD EQU 10H
- LEDFEQ EQU 38H
- LEDCLS EQU 0D1H
- LEDWRO EQU 90H
- KEY1 EQU 28H ;修改状态改变
- KEY2 EQU 29H ;修改位置改变
- KEY3 EQU 2AH ;数值改变
- ORG 0000H
- AJMP START
- ORG 000BH
- AJMP T0INT
- ORG 0040H
- START:
- MOV SP,#60H
- MOV R1,#20H
- MOV R2,#08H
- MOV A,#00H
- MOV 30H,#07H
- MOV 31H,#56H
- MOV 32H,#30H
- MOV DPTR,#Z8279
- MOV A,#LEDCLS
- MOVX @DPTR,A
- LCALL DELAY
- MOV A,#LEDMOD
- MOVX @DPTR,A
- MOV A,#LEDFEQ
- MOVX @DPTR,A
- LOOP22:
- MOV @R1,A
- INC R1
- DJNZ R2,LOOP22
- LCALL INIT8279
- ;------------------------初始化
- CLR P1.0
- CLR P1.1
-
- MOV R6,#00H
- MOV R0,#30H
- MOV R2,#14H
- mov R5,#00h
- MOV R4,#00H ;清标志位 -报警
- MOV R7,#00H
- MOV 22H,#00H
- MOV 25H,#00H
- CLR TF0
- MOV TMOD,#01H
- MOV TH0,#4BH
- MOV TL0,#0FCH
- MOV IE,#82H
- SETB TR0
- ;---------------------修改时间
- MODIFY:
- MOV DPTR,#Z8279
- MOVX A,@DPTR
- ANL A,#0FH
- JZ KEY_OUT ;没有按键 跳出
- MOV A,#40H
- MOVX @DPTR,A
- MOV DPTR,#D8279
- MOVX A,@DPTR ;A接受按键
- MOV R3,A
- CJNE R3,#KEY1,POSITION ;判断按键是不是key1, 不是跳转
- CJNE R6,#00H,PRESS_SEC ;第一次按key1进入修改状态,(显示闪烁),时间不停
- MOV R6,#0FFH ;置标志位
- SJMP KEY_OUT ;跳出
- PRESS_SEC:
- MOV R6,#00H ;第二次按key1跳出修改状态 (不闪烁)
-
- CJNE R5,#00H,MODIFY_OK ;如果计时停止,恢复计时
- SJMP KEY_OUT
- MODIFY_OK:
- SETB TR0 ;启动定时器
- SJMP KEY_OUT
- POSITION:
- CJNE R3,#KEY2,VALUE ;判断是否为key2,不是跳转
- CJNE R6,#0FFH,KEY_OUT ;若未进入修改状态,跳转
- INC R0 ;若进入修改状态,则移位
- CJNE R0,#33H,JJJ
- MOV R0,#30H
- JJJ:
- SJMP KEY_OUT
- VALUE:
- CJNE R3,#KEY3,KEY_OUT ;判断是否为key3,不是跳出
- CJNE R6,#0FFH,KEY_OUT ;判断是否进入修改状态,没有-跳出
- CLR TR0 ;若已进入,停止计时,准备修改
- MOV R5,#11H ;标记置位,表明计时停止
- CJNE R0,#32H,WWW
- MOV @R0,#00H
- SJMP KEY_OUT
- WWW:
- MOV A,@R0 ;在相应的位置加一
- ADD A,#01H
- DA A
- MOV @R0,A
- MOV A,R0
- CJNE A,#30H,SIXTY ;如果不是小时,加到60,
- CJNE @R0,#24H,KEY_OUT ;是小时,加到24
- MOV @R0,#00H
- SJMP KEY_OUT
- SIXTY:
- CJNE @R0,#60H,KEY_OUT
- MOV @R0,#00H
- SJMP KEY_OUT
- KEY_OUT:
- CJNE R6,#0FFH,NODIS ;如果已进入修改状态,进入闪烁显示状态
- LCALL FLASHON
- NODIS:
- LCALL SIREN ;调用报警程序
- AJMP MODIFY ;循环
- ;------------------------子程序-------------------------
- FLASHON:
- CJNE R0,#30H,JUMP31 ;如果指针指向小时,则小时位闪烁
- MOV R1,#26H
- MOV A,@R0
- MOV R7,A
- LCALL TORAM ;将小时的BCD码送到26H,27H
- MOV DPTR,#Z8279 ;闪烁
- MOV A,#86H
- MOVX @DPTR,A
- MOV DPTR,#D8279
- MOV A,#00H
- MOVX @DPTR,A
- MOV DPTR,#Z8279
- MOV A,#87H
- MOVX @DPTR,A
- MOV DPTR,#D8279
- MOV A,#00H
- MOVX @DPTR,A
- LCALL DELAY
- MOV DPTR,#Z8279 ;将小时的值显示出来
- MOV A,#86H
- MOVX @DPTR,A
- MOV DPTR,#D8279
- MOV A,26H
- MOVX @DPTR,A
- MOV DPTR,#Z8279 ;将小时的值显示出来
- MOV A,#87H
- MOVX @DPTR,A
- MOV DPTR,#D8279
- MOV A,27H
- MOVX @DPTR,A
- LCALL DELAY
- RET ;显示完毕,跳出
- JUMP31:
- CJNE R0,#31H,JUMP32 ;如果指针指向 分,则分钟的位置闪烁
- MOV R1,#23H
- MOV A,@R0
- MOV R7,A
- LCALL TORAM
- MOV DPTR,#Z8279
- MOV A,#83H
- MOVX @DPTR,A
- MOV DPTR,#D8279
- MOV A,#00H
- MOVX @DPTR,A
- MOV DPTR,#Z8279
- MOV A,#84H
- MOVX @DPTR,A
- MOV DPTR,#D8279
- MOV A,#00H
- MOVX @DPTR,A
- LCALL DELAY
-
- MOV DPTR,#Z8279
- MOV A,#83H
- MOVX @DPTR,A
- MOV DPTR,#D8279
- MOV A,23H
- MOVX @DPTR,A
- MOV DPTR,#Z8279
- MOV A,#84H
- MOVX @DPTR,A
- MOV DPTR,#D8279
- MOV A,24H
- MOVX @DPTR,A
- LCALL DELAY
- RET
- JUMP32:
- CJNE R0,#32H,QIUT ;如果指针指向秒,则秒位闪烁
- MOV R1,#20H
- MOV A,@R0
- MOV R7,A
- LCALL TORAM
- MOV DPTR,#Z8279
- MOV A,#80H
- MOVX @DPTR,A
- MOV DPTR,#D8279
- MOV A,#00H
- MOVX @DPTR,A
- MOV DPTR,#Z8279
- MOV A,#81H
- MOVX @DPTR,A
- MOV DPTR,#D8279
- MOV A,#00H
- MOVX @DPTR,A
- LCALL DELAY
-
- MOV DPTR,#Z8279
- MOV A,#80H
- MOVX @DPTR,A
- MOV DPTR,#D8279
- MOV A,20H
- MOVX @DPTR,A
- MOV DPTR,#Z8279
- MOV A,#81H
- MOVX @DPTR,A
- MOV DPTR,#D8279
- MOV A,21H
- MOVX @DPTR,A
- LCALL DELAY
- QIUT: RET
- SIREN:
- PUSH ACC
- MOV A,#00H ;读取时间t1,与现在时间比较,
- MOV DPTR,#TIMETABLE ;若相等,置报警位,输出报警信号
- MOVC A,@A+DPTR ;不等,跳转---比较表中的下一个时间
- CJNE A,30H,NEXT1
- MOV A,#01H
- MOV DPTR,#TIMETABLE
- MOVC A,@A+DPTR
- CJNE A,31H,NEXT1
- MOV A,#02H
- MOV DPTR,#TIMETABLE
- MOVC A,@A+DPTR
- CJNE A,32H,NEXT1
- MOV R4,#0FFH
- SETB P1.0 ;灯1亮2s,灯2灭
- POP ACC
- RET
- NEXT1: ;读取时间t2,与现在时间比较
- MOV A,#03H ;若相等,置报警位,输出报警信号
- MOV DPTR,#TIMETABLE ;不等,跳转---比较表中的下一个时间
- MOVC A,@A+DPTR
- CJNE A,30H,NEXT2
- MOV A,#04H
- MOV DPTR,#TIMETABLE
- MOVC A,@A+DPTR
- CJNE A,31H,NEXT2
- MOV A,#05H
- MOV DPTR,#TIMETABLE
- MOVC A,@A+DPTR
- CJNE A,32H,NEXT2
- MOV R4,#0FFH
- SETB P1.0 ;灯1亮2s,灯2亮
- SETB P1.1
- POP ACC
- RET
- NEXT2: ;;读取时间t3,与现在时间比较
- MOV A,#06H
- MOV DPTR,#TIMETABLE
- MOVC A,@A+DPTR
- CJNE A,30H,NEXT3
- MOV A,#07H
- MOV DPTR,#TIMETABLE
- MOVC A,@A+DPTR
- CJNE A,31H,NEXT3
- MOV A,#08H
- MOV DPTR,#TIMETABLE
- MOVC A,@A+DPTR
- CJNE A,32H,NEXT3
- MOV R4,#0FFH
- SETB P1.0 ;灯1亮2s,灯2灭
- CLR P1.1
- POP ACC
- RET
-
- NEXT3: ;读取时间t4,与现在时间比较
- MOV A,#09H ;若相等,置报警位,输出报警信号
- MOV DPTR,#TIMETABLE ;不等,跳转---比较表中的下一个时间
- MOVC A,@A+DPTR
- CJNE A,30H,NEXT4
- MOV A,#0AH
- MOV DPTR,#TIMETABLE
- MOVC A,@A+DPTR
- CJNE A,31H,NEXT4
- MOV A,#0BH
- MOV DPTR,#TIMETABLE
- MOVC A,@A+DPTR
- CJNE A,32H,NEXT4
- MOV R4,#0FFH
- SETB P1.0 ;灯1亮2s,灯2亮
- SETB P1.1
- POP ACC
- RET
- NEXT4: ;;读取时间t3,与现在时间比较
- MOV A,#0CH
- MOV DPTR,#TIMETABLE
- MOVC A,@A+DPTR
- CJNE A,30H,NEXT5
- MOV A,#0DH
- MOV DPTR,#TIMETABLE
- MOVC A,@A+DPTR
- CJNE A,31H,NEXT5
- MOV A,#0EH
- MOV DPTR,#TIMETABLE
- MOVC A,@A+DPTR
- CJNE A,32H,NEXT5
- MOV R4,#0FFH
- SETB P1.0
- CLR P1.1 ;灯1亮2s,灯2灭
- NEXT5:
- POP ACC
- RET
-
- INIT8279:
- PUSH ACC
- PUSH R2
- PUSH R1
- MOV R1,#20H
- MOV R2,#08H
- MOV DPTR,#Z8279
- MOV A,#LEDWRO
- MOVX @DPTR,A
- MOV DPTR,#D8279
- LOOP33: MOV A,@R1
- MOVX @DPTR,A
- INC R1
- DJNZ R2,LOOP33
- POP R1
- POP R2
- POP ACC
- RET
-
- DELAY: PUSH 00H
- PUSH 01H
- MOV R0,#00H
- DELAY1:MOV R1,#00H
- DJNZ R1,$
- DJNZ R0,DELAY1
- POP 01H
- POP 00H
- RET
-
- TORAM: PUSH ACC
- PUSH R3
- PUSH R4
- MOV A,R7
- MOV R3,A
- MOV R4,A
- MOV A,#0FH
- ANL A,R3
- MOV DPTR,#LEDSEG
- MOVC A,@A+DPTR
- MOV @R1,A
- INC R1
- MOV A,#0F0H
- ANL A,R4
- SWAP A
- MOV DPTR,#LEDSEG
- MOVC A,@A+DPTR
- MOV @R1,A
- POP R4
- POP R3
- POP ACC
- RET
- ;---------------------------------中断服务程序----------
- T0INT:
- MOV TH0,#4BH
- MOV TL0,#0FCH
- DJNZ R2,LOOP4
- MOV R2,#14H
- MOV A,32H ;加一
- ADD A,#01H
- DA A
- MOV 32H,A
- CJNE A,#60H,TRANS
- MOV 32H,#00H
- MOV A,31H
- ADD A,#01H
- DA A
- MOV 31H,A
- CJNE A,#60H,TRANS
- MOV 31H,#00H
- MOV A,30H
- ADD A,#01H
- DA A
- MOV 30H,A
- CJNE A,#24H,TRANS
- MOV 30H,#00H
-
- TRANS: ;拆分送入20H开始的数据段
- MOV R1,#20H
- MOV R7,32H
- LCALL TORAM
- MOV R1,#23H
- MOV R7,31H
- LCALL TORAM
- MOV R1,#26H
- MOV R7,30H
- LCALL TORAM
- ;CJNE R6,#00H,LOOP4
- LCALL INIT8279 ;显示
-
- CJNE R4,#00H,PPP ;如果无报警,灯灭
- CLR P1.0
- SJMP LOOP4
- PPP: INC R4 ;有报警,r4加一,计时
- LOOP4: RETI
- LEDSEG: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
- DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
- TIMETABLE: DB 08H,00H,00H
- DB 11H,30H,00H
- DB 12H,30H,00H
- DB 17H,00H,00H
- DB 17H,10H,00H
- END
复制代码
|