找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15715|回复: 0
收起左侧

51单片机跑马灯实验报告 分析与小结,思考题源码下载

[复制链接]
ID:437202 发表于 2018-12-1 16:22 | 显示全部楼层 |阅读模式
一、实验目的与要求
1.熟悉 Keil C51 集成环境软件的使用方法。
2.熟悉 MCS51 汇编指令,能自己编写简单的程序,控制硬件。
3.熟悉畅学开发平台,掌握单片机最小系统及 IO 口的简单控制及不同组 IO 口的特点。

二、实验内容
1、熟悉Keil C51集成环境软件的安装和使用方法。
2、照接线图编写程序,完善给出程序,实现以下功能。
要求LED灯实现从上到下依次点亮,再从下到上依次点亮。完成后实现从两侧向中间循环点亮,再从中间往外循环点亮。功能完成后循环上述过程。
3、观察实验结果,验证程序是否正确。

2.1  实验完成内容

1、延时实现LED流水灯效果,p1端口的八个灯作跑马灯。在本实验中,p1作为输出口,接8只发光二极管,编写程序,使发光二极管循环点亮。

本例实验主要用到了延时子程序,CLR、AJMP、RRC、RLC、CALL等指令,通过轮流点亮p0.0,….p0.7实现效果。

2、照接线图编写程序,完善给出程序,实现功能:LED灯实现从上往下依次点亮,在从下往上依次点亮。完成后实现从两侧到中间循环点亮,在从中间向外循环点亮。功能完成后循环上述过程。


2.2  芯片选型

STC12C5A60S2

2.3  电路原理图
2.4  关键资源说明(所应用单片机内部资源及外围接口芯片的核心说明)
畅学系列开发平台一套;
PC 机一台;
内部:累加器A,寄存器R4和进位标志位C以及外部外部I/O接口与P1口。

2.5  设计分析
为了实现跑马灯的效果,即:LED依次点亮(循环),就是要求从P1口: P1.0至P1.7依次输出低电平,当某引脚为低电平时,其余引脚都输出高电平。
从输出的数据分析:
第一个LED点亮时,对应的是P1.0的位为0,其余位为1,组合为一个二进制位从高到低为:1111 1110,即十六 进制数0xFE;同理,第二个LED点亮对应的数为:1111 1101,化为十六进制数为0xFD。 依次类推,逐次点亮LED所对应的数据为:1111 1110、1111 1101、1111 1011、1111 0111、 1110 1111、1101 1111、1011 1111、0111 1111。
规律:数据中的二进制数0的位置依次往左移动了一位。

2.6程序流程图


四、实验运行效果及说明
LED灯实现从上往下依次点亮,再从下往上依次点亮。完成后实现从两侧到中间循环点亮,在从中间向外循环点亮。


五、思考题1、循环间隔时间通过延时怎么控制?
答:通过延时程序可以控制循环间隔的时间,无论是C语言还是汇编,延时起到的作用都是不可或缺的。
Delay:
        MOV R0,#10        ;(1)
Delay1:
        MOV R1,#100      ;(1*10)
        DJNZ R1,$        ;(2*100*10)
        DJNZ R0,Delay1    ;(2*10)
        ret               ;(2)
total=1+1*10+2*100*10+2*10+2=2033
time=total*1/(focse/12)

void Delay(unsigned int uiCount)
{
              unsigned char j = 244;
              for(;uiCount > 0;uiCount--) while(--j);            
}


2、跑马灯模式如何实现间隔亮、多位同时亮等其他效果?
答:间隔亮可以利用子函数DELAY三重循环控制,多位同时亮可以给多位赋初值来体现。
ORG 0000H
              LJMP MAIN
ORG 0020H
MAIN:
              MOV R6,#07H
        MOV R7,#FEH ;1111 1110
LOOP1:
              MOV P1,R7     
              LCALL DELAY     
              MOV A,R7     
              RLC A      
              MOV R7,A     
              DJNZ R6,LOP1   
              MOV R6,#07H   
              MOV R7,#7FH ;0111 1111
LOOP2:
              MOV P1,R7   
              LCALL DELAY   
              MOV A,R7   
              RRC A     
              MOV R7,A   
              DJNZ R6,LOP2     
              LJMP MAIN
DELAY:
              MOV R3,#0FFH
LOOP3:
              MOV R4,#0FFH
LOOP4:
              NOP     
              DJNZ R4,LOP4     
              DJNZ R3,LOP3     
              RET     
