1. 设计要求
基于 51 开发板,利用键盘作为按键输入,将数码管作为显示输出,实现电子秒表。
功能要求:
(1)计时精度达到百分之一秒;
(2)能按键记录下5次时间并通过按键回看
(3)设置时间,实现倒计时,时间到,数码管闪烁 10 次,并激发蜂鸣器,可通过按键解除。
2. 设计思路
实现过程:
代码实现了一个简单的单片机程序,其中包含了数字显示、按键检测、正/反倒计时、数据存储、按键判断、复位功能、显示控制和延时等基础功能。通过设置程序结构、定义变量和寄存器、使用标签以及相关指令,实现了LED灯阵列的数字显示、按键状态的检测、倒计时功能、数据存储、按键判断和跳转、系统复位、LED灯的显示控制以及延时等功能。整体而言,该代码是一个综合性的单片机程序,展现了在嵌入式系统中常见的基础操作和功能。
程序结构:
ORG 0000H: 设置程序的起始地址为0000H。
LJMP MAIN: 无条件跳转到MAIN标签,即程序的主入口。
ORG 0100H: 设置程序的代码段起始地址为0100H。
主要变量和寄存器说明:
R0, R1, R2, R3, R4, R5, R6, R7: 寄存器,用于临时存储数据。
A, B: 通用寄存器。
P0, P1, P2: 用于控制端口的寄存器。
SRC、DPTR: 数据指针寄存器。
数字显示:
使用SHOW和LLSHOW等标签,通过LED灯阵列实现数字的显示。
按键检测:
使用KEY2标签,通过检测键盘输入状态实现按键的检测,按键状态保存在A寄存器中。
倒计时功能:
使用COUNT和COUNT1等标签,实现了一个简单的倒计时功能。
使用LLLSHOW和LLLDARKSHOW标签,通过LED灯阵列实现了倒计时数字的显示和清除。
数据存储和保存:
使用SAVE和SAVE1等标签,实现了将数据存储到指定的内存位置。
数据存储的起始位置是由R1寄存器表示。
按键判断和跳转:
使用CHECK、CHECK1、WAIT等标签,根据按键的状态进行条件判断和跳转。
复位功能:
使用RESET标签,实现了系统的复位功能。
显示控制和延时:
使用SHOW、DARKSHOW、DELAY等标签,控制LED灯的显示和延时。
其他功能:
包括了一些与LED灯和按键相关的功能实现,如LED灯的控制、显示、清除等。
拓展功能——正计时和LED8x8点阵显示:
正计时:
基于倒计时的原理,拓展了一个功能上与之相反的正计时功能,从零开始计时,直到用户的设定值。
LED8x8点阵显示:
图 1 LED8x8点阵屏
使用LED8x8点阵屏显示个位数字和一些用户交互图形和动画(注意使用时需把黄色帽子扣在另外一边)
图 2 操作流程图
3. 实现效果
图 1开始界面
按下K4选择模式(正计时/倒计时)
图 2选择正计时模式
图 3选择倒计时模式
矩阵键盘选择起始值/终点值的十位和个位,并按下K2键确认
图 4选择十位
按下K1键开启程序
图 6倒计时
时间到按下K2解除蜂鸣器,并按下K3进行左查询或K4进行右查询时间记录
4. 总结
本程序结构清晰明了。起始地址被正确设置,通过跳转到主入口实现程序的顺利执行。采用ORG指令设置代码段起始地址,提高了程序的组织性。主要的寄存器和变量都经过详细说明,有助于他人理解和维护代码。
数字显示方面,通过LED灯阵列实现了显示功能,而按键检测则通过KEY2标签实现,按键状态存储在A寄存器中。倒计时功能的实现涉及COUNT和COUNT1标签,同时通过LLLSHOW和LLLDARKSHOW标签控制LED灯阵列进行数字的显示和清除。
数据的存储和保存方面,通过SAVE和SAVE1标签实现,存储的起始位置由R1寄存器表示。按键判断和跳转方面使用了CHECK、CHECK1、WAIT等标签,根据按键状态进行条件判断和跳转。复位功能通过RESET标签实现,确保系统可以在需要时进行重新初始化。
显示控制和延时通过SHOW、DARKSHOW、DELAY等标签实现,以控制LED灯的显示和延时。
此外,还包括一些与LED灯和按键相关的功能,如LED灯的控制、显示、清除等。拓展功能方面,实现了正计时功能,为用户提供了更多选择。此外,还涉及到LED8x8点阵显示,为课设增加了一些复杂性和趣味性。
在总体上,这个单片机课设考虑到了多个方面,包括基本功能、用户交互、数据存储和显示等,展现了一个完整而且有趣的设计。程序的模块化和注释使得代码易于理解和维护。在进一步的开发和测试中,我们也考虑到了一些边界条件和错误处理,以确保系统的稳定性和可靠性。
课程评价:
单片机课程为我们提供了深入了解嵌入式系统的机会,通过学习底层硬件、嵌入式编程和实际应用,培养了学生的系统设计和调试能力,同时强化了团队合作和问题解决的技能。这门课程对计算机工程专业学生具有重要意义。
5. 代码
ORG 0000H
LJMP MAIN
ORG 001BH //=======中断服务程序=======
MOV TL0,#0B0H
MOV TH0,#3CH
CPL P1.0
DJNZ R5,RETURN
CJNE R4,#10H,DONE
MOV R4,#0CH
DONE:
INC R4
MOV R5,#0AH
RETURN:
RETI
ORG 0100H //=============主程序==============
SRC DATA 60H ;定义SRC数据指针存放R0值
CLR F0
MAIN:
ACALL NULL
MOV R0,#20H //R0作为显示数据操作指针
MOV R1,#20H //目前的数据指针
LCALL INTERRUPT
MOV R4,#0DH
AJMP MODELCHECK
NULL: //清空上一次操作残留的数据
MOV R0,#2DH