• 山东大学单片机原理与应用实验 3.3 静态LED显示实验


    目录

    一、实验题目

    二、实验要求

    三、实验过程及结果记录

    四、实验流程

    五、实验源代码


    一、实验题目

    3.3 静态LED显示实验

    二、实验要求

    1、画出实验的流程图

    2、编写源程序并进行注释

    3、记录实验过程

    4、记录程序运行结果截图

    三、实验过程及结果记录

    按照思路搭建电路图1如下:

    图1:实验电路图

    7SEG2 为十位显示数码管,7SEG1 为个位显示数码管,KEY_LOAD:倒计时初值按钮,KEY_START:倒计时启动按钮

    功能:KEY_LOAD按钮被按下时,加载倒计时初值(10S);当按下KEY_START按钮时,开始倒计时,每过1S,计数器减1,直到见到“00”为止。减到“00”时,使P3.0引脚上的LED按10Hz频率进行闪烁,直到再次按下KEY_LOAD按钮,才重新加载初值,并熄灭LED;再次按下KEY_START按钮又一次开始倒计时,如此反复

    1. 使用Proteus搭建实验电路图如上,并将其保存为staticLED_self.DSN 文件。

    2. 编写控制源程序,将其保存为staticLED_self.asm。

    3. 程序编译:单击上方工具栏的source,然后build all,将asm文件编译成hex文件。将可执行文件hex写入芯片

    4. 执行仿真过程观察秒表程序功能是否正确。实验结果如下图所示:

    图2:装载初值并启动

    图3:减到00,LED灯闪烁

    四、实验流程

    实验流程图如下所示:

    图4:实验流程图

    1.确定两个锁存器的地址是0FE00H和0FD00H并添加两个显示数码管。按照要求将P1.0作为start的输入,P1.1作为load的输入。

    2.实验开始,判断P1.1口是否按下,则载入初值,并让两个数码管显示初值。

    3.判断P1.0是否按下,若是按下就开始执行计数;若是没有按下,便返回初始状态,等待P1.1按下。

    4.计数完成后,等待载入命令,若无,则停留的等待,若有,就开始下一轮循环。

    5.显示数码管的控制命令可以先将其写好,存在内存中,然后使用相对寻址对这段连续地址进行数据访问,赋给锁存器。将数码管的控制信号写在内存中,并且按照1到9的顺序存放。用两个内存单元存放十位与个位的数字,该数字也就对应控制信号表格中的偏移量。即数字为n的时候,偏移n进行查表,将n代表的控制信号交给数码管。

    6.开始先判断置数操作,调用初始化10的指令。将个位数字置0,十位数字置1,那么他在表格中的偏移分别是0和1,使用movc指令查表得到相应的控制信号,交给锁存器,也就是数码管。然后判断start信号,若有则开始执行计数,若没有则跳回开始,等待新的指令。当有start信号,则调用显示程序,进行数码显示。

    7.调用调整程序计数。将个位的数,即30H内存单元中对应的数减1,然后和-1比较,要是不等于-1,那就说明原来个位还没有到0,不对十位操作。若是为-1,说明原来个位到了0,那便把十位减1,并将个位置9。再比较十位,若是为-1,说明原来是0,那么表明计数器到了00,计数结束。

    8.执行完调整之后,先不改变显示,而是调用延时程序等待一段时间之后,在刷新数码管的显示。

    五、实验源代码

    1. ORG 0000H ; 在内存的0地址处就强制转到主程序上去,绕过中断程序 AJMP MAIN ; 无条件的转移到主程序
    2. ORG 0030H
    3. MAIN: ;定义主程序
    4. MOV SP,#60H ;设置栈指针
    5. CLR F0 ; 使用CLR位操作指令将PSW.6用户标志位清零
    6. SETB P3.0 ;设置LED端口,使LED灭
    7. LCALL INITIALIZE0 ; 调用子程序,显示为00
    8. LOOP: ; 定义循环
    9. JB P1.1,GOON ; 位操作指令,判断P1.1口值,若为0,则说明KEY_LOAD按键按下,继续执行下面的程序,否则就是没按下跳转至GOON ,判断是否有start命令
    10. WAIT0: LCALL INITIALIZE ;显示初值为10
    11. CLR F0 ;将用户标志位置零
    12. GOON: JB P1.0,LOOP ; 判断P1.0口值,若为0,则说明KEY_START按下,开始计时,否则便跳回开始重新判断P1.1
    13. NEXT1:
    14. LCALL DISPLAY ; 调用子程序DISPLAY
    15. LCALL DELAY1S ; 调用子程序DELAY1S
    16. LCALL ADJUST ; 调用调整子程序ADJUST
    17. JB F0,SHINING ;若计时器寄存器为0,则调用子程序SHINING,使其闪烁
    18. LJMP NEXT1 ; 当计数器不为零,则继续循环
    19. SHINING:
    20. CLR P3.0 ;将P3.0置零,点亮LED灯
    21. LCALL DELAY50MS ; 调用延时50MS子程序
    22. SETB P3.0 ; 将P3.01,此时LED灭
    23. LCALL DELAY50MS ; 调用延时50ms子程序
    24. JB P1.1,SHINING ; 判断KEY_LOAD是否按下
    25. SJMP WAIT0 ; 若按下,则跳转回开始
    26. DELAY50MS: ; 定义延时50MS子程序
    27. MOV R6,#100 ; 外层循环为100次
    28. DL: MOV R5,#250 ; 内层循环为250次
    29. DJNZ R5,$ ;两个时钟周期
    30. DJNZ R6,DL ; 两个时钟周期
    31. RET ;可计算得知共延时(1μs*2*250+2+1)*100+1=50.30ms
    32. DELAY1S:MOV R7,#10 ;延时1S子程序
    33. DL2:MOV R6,#200 ; 第二层循环200次
    34. DL1:MOV R5,#250 ; 第三层循环250次
    35. DJNZ R5,$ ;两个时钟周期
    36. DJNZ R6,DL1 ; 两个时钟周期
    37. DJNZ R7,DL2 ; 两个时钟周期
    38. RET ;可计算得知共延时((1μs*2*250+1+2)*200++2+1)*10+1=1s
    39. ADJUST:
    40. DEC 30H ; 个位减一
    41. MOV A,30H ; 比较个位,若个位不为-1,则返回
    42. CJNE A,#-1,GOTORET ;若个位为-1(原来为0),则置9
    43. MOV 30H,#9 ; 直接寻址操作,直接赋值9
    44. DEC 31H ; 十位减一
    45. MOV A,31H
    46. CJNE A,#-1,GOTORET ; 若十位不为-1,则返回
    47. SETB F0 ;若十位为-1,则说明为00,即计数结束。将计时器寄存器置1
    48. RET
    49. GOTORET:RET
    50. INITIALIZE0:
    51. MOV 30H,#0 ;初始化
    52. MOV 31H,#0
    53. CLR A
    54. MOV DPTR,#TABLE ;将表格的地址交给DPTR
    55. MOVC A,@A+DPTR ;访问片外ROM,所以用movc
    56. MOV DPTR,#0FE00H ;使DPTR指向锁存器
    57. MOVX @DPTR,A ;给锁存器进行赋值
    58. MOV A,#0 ; 清空
    59. MOV DPTR,#TABLE ;给内存器赋值0
    60. MOVC A,@A+DPTR ;将数据付给A寄存器
    61. MOV DPTR,#0FD00H ;给锁存器赋值
    62. MOVX @DPTR,A ;将数付给内存单元
    63. RET
    64. INITIALIZE: ;初始化显示为10子程序
    65. MOV 30H,#0 ;给内存地址30清零
    66. MOV 31H,#1 ;给内存地址31H置1
    67. CLR A
    68. MOV DPTR,#TABLE
    69. MOVC A,@A+DPTR
    70. MOV DPTR,#0FE00H
    71. MOVX @DPTR,A ;将控制信号送给锁存器
    72. MOV A,#1 ; 偏移地址加1,控制第二个数码管显示1
    73. MOV DPTR,#TABLE
    74. MOVC A,@A+DPTR
    75. MOV DPTR,#0FD00H
    76. MOVX @DPTR,A
    77. RET
    78. DISPLAY: ;刷新子程序
    79. MOV A,30H
    80. MOV DPTR,#TABLE ; 让DPTR指向表格首地址
    81. MOVC A,@A+DPTR ; 读取第一个数字
    82. MOV DPTR,#0FE00H ; 将该控制信号送给锁存器
    83. MOVX @DPTR,A
    84. MOV A,31H
    85. MOV DPTR,#TABLE
    86. MOVC A,@A+DPTR
    87. MOV DPTR,#0FD00H ; 读取控制信号送给锁存器
    88. MOVX @DPTR,A
    89. RET
    90. TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ; 定义表格,END

    初学单片机,可能存在错误之处,还请各位不吝赐教。

    受于文本原因,本文相关实验工程无法展示出来,现已将资源上传,可自行下载。

    山东大学单片机原理与应用实验3.3静态LED显示实验-单片机文档类资源-CSDN下载山东大学单片机原理与应用实验3.3静态LED显示实验详解博客地址:https://blog.c更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/m0_52316372/85916126

  • 相关阅读:
    20220725树状数组入门反思
    操作符的优先级、结合性、是否控制求值顺序【详解】
    oracle-sql语句解析类型
    基于SpringBoot的招聘信息管理系统
    python3 批量更新包,解决Specify --upgrade to force replacement
    AidAim Single File虚拟存档/备份库
    php实现排名和超过多少用户比率
    字节跳动Java实习面试题目大全
    SpringBoot整合POI实现Excel文件读写操作
    mysql 事务的实用小实例
  • 原文地址:https://blog.csdn.net/m0_52316372/article/details/125630307