实习报告流水灯.docx
《实习报告流水灯.docx》由会员分享,可在线阅读,更多相关《实习报告流水灯.docx(11页珍藏版)》请在冰豆网上搜索。
实习报告流水灯
单片机流水彩灯设计
1、方案设计说明……………………………………………………………………2
(1)设计项目概述………………………………………………………………2
(2)设计项目功能及操作介绍…………………………………………………2
(3)方案设计思路………………………………………………………………2
2、硬件设计说明……………………………………………………………………3
(1)电路图………………………………………………………………………3
(2)I/O的分配…………………………………………………………………3
(3)电路工作原理………………………………………………………………4
(4)主要器件介绍………………………………………………………………4
3、软件设计说明……………………………………………………………………5
(1)软件设计概述………………………………………………………………5
1)设计思路………………………………………………………………5
2)总体功能………………………………………………………………6
3)程序流程图……………………………………………………………7
(2)程序总体结构及程序的执行与工作过程………………………………8
(3)重要程序段说明…………………………………………………………8
(4)程序清单…………………………………………………………………9
4、制作调试说明……………………………………………………………………13
(1)制作调试过程及结果……………………………………………………13
(2)所遇到的问题及解决方法………………………………………………13
5、总结………………………………………………………………………………14
1、方案设计说明
(1)设计项目概述
本次设计的题目是单片机流水彩灯设计通过综合掌握单片机编程的基本思想,以及中断,定时程序的基本编写方法。
利用单片机设计并制作流水彩灯。
该流水彩灯设置用一个AT89S51单片机来控制12LED灯产生不同的发光效果。
(2)设计项目功能及操作介绍
其中两个按键K1和K2,上电后,12个LED灯全亮;两个按键一个用于控制“流水灯”的启动和停止,另一个用于选择“流水”的花样。
其中流水灯花样有三种:
1)单个LED灯顺次点亮。
2)每两个LED灯顺次点亮然后再顺次返回。
3)从两端每三个LED灯顺向中间次点亮。
(3)方案设计思路
按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。
流水灯实际上就是一个带有12个发光二极管的单片机最小应用系统,即为由发光二极管、晶振、复位、电源等电路和必要的软件组成的单个单片机。
如果要让接在P0.0口的LED亮起来,那么只要把P0.0口的电平变为低电平就可以了;相反,如果要接在P0.0口的LED熄灭,就要把P0.0口的电平变为高电平;同理,接在其他接口上LED灯的点亮和熄灭的方法也如此。
因此,要实现流水灯功能,我们只要将发光二极管LED1~LED12依次点亮、熄灭,12只LED灯便会一亮一暗的做流水灯了。
在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。
2、硬件设计说明
(1)电路图
(2)I/O的分配
单片机40引脚接+5V的电源,12、13引脚接开关K1、K2,20引脚接地。
使用510Ω电阻和发光二极管组成12条支路,分别对应连接单片机的8个P0口、4个P2口共12个。
采用共阳极接法40段接上5V的外加电压,通过单片机的P0、P2口控制输出高电平还是低电平。
当电压为低电平的时候。
二极管发光。
该电路由2个30PF的电容和一个晶震组成的,其中晶振接在18和19引脚,这个作用是为单片机提供一个正常的工作时钟频率。
(3)电路工作原理
该流水灯实际上就是一个带有十二个发光二极管的单片机最小应用系统,即为由发光二极管、晶振、复位、电源等电路和必要的软件组成的单个单片机。
从原理图中可以看出,如果要让接在P0.0口的LED1亮起来,那么只要把P0.0口的电平变为低电平就可以了;相反,如果要接在P0.0口的LED1熄灭,就要把P0.0口的电平变为高电平;同理,接在P0.1~P0.7口与P2.4~P2.7的其他11个LED的点亮和熄灭的方法同LED1。
因此,要实现流水灯功能,我们只要将发光二极管LED1~LED12依次点亮、熄灭,12只LED灯便会一亮一暗形成“流水灯”。
(4)主要器件介绍
AT89S51单片机是美国ATMEL公司生产的低电压、高性能CMOS8位单片机,具有丰富的内部资源:
4kB闪存、128BRAM、32根I/O口线、2个16位定时/计数器、5个向量两级中断结构、2个全双工的串行口,具有4.25~5.50V的电压工作范围和0~24MHz工作频率,使用AT89S51单片机时无须外扩存储器。
在MCS-51芯片内部有一个高增益反相放大器,用于构成振荡器。
反相放大器的输入端为引脚XTAL1,输出端为引脚XTAL2,在芯片的外部通过这两个引脚跨接晶体振荡器和微调电容C1、C2形成反馈电路,可构成稳定的自激振荡器,振荡频率范围通常是1.2~12MHz。
晶体振荡频率高,则系统的时钟频率也高,单片机的运行速度也就快。
使用晶体振荡器时,C1、C2取值30±10pF。
C1、C2的取值虽然没有严格的要求,但电容的大小影响振荡电路的稳定性和快速性,通常取值20~30pF。
在这里我们取值30pF在设计印制电路板时,晶振和电容等应尽可能靠近芯片,以减少分布电容,保证振荡器振荡的稳定性。
3、软件设计说明
(1)软件设计概述
1)设计思路
单片机的应用系统由硬件和软件组成,在硬件原理图搭建完成上电之后,我们还不能看到流水灯循环点亮的现象,我们还需要编写程序控制单片机管脚电平的高低变化,来实现发光二极管的一亮一灭。
软件编程是单片机应用系统中一个重要的组成部分,我们编程实现流水灯的方法是循环移位法,即:
在程序一开始就给I/O口送一个数,这个数本身就是让这个I/O口先低,其他位为高,然后延时一段时间,再让这个数据向高位移动,然后再输出至I/O口,这样就实现流水效果,另外由于AT89S51系列单片机的指令中只有对累加器ACC中数据左移或右移的指令,所以我们应把需移动的数据先放到ACC中,让其移动,然后将ACC移动后的数据再转送到I/O口,这样也可以实现流水效果。
如果要让接在p0与p2口的发光二极管实现流水的效果,则是用程序改变p0与p2口的电平,由于我采用的为共阳极的接线方式,因此低电平为亮,高电平熄灭。
2)总体功能
这次程序总的要实现四个功能,通电后12个LED灯全亮;单个LED灯顺次点亮;每两个LED灯顺次点亮然后再顺次返回;从两端每三个LED灯顺次向中间点亮。
程序的主要功能是p3.2口的按钮为控制启动与停止,p3.3口的
按钮为切换三种“流水”的花样:
①会出现一个灯从上至下的循环亮灭,后又从下至上的循环亮灭回来;②会出现两个灯从上至下的循环亮灭,后又从下至上的循环亮灭回来;③在灯会产生上3个灯与最下面的三个灯亮到中间6个灯亮的情况;
3)程序流程图
未有键按下
有键按下
未有键按下
P3.2键按下
按下p3.3键
未有键按下
P3.2键按下
按下p3.3键按下p3.3键
未有键按下
P3.2键按下
(2)程序总体结构及程序的执行与工作过程
这个程序一共分为四个部分:
第一个是对下面需要用到的累加器、寄存器的定义;第二个是编写p3.2接口按钮功能,第三个则是编写p3.3接口按钮功能,而其中有三个花样:
第四个则是延时子程序。
其工作过程如下流程:
(3)重要程序段说明
JUMP1:
AJMPSTYLE1
AJMPSTYLE2
AJMPSTYLE3
CLR:
是将其后面指定的位清为0,程序中使对应端口输出低电平
ACALL:
是子程序调用指令,程序中调用了DELAY延时子程序
SETB:
是将其后面指定的位置成1,程序中使对应端口输出高电平
AJMP:
是无条件跳转指令,意思是:
跳转到指定的标号处继续运行
END:
是程序结束的伪指令,意思是告诉编译器,程序到此结束。
伪指令只告诉编译器此程序到此有何要求或条件,它不参与和影响程序的执行。
MOVP2,A
RRA
CALLDELAY
JBACC.4,LOOPBLS2;同样,当P2.4为0,即灯亮到P2.4处
在上面源程序中"ACALL DELAY"指令的作用是调用DELAY延时子程序。
一定要用该指令才能看到我们需要的"流水"效果。
如果不用该指令,则由于12个LED发光与熄灭的时间都很短,我们肉眼无法看到LED的熄灭与点亮,凭我们肉眼看到的是LED1~LED12都同时亮(半亮),而看不到“流水”效果的!
(4)程序清单
ORG0000H
AJMPMAIN
ORG0003H;外部中断0入口地址外部中断0连接控制流水灯暂停开始MOVDPTR,#JUMP0;储存转移地址基址
MOVA,R6;储存专一地址的变址,可根据基址+变址来执行开始暂停子JMP@A+DPTR;跳转到中断程序
ORG0013H;外部中断1入口地址
MOVDPTR,#JUMP1
MOVA,R7
JMP@A+DPTR
ORG0100H
MAIN:
MOVSP,#60H
CLRA
MOVR7,#00H
MOVR6,#00H
MOVP0,#00H;设置12个灯全亮
MOVP2,#00H
SETBEX0
SETBIT0
SETBEX1;设置外部中断0跟1,开中断
SETBIT1
SETBEA
SJMP$
ORG0200H
JUMP0:
;外部中断0的中断响应程序
SJMPSTART;跳转到控制流水灯开始的程序
SJMPSTOP;跳转到控制流水灯停止的程序
ORG0210H;实际开始程序地址
START:
MOVR6,#2H
LJMPSTYLE1;跳转到样式1开始流水
STOP:
;流水灯停止程序
MOVR6,#0H
MOVP0,#00H;12个灯全亮
MOVP2,#00H
CLREA;关总中断
JNBP3.2,$;等待下一次按键
JBP3.2,$
SETBEA;开总中断
CALLDELAY
MOVP0,#0H;12个灯全亮
MOVP2,#0H
RETI
ORG0400H;实际外部中断1程序地址
JUMP1:
AJMPSTYLE1;跳到方式1执行
AJMPSTYLE2
AJMPSTYLE3
;----------------------------------------
;第一种花样
ORG0500H
STYLE1:
MOVR7,#2H;R7储存控制花样地址通过基址+变址来控制花样
MOVP0,#0FFH;从12个灯全灭开始,一个一个亮
MOVP2,#0FFH
MOVA,#0FEH;单个LED
LOOPAS1:
MOVR0,#8
LOOPALS1:
MOVP0,A
RLA
CALLDELAY
DJNZR0,LOOPALS1
MOVP0,#0FFH;P0口8个灯流水完毕
;后4个灯~~~~(程序中为P2.4--P2.7,可修改)
MOVA,#7FH;单个LED
LOOPBS1:
MOVR0,#4H
LOOPBLS1:
MOVP2,A
RRA
CALLDELAY
DJNZR0,LOOPBLS1
MOVR1,#3
DJNZR1,STYLE1
MOVP2,#0FFH
RETI
;----------------------------------------
;第二种花样
STYLE2:
MOVR7,#4H
MOVP0,#0FFH;同样从12个灯熄灭然后开始第二种花样
MOVP2,#0FFH
LOOPAS2:
MOVA,#0FCH;两个LED
LOOPALS2:
MOVP0,A
RLA
CALLDELAY
JBACC.7,LOOPALS2;当P0.7为0,即亮到P0.7此处
CALLDELAY
MOVP0,#07FH
MOVP2,#7FH
CALLDELAY
MOVP0,#0FFH
;--------------------
MOVA,#3FH;两个LED
LOOPBLS2:
MOVP2,A
RRA;右移,打到流水目的后面的RL跟RR同理
CALLDELAY
JBACC.4,LOOPBLS2;同样,当P2.4为0,即灯亮到P2.4处
;--------------------
LOOPCRS2:
MOVP2,A
RLA
CALLDELAY
JBACC.7,LOOPCRS2
MOVP2,#3FH
CALLDELAY
MOVP2,#7FH
MOVP0,#7FH
CALLDELAY
MOVP2,#0FFH
;--------------------
MOVA,#3FH
LOOPDRS2:
MOVP0,A
RRA
CALLDELAY
JBACC.0,LOOPDRS2
;--------------------
MOVR1,#03H
DJNZR1,STYLE2;循环3次
RETI
;----------------------------------------
;第三种花样
STYLE3:
MOVR7,#0H
MOVP0,#0FFH
MOVP2,#0FFH
LOOPS3:
MOVA,#0F8H
MOVP0,A
MOVA,#8FH
MOVP2,A
CALLDELAY
MOVA,#7H
MOVP0,A
MOVA,#7FH
MOVP2,A
CALLDELAY
MOVR1,#5H
MOVP0,#0FFH
MOVP2,#0FFH
DJNZR1,LOOPS3
RETI
;----------------------------------------
;延时子程序
DELAY:
MOVR4,#2
L1:
MOVR2,#250
L2:
MOVR3,#250
L3:
DJNZR3,L3
DJNZR2,L2
DJNZR4,L1
RETI
END
4、制作调试说明
(1)制作调试过程及结果
启动Keil单片机集成开发环境,建立新工程,将上面的源程序导入到工程中,设置好Keil工程的编译参数,编译得到HEX格式的目标文件,用ISP编程器将HEX格式的目标文件烧写到AT89S51单片机中,接下来就是将烧写好的AT89S51从编程器上取下,放到我们焊接好的流水灯实验板上,通电,通过控制开关K1、K2我们就看到了LED1~LED12不同的"流水"效果了。
(2)所遇到的问题及解决方法
问题:
1)只有P0.0端口的一个灯亮;2)所有的灯一个都不亮或者全亮;3)LED灯没有循环或跳转
解决措施:
1)程序中循环跳转书写有误。
2)程序编写有误,看有没有初始值或者初始值设置错误。
3)延时程序太慢、程序中没有写入跳转。
5、总结
这次的任务分为两部分,一部分是硬件设计部分,另外一部分是软件编程部分。
在设计硬件电路的同时也必须先考虑好程序的设计。
因为程序是和电路挂钩的,不然的话就会出错。
这次的程序我感觉还是有点难度。
要实现中断,定时功能。
这次的流水灯设计还要求了复位。
同时还显示出流水彩灯的效果,不再是以前那种单一的效果。
我查阅了书上的资料,在程序上出错了好几次,第一次测试的时候出错了,不过后来认真的检查了程序,不知道的地方又请教了老师,每一步都到位。
最后终于找出了问题。
编程需要认真的态度,有时候一个细小的错误都可能导致系统不能运行。
最后我终于成功,对自己能再一次的战胜面前的困难有种高兴的感觉。
从这次实习中我巩固了所学的知识对所学的知识也有了很好的运用,重要的是锻炼了自己。
在今后的学习中我会继续努力,继续前进!
当然在这里还要感谢彭浩老师对我的指导!