一、 实验要求
1.在单片机开发板上实现电子计数器。在CL3641AH数码管上显示当前技术,用按键K1,K2控制数字增减。
2.参考实验五附件中的电路图,实现数码管的片选和点亮、按键的轮询。
3.要求使用三个数码管LED1、LED2、LED3分别显示计数的个、十、百位。
4.按下K1,计数器加1,按下K2,计数器减1。长按则连续加减。
二、 实验设计
1.整体思路
该代码实现了一个简单的计数器功能,通过按键控制计数器的增减,并在数码管上显示计数结果。程序从ORG 0000H开始,首先在START处对三个存储单元40H、41H和42H进行初始化,将它们的值都设置为00H。然后进入MAIN程序段,在MAIN中主要是不断循环调用DisPlay子程序来显示当前的计数结果,并检测按键状态。当检测到按键按下时,根据按下的不同按键(P3.0或P3.1),分别调用Pkey0(对应P3.1按下,实现计数加)或Pkey1(对应P3.0按下,实现计数减)子程序进行相应的计数操作,并在操作完成后再次显示计数结果。
2.流程图
3.主要模块设计思路及分析
(1)显示模块(DisPlay子程序)
设计思路
该子程序的主要功能是将存储在40H、41H和42H单元中的计数值转换为对应的数码管显示段码,并输出到相应的数码管上进行显示。通过MOV DPTR,#Value将数据指针指向存储数码管段码的Value表,然后分别取出40H、41H和42H中的值作为索引,从Value表中获取对应的段码,并通过P0口输出到数码管上进行显示。同时,每次输出段码后调用D10ms子程序进行短暂延时,以确保数码管显示稳定。
分析
这种设计方式简单直接,通过一个查找表(Value)实现了数字到数码管显示段码的转换。但如果需要显示更多的字符或符号,可能需要扩展Value表的内容。同时,延时时间的长短(D10ms)会影响数码管显示的稳定性和视觉效果,如果延时时间过短,数码管可能会出现闪烁现象;如果延时时间过长,可能会导致按键响应不及时。
(2)按键检测与处理模块
设计思路
D10ms子程序用于按键消抖。当检测到按键按下时,首先调用D10ms子程序进行短暂延时(通过两层循环实现延时),然后再次检测按键状态,以避免因按键抖动而导致误判。
D1s子程序用于在某些操作(如计数增加或减少操作完成后)进行较长时间的等待,以确保用户能够看到操作结果。它通过多层循环实现了大约 1 秒的延时,在延时过程中也会不断检测按键状态,如果按键再次按下,则提前结束延时并进行相应处理。
分析
这种按键消抖和延时处理方式是常见的单片机编程技巧。D10ms的延时时间选择是为了避开按键抖动的时间范围,通常按键抖动时间在几毫秒到十几毫秒之间,所以选择10ms左右的延时可以有效消除抖动。D1s的延时时间则是根据需要让用户能够观察到操作结果而设定的,但如果在D1s延时过程中需要响应其他按键操作,可能需要进一步优化代码逻辑,例如增加更多的按键状态判断分支。
(3)按键功能处理(Pkey0和Pkey1子程序)
设计思路
Pkey0子程序对应P3.1按键按下的情况,实现计数增加功能。它首先调用DisPlay和D1s子程序,然后对40H单元中的值进行加 1 操作,如果40H的值达到0AH(对应十进制的 10),则将其重置为00H,并对41H单元的值进行加 1 操作,以此类推,实现三位计数器的进位功能。
Pkey1子程序对应P3.0按键按下的情况,实现计数减少功能。它与Pkey0类似,首先调用DisPlay和D1s子程序,然后对40H单元中的值进行减 1 操作,如果40H的值减到0FFH(对应十进制的 -1),则将其重置为09H,并对41H单元的值进行减 1 操作,同样实现三位计数器的退位功能。
分析
这种计数器的设计方式符合常见的十进制计数逻辑。通过对三个存储单元的操作实现了三位计数器的功能,并且考虑到了进位和退位的情况。但如果需要扩展计数器的位数,需要对代码进行较大幅度的修改,包括存储单元的使用、进位和退位逻辑的调整等。
三、 实现效果
四、总结
1. 在DisPlay子程序中,虽然每次输出段码后调用了D10ms延时来稳定显示,但由于在D1s延时子程序中也不断调用DisPlay,如果D1s延时时间过长,可能会导致数码管显示出现闪烁现象。因为在D1s延时过程中,频繁更新显示内容可能会干扰正常的显示稳定机制。
2. 深入理解了计数器的工作原理和实现方式,特别是十进制计数器的进位和退位逻辑。通过对内存单元(如40H、41H和42H)的操作来实现计数值的存储和更新,以及在计数增加(Pkey0)和减少(Pkey1)操作中处理进位和退位情况,这有助于提高对编程逻辑和算法的设计能力。
3. 掌握了两种不同时长延时子程序(D10ms和D1s)的设计方法,通过循环计数来实现精确的时间延迟。理解了延时在单片机程序中的重要性,例如用于按键消抖(D10ms)和在操作完成后给用户留出观察时间(D1s)等。同时,也了解到延时时间的选择需要根据实际情况进行调整,以平衡系统的响应速度和稳定性。