END


六、实验分析与小结
通过汇编语言和C语言程序分别实现使八个跑马灯从上往下,在从下往上的循环亮灯,以及实现从中间到两边,在从两边到中间的循环亮灯。此次实验中,从开始的蜂窝鸣叫测试,到后续自己编写,烧录跑马灯程序,虽然过程因为开始的不懂原理有点绕路,到后来循序渐进,还是一个比较有趣的过程。将想法变为现实,与以往的设计软件不同,此次通过程序指令使得硬件实现自己想要的功能。让自己实打实的,眼看手做去实现,挺好的。

  1. 三、实验程序

  2. 汇编:

  3. ORG              0000H
  4.                             LJMP              START
  5. ORG               0100H
  6. START:
  7.                                           MOV                            A , #0FFH
  8.                                           CLR               C
  9.                                           MOV                            R4 , #08H
  10. LOOP1:
  11.                                           RRC                  A
  12.                                           MOV                  P1 , A
  13.                                           LCALL              DELAY
  14.                                           DJNZ              R4 ,LOOP1
  15.                                           MOV                  A , #0FFH
  16.                                           CLR                            C
  17.                                           MOV                            R4 , #08H
  18. LOOP2:
  19.                                           RLC                  A
  20.                                           MOV              P1 , A
  21.                                           LCALL              DELAY
  22.                                           DJNZ              R4 ,LOOP2
  23.                                           JMP                  START
  24.             
  25. DELAY:
  26.                                           MOV              R1 , #20H
  27. D0:            
  28. MOV              R2 , #00H
  29. D1:            
  30. MOV                            R3 , #00H
  31.                                           DJNZ              R3 , $
  32. DJNZ              R2 , D1
  33.                                           DJNZ              R1 , D0
  34.                                           RET
  35. END
  36. 从中间往两边依次点亮,再从两边往中间依次点亮
  37. ORG                            0000H
  38. LJMP START
  39. ORG   0100H
  40. START:
  41. MOV A,#0EFH
  42. MOV P1,A
  43. MOV R2,#08H
  44. LOOP1:
  45. MOV R6,A
  46. RRC A
  47. MOV P1,A
  48. LCALL DELAY
  49. MOV A,R6
  50. RLC R6
  51. MOV P1,A
  52. LCALL DELAY
  53. DJNZ R4,LOOP1
  54. MOV R4,#08H
  55. MOV A,#0EFH
  56. MOV P1,A
  57. MOV R4,#08H
  58. LOOP2:
  59. MOV A,#FEH
  60. MOV P1,A
  61. LCALL DELAY
  62. MOV R7,A
  63. MOV A,#07H
  64. MOV P1,A
  65. LCALL DELAY
  66. MOV A,R7
  67. RLC A
  68. MOV P1,A
  69. LCALL DELAY
  70. DJNZ R4,LOOP2
  71. CLR C
  72. JMP START
  73. DELAY:
  74. MOV R1,#20H
  75. D0:
  76. MOV R2,#00H
  77. D1:
  78. MOV R3,#00H
  79. DJNZ R3,$
  80. DJNZ R2,D1
  81. DJNZ R1,D0
  82. RET
  83. END

  84. C语言:

  85. #include <reg51.H>
  86. //延时函数,uiCount-延时参数,每加1增加0.5ms
  87. void Delay(unsigned int uiCount)
  88. {
  89.               unsigned char j = 244;
  90.               for(;uiCount > 0;uiCount--) while(--j);            
  91. }
  92. unsigned char code table[]={ 0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff,
  93. };
  94. void Delay(unsigned int);              //延时函数
  95. //主函数,控制LED
  96. void main(void)
  97. {
  98.                             unsigned char i;
  99.                             while(1)
  100.                             {
  101.                                           for(i=0;i<16;i++)   //依次点亮和熄灭8个LED
  102.                                           {
  103.                                                         P1=table[i];
  104.                                                         Delay(1000);
  105.                                           }
  106.                                           P1=0x7f;           //赋初始值
  107.                                           for(i=0;i<8;i++)   //循环右移点亮LED
  108.                                           {
  109.                                                         Delay(500);
  110.                                                         P1>>=1;
  111.                                                         P1=P1|0x80;     //右移后,最左端自动赋值0,把第7位置1
  112.                                           }
  113.                             }
  114. }
复制代码

完整的Word格式文档51黑下载地址:
跑马灯.docx (332.88 KB, 下载次数: 20)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表