资源描述
LED流水灯的设计姓名:孙亚容学号:班级:专业:电子信息工程班学院:物理电气信息工程学院课程设计题目:LED流水灯的设计一、设计目的1、熟练掌握单片机的编程思路及编程;2、熟练使用Keil uVision3软件和Proteus软件;4、熟悉单片机实验箱的使用;3、提高搜索资料、硬件动手和自学能力。二、设计要求设计一个LED流水灯,可以改变灯的变化方向和速度。三. 设计思路1、LED灯流速控制设计思路用两个灯点亮的时间差來控制流速,用延时的长短來启动下一个灯的点亮。 在方向控制子程序中判断速度控制键是否按下,如果按下,则表示速度快,否则 则表示慢速。2、LED灯流向控制设计思路设计灯状态表,当方向键按下,变量i循环八次对应相应tabl表中灯的状 态将灯点亮,否则循环八次相对应tab表中灯的状态将灯点亮。3、主程序设计思路主程序中先判断启动键是否按下,如果按下,在判断方向控制键是否按下, 如果按下则调用向左点亮灯的子程序,否则调用向右点亮灯的子程序。如果启动 键没有按下,则全部的灯都熄灭。四、设计流程图1、主程序2、子程序LED流水灯方向控制LED灯向左(右)慢速亮LED灯向左(右)快速亮五. 实验原理图C4XTAL1TA12POIYACO PQ.1/AD1PDAOZ PDAM PD.WAD* PDSADS PDAOG PD.TWOTITZ9CS1D23.4.?P2iy/eP2.V/G P2AO P2A11 P2.4/AC P2AO P2J&AUP2.?ASP3yRXD P3.1HXI P3WTO P3nrrrP3.W7D P3ST1P3ATO P3.7/KF六、实验程序/有按键控制的LED流水灯程序#include unsigned chai code tab=0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80; unsigned chai code tab 1 =0x80.0x40,0x20.0x 10,0x08.0x04,0x02.0x01; sbit dne=P3A2;定义端口 P3.2为方向控制sbit speed=P3A3;定义端口 P3.3为速度控制sbit stail=P3A4;定义端口 P3.4为启动控制void delay IQunsigned mt nail; fbi(n=0;n330;n+) fbr(m=0;m500;m-H-);void delay2Qunsigned mt n,m; foi(n=0;n330;n+)void led_ng()unsigned char 1; foi(i=0;i8;i-H-) if(speed=l)Pl=tabi;delay2(); elsePl=tabi; delay 1(); void led_lef()unsigned char 1; foi(i=0;i1XTAL1际cTEXlairrLEP-BirrXTA12P1DP1.1P12P13P1.P15P1J6 Pi.?PD.1/AM POAOZ PDAK3 PO.6 P22ZAC PZjTAII PZ.AIZ P2SAG P2J&AU P2.7W15pmimoP3.1HXD P33mi P3njH n八、硬件仿真结果将启动开关、速度控制开关和方向控制开关推上去(置高电平),将程序下 载到单片机实验箱中,点击运行,观察到流水灯快速从左向右依次点亮。将方向 控制开关扳下來,观察到流水灯快速从右向左依次点亮,此时扳下速度控制开关 键,则观察到LED灯慢速从右向左依次点亮,再扳下启动开关键,则灯全灭。九、设计总结经过软硬件仿真,设计程序无语法错误,实验结果正确,达到了设计要求, 说明设计程序正确。给相应功能键置高低电平实现了 LED灯的点亮速度和方向, 并且还设置了启动键。十、实验体会通过这次实验,学会了 LED编程思路,学到了一些编程技巧,提高了动手 能力以及处理问题的能力。这个实验的程序是自己编的,最开始对此实验没有一 点设计思路,感觉不知如何下手。后來静下心来看程序,分析实验要求,就慢慢 有了思路。知道了编程就是用最基础的思路设计,有时适当的变换一下思考方向 就可以了,比如,我们可以用延时的长短來控制速度,用查询的方式,表示输出 的状态。还有就是编程的一些技巧,比如编延时函数时可以编成无参数的,这样, 要修改延时时间可以直接在延时函数中修改,不用整个程序修改延时函数的参 数,尤其像本程序多次用了延时函数,就更推荐用此方法。由于程序中有儿个If 语句的陨套,所以对于没经验的我很容易就搞混了,经过不断的编译下载仿真, 最后终于解决了问题。但是现在看來,自己编的这个程序真的是一点技术含量都 没有,真不知道自己当时怎么就笨的竟然花了一天的时间待在实验室设计程序, 仿真实验。当然通过这次实验还发现了自己严重的不足,就是不会用定时、计数、中断 和数码管显示。通过学习,定时器还可以,但是计数和中断还是不会,如果这两 个知识点弄明白了,我想就可以自己编心率计的程序了,用定时器定单位时间, 从P3.2输入脉冲,计数脉冲个数,单位时间一到就输出显示输出脉冲数,只可 惜自己还不会用,希望通过日后的学习能够学会这几点知识。以后要多看些程序,培养编程思维模式,学习专业人士的经验,多编程序, 熟练编程,掌握编程技巧。卜一、附录修改程序使之成为不受开关控制键控制的LED流水灯的变化。八个LED先从 左向右依次点亮,再从两边向中间点亮,再从中间I旬两边点亮,最两边的灯亮完 后。再从右边向左边依次点亮。以下是修改后的程序:#include unsigned char code tab=0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80;unsigned char code tab!=0x80,0x40,0x20,0x10.0x08,0x04.0x02.0x01;unsigned char code tab2=0x81,0x42,0x24,0x18,0x24,0x42,0x81;void delay IQunsigned iiit n.m;fbr(n=0; n3 30 ;n+)fbr(m=0;m500;m-H-);void delay2Qunsigned mt njn;fbr(n=0 ;ii 今 3 0 ;n+) for(m=0;m 100;m+);void led_rig()unsigned chai i;for(i=0;i8;i+)Pl=tabli;delav20;void led_lef()unsigned chai i;for(i=0;i8;i+)Pl=tabli; delav20; void main() unsigned chai 1; wlule(l)ledJefQ;delay2();for(i=0;i7;i-H-)灯从两边向中间亮,再从中间向两边亮Pl=tab2i; delay 1(); delav2Q; led_ng(); delav2Q;for(i=0;i7;i-H-)Pl=tab2i; delay 1();
展开阅读全文