找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 20797|回复: 4
打印 上一主题 下一主题
收起左侧

单片机32位心形流水灯课程设计报告与源码(word格式 可编辑)

  [复制链接]
跳转到指定楼层
楼主
ID:313389 发表于 2018-4-21 21:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  


课程设计说明书


         课程名称:       《单片机技术》     

         设计题目:       心形流水灯设计

         学    院:   电子信息与电气工程学院

         学生姓名:

         学    号:

         专业班级:

         指导教师:   

课程设计任务书

设计题目
心形流水灯设计
学生姓名

所在学院
电子信息与电气工程学院
专业、年级、班

设计要求:

  • 设计一个用单片机控制的的心形流水灯系统;
  • LED灯数量为32个;
  • 可以实现循环点亮、依次熄灭的基本功能;
  • 可以实现对角闪亮、间隔闪亮、顺时针闪亮、逆时针闪亮等多种功能。

学生应完成的任务:

完成心形流水灯电路设计,利用Keil软件编写程序,Proteus软件进行电路功能仿真,利用Altium Designer软件绘制电路原理图,设计制作电路的PCB板,对电路进行安装、调试,并提交课程设计报告。


工作计划:

4月20日—4月22日,拟定系统硬件方案;4月23—4月24日,完成系统软件设计;4月25日—4月26日,编写程序;4月27日—4月28日,烧录程序并制作系统硬件电路;4月29日—4月30日,书写课程设计报告并提交。

任务下达日期:        2015年4月20日
任务完成日期:        2015年4月30日

                               指导教师(签名):           学生(签名):

心形流水灯设计

摘  要:设计了一个心形流水灯电路,该电路可以实现32个LED灯循环闪亮、依次熄灭、对角闪亮、对角熄灭、间隔闪亮、间隔熄灭等多种功能。该电路主要由单片机芯片STC89C52、电源电路、时钟电路、复位电路和显示电路组成。利用Keil软件编写C语言程序,并生成目标代码Hex文件。使用Proteus软件设计仿真电路,并调入已编译好的目标代码,即可在仿真图中看到模拟实物的运行状态和过程。使用Altium Designer软件对电路进行原理图设计和PCB设计,并对该电路行安装和调试,调试结果可以实现流水灯的多种亮灭循环的功能。本人主要负责程序设计。











目录

1. 设计背景

1.1 流水灯在生活中的应用

1.2 单片机在生产及生活中的应用

2. 设计方案              1

2.1 方案对比

2.2  STC89C52芯片功能

2.3 方案论证              4

3. 方案实施

3.1 电路原理图设计

3.2 程序设计

3.3 电路功能仿真              10

3.4 电路PCB设计

3.5 安装与调试

4. 结果与结论

5. 收获与致谢

6. 参考文献

7. 附件

7.1 元器件清单

7.2 电路仿真图

7.3 电路原理图

7.4 PCB布线图

7.5 实物图

7.6 程序代码                        


1.设计背景

1.1 流水灯在生活中的应用

随着现代科学技术的持续进步和发展以及人们生活水平的不断提高,以大规模、超大规模集成电路为首的电子工艺技术的使用也越来越广泛,结合单片机技术设计的电子电路也层出不穷。 LED彩灯由于其丰富的灯光色彩、低廉的造价以及控制简单等特点而得到了广泛的应用,用彩灯来装饰街道和城市建筑物已经成为一种时尚。利用控制电路可使彩灯按一定的规律不断的改变状态,不仅可以获得良好的观赏效果,而且可以省电。

    彩灯的运用已经遍布于人们的生活中,从歌舞厅到卡拉OK包房,从节日的祝贺到日常生活中的点缀,这些不仅说明了我们对生活的要求有了质的飞跃,也说明科技在现实生活中的运用有了较大的发展。在这一设计中我们将运用单片机技术,与单片机芯片STC89C52的功能,对心形流水灯系统进行设计,来实现流水灯的多种亮与灭的循环,给人带来美感。

1.2单片机在生产及生活中的应用

单片微计算机自20世纪70年代问世以来,已对人类生活产生了巨大的影响。尤其是美国Intel公司生产的MCS-51系列单片机,由于其具有集成度高、可靠性强、系统结构简单、价格低廉、易于使用等优点,在世界范围内已经得到了广泛的普及和应用。也正是由于单片机的这些特点,它的出现是集成电路技术与微型计算机技术高速发展的产物,给工业自动化等领域带来了一场重大的革命。

单片机体积小,很容易嵌入到系统之中,以实现各种方式的检测、计算或控制,而一般的微型计算机无法做到。由于单片机本身就是一个微型计算机,因此只要在单片机的外部适当的增加一些必要的外围扩展电路,就可以灵活的构成各种应用系统,如工业自动检测监控系统、数据采集系统、自动控制系统、智能仪器仪表等。除此之外,单片机在家用电器中的应用也很普及,例如,洗衣机、电冰箱、空调机、电风扇、电视机、微波炉、加湿机、消毒柜等,在这些设备中嵌入了单片机之后,其功能和性能大大提高,并可实现智能化和最优化控制。

2.设计方案

2.1 方案对比

1、单片机芯片的比较与选择

单片机作为该电路的主要控制器芯片,即整个系统的控制核心部分,主要是负责控制LED灯的不同变化速度以及变化效果。因此对单片机芯片的选择,必须要求其功耗低、数据转换速率快。

方案一:采用STC89C52单片机。STC89C52单片机是一种低耗、可编程、高性能的8位微控制处理器,其内部包括微处理器、具有8K的系统可编程Flash存储器、 看门狗定时器、输入/输出口、中断系统等,其具有价格低廉、技术成熟、操作简单等特点,满足本系统的要求。

方案二:选择TI公司生产的MSP430F149系列单片机系统。此款单片机具有低电压、超低功耗的特点,工作电压在3.6-1.8V之间,具有强大的功能和高效的运算处理能力。

方案选择:由于STC89C52芯片价格便宜,支持在线下载程序而且MSP430F149系列单片机的功能已经远远高于我们本系统,操作不便。

    综合考虑,我们选择方案一。

2、LED灯控制方式的比较与选择

方案一:选用单片机I/O口一对一直接控制LED灯,正好控制32个LED灯。

方案二:采用74HC573锁存器控制LED灯,当运用两片74HC573锁存器就可以控制32个LED灯,只占用了单片机的10个I/O口,这样可以减少I/O口数量。

为了操作方便,减少复杂的步骤,我们采取方案一。

2.2  STC89C52芯片功能

STC89C52是STC公司生产的一种低功耗、高性能的微控制器,具有8K的系统可编程Flash存储器,其具有传统51单片机不具备的功能,在经典的MCS-51内核上做了很多的改进,使得STC89C52在处理嵌入式控制应用系统时更加高效、灵活。STC89C52具有以下标准功能:4个外部中断、全双工串行口、一个7向量4级中断结构、3个16位定时器/计数器、8K字节Flash、512字节RAM(随机存储器)、看门狗定时器,其12周期和6周期可以任意选择,其工作电压在3V~5.5V之间,工作频率在0~40MHZ,实际工作频率可达48MHZ。其管脚的封装图如图1所示。


图1  单片机管脚封装图

1、电源引脚

(1)VCC(38脚):芯片电源,接+5V;

(2)GND(16脚):接地端;

2、时钟引脚

(1)XTAL1(15脚):片内振荡器反相放大器和时钟发生器电路的输入端。当使用片内振荡器时,该引脚连接外部石英晶体和微调电容;当采用外接时钟源时,该引脚接外部时钟振荡器的信号。

(2)XTAL2(14脚):片内振荡器反相放大器的输出端。当使用片内振荡器时,该引脚连接外部石英晶体和微调电容;当采用外部时钟源时,该引脚悬空。
3、控制引脚
(1)ALE(27脚):用来锁存P0口送出的低8位地址

(2)PSEN(26脚:外部ROM读选通信号。
(3)RST(4脚):复位信号输入端。
(4)EA’/Vpp(29脚):内外ROM选择/片内EPROM编程电源。
4、并行I/O引线

(1)P0口:8位,漏极开路的双向I/O口。

当STC89C52扩展外部存储器及I/O接口芯片时,P0口作为地址总线(低8位)及数据总线的分时复用端口。P0口也可作为通用的I/O口使用,但需要上拉电阻,这时为准双向口。当作为通用的I/O输入时,应先向端口输出锁存器写入1,P0口可驱动8个TTL负载。

(2)P1口:8位,准双向I/O口,具有内部上拉电阻。

P1是专为用户使用的准双向I/O口。当作为通用的I/O口输入时,应先向端口锁存器输入1,P1口可驱动4个LS型TTL负载。

(3)P2口:8位,准双向I/O口,具有内部上拉电阻。

当STC89C52扩展外部存储器及I/O口时,P2作为高8位地址总线用,输出高8位地址。P2口也可作为普通的I/O口使用。当作为普通的I/O口使用时,应先向端口锁存器输入1,P1口可驱动4个LS型TTL负载。

(4)P3口:8位,准双向I/O口,具有内部上拉电阻。

P3口可作为普通的I/O口使用,当作为普通的I/O输入时,应先向端口输出锁存器输入1,P3口可驱动4个LS型TTL负载。P3 口还可提供第二功能,其第二功能定义见表1。

表1   P3 口第二功能定义表

引脚

第二功能

说明

P3.0

RXD

串行数据输入口

P3.1

TXD

串行数据输出口

P3.2

INT0’

外部中断0输入

P3.3

INT1’

外部中断1输入

P3.4

T0

定时器0外部计数输入

P3.5

T1

定时器1外部计数输入

P3.6

WR’

外部数据存储器写选通输入

P3.7

RD’

外部数据存储器读选通输入

      

(4)P4口:可实现位寻址。

2.3 方案论证

按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。STC89C52单片机是本次课程设计运用的主要元件。心形流水灯设计使用一个带有32个发光二极管的单片机最小应用系统,即为发光二极管、晶振、复位、电源等电路和必要的软件组成的单个单片机。如果要让接在P0、P1、P2、P3口的LED灯亮起来,只要将P0、P1、P2、P3口的电平变为低电平就可以了。因此,要实现流水灯功能,要将LED依次点亮、熄灭,32只LED灯便会一亮一暗做流水灯了。由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,在控制LED亮灭的时候应该延时一段时间,否则就看不到"流水"效果了。硬件设计框图如图2所示。



                                    图2  硬件设计框图

  • 方案实施

3.1 电路原理图设计

1、电源电路

本次课程设计,单片机正常工作要求输出电压为稳定的5V,输出电压能够适应所带负载的启动项能。并且电路还必须简单可靠,能够输出足够大的电流,但是不至于会烧坏元器件。我们采用USB取电,4.8V锂电池供电。电源电路如图所示,C1和C2起到滤波作用,R18和R19的作用是平衡电路中的电流,以免在只有1个LED灯亮时烧坏元器件。电源电路如图3所示。

图3  电源电路图

2、时钟电路

单片机内有一个由反相放大器所构成的振荡电路,XTAL1和XTAL2分别为振荡电路的输入端和输出端。在XTAL1和XTAL2引脚上外接石英晶体和微调电容构成并联振荡回路。晶振频率设置为11.0592MHZ,作用是产生时钟信号。单片机晶振提供的时钟频率越高,那么单片机运行速度就越快,单片接的一切指令的执行都是建立在单片机晶振提供的时钟频率。电容值为30pF,可以起到频率微调作用。时钟电路如图4所示。

图4  时钟电路图

3、复位电路

单片机RST接口为复位信号输入端,高电平有效。在该引脚上加上持续时间大于两个机器周期的高电平,就可以使单片机复位。在单片机正常工作时,此引脚应为小于或等于0.5V的低电平。复位电路接单片机RST端口,在RST输入端出现高电平时实现复位和初始化。复位电路如5所示。

图5  复位电路

4、显示电路

    单片机的P0口为8位的漏极开路的双向I/O口,当P0口作为普通的I/O口使用时,需要上拉电阻,这时为准双向口。P1 、P2、 P3 都为8位的准双向口,具有内部上拉电阻。图6为显示电路,单片机I/O口一对一直接控制LED灯,显示电路中的32个电阻既为上拉电阻,也起到电路分压作用,防止烧坏元器件。显示电路如图6 所示。

                                    图6  显示电路图

3.2 程序设计

  • Keil软件介绍

本次课程设计,我们采用Keil软件进行C语言编程。Keil软件是美国Keil Software公司开发的,它适合WindowsXP、Win7等系统,具有可视化操作界面,使用方便简单,并且支持C51语言、汇编语言以及两者混合编程等多种方式的单片机设计,KeilC51在兼容标准C语言的基础上,又增加了很多与51系列单片机硬件相关的编译特性,其生成的程序代码运行的速度快,所需的存储器空间小。

Keil软件已被完全集成到一个功能强大的全新环境中,该开发环境集成了文件编译处理、编译链接、项目管理、工具引用、和仿真软件模拟器等多种功能。Keil软件具有丰富的库函数,同时也带有功能强大的集成开发调试工具,可以自动识别所编写程序的语法错误,编译效率也很高, 能将源文件编译为二进制机器语言代码,其软件调试仿真功能也很强大,能通过单步、设置断点等功能让编程者了解CPU正在进行的程序,并能监控各变量以及各寄存器是否符合编程者的要求。

  • 程序编写

单片机的应用系统由硬件和软件组成,在硬件原理图搭建完成上电之后,暂时还不能看到流水灯循环点亮的现象,还需要编写程序控制单片机管脚电平的高低变化,来实现LED灯的各种亮灭功能。

先将P0、P1、P2、P3全部置1,即通入高电平,用16进制表示为0XFFH,则32个LED灯全部处于熄灭状态。然后给P0口赋值0X7FH,即只有P0.0处于低电平时,LED1灯点亮。使用延时函数delay,并设置延时时间为2秒,延时时间一到P0口的值就变为0X3FH,即P0.0和P0.1都为高电平,LED2也开始点亮,如此循环P0口控制的8个LED灯全部点亮,当高电平变为低电平时,LED灯熄灭。P1、P2、P3口控制的LED灯闪亮和熄灭原理同P0口一样,所以就可以看到LED灯的流水效果了。程序流程图如图7所示。


图7 程序设计流程图

  • 程序调试

    在程序设计好了之后,需要建立工程、写C源文件、连接工程、获得目标代码Hex文件,所以程序的调试就显得至关重要。刚开始程序总是编译出错,请教了老师之后才知道是程序的编写存在语法错误,我们就仔细阅读并检查所编写的程序,发现在给I/O 口的状态赋初值时,多加了一个分号,导致语法错误,编译不能正确通过。经过反复的检查、编译、调试,程序最终没有错误,可以将程序代码文件调入Proteus软件,进行电路功能仿真。

3.3 电路功能仿真

在各部分电路设计的基础上,按照总体电路图在Proteus上一一进行器件选择,并连接。将电路连接好后,为各个器件选择合适的参数,然后调入已编译好的目标代码Hex文件,启动仿真。根据LED灯是否发亮,判断所设计的电路是否可以实现32个LED灯依次点亮、依次熄灭、对角闪亮、对角熄灭、间隔闪亮、间隔熄灭等多种功能。刚开始时,LED灯不亮,仔细检查原来是将LED灯接反了,改正之后LED灯便可以正常发光了。电路仿真的结果为32个LED灯依次发亮、依次熄灭,并可以实现多种亮灭功能。根据仿真结果可知电路原理及程序无误,可以进行PCB设计。

3.4 电路PCB设计

    在原理图及仿真图设计成功的情况下,设置正确的PCB外形和尺寸,按照课程设计所给的要求,设置环境参数。接着向PCB文件中导入网络表及元件的封装等数据,然后设置工作参数。根据要求设置布线规则。在上述准备工作都完成就绪的情况下,对原件进行布局,使尽量少的线重叠,以减少布线时跳线的出现。

3.5 安装与调试

在安装时要考虑LED灯正负极有没有接反,所以安装前,请教了老师怎样辨认正负极。然后安装好所有的元件后,按照电路图逐一检查电路有没有漏焊的问题,接下来用万用表逐一检查有没有虚焊、线路断路或线路短路的问题。在线路没有问题的情况下连接电源调试,加入电源以后, 32个LED灯可以循环点亮、依次熄灭,可以达到预期的效果。

4. 结果与结论

在设计电路图的过程中,经过了多次分析和仿真验证,并结合所给的器件清单最后确定了需要哪些器件来实现电路的功能,并且保证了所需要的元器件在给出的清单范围内。经过Proteus软件多次仿真和修改后,在仿真电路图实现设计要求的前提下确定了最终的原理图。然后在Altium Designer中画出来所对应的原理图,再导入到PCB设计的环境中,进行PCB设计。在经过小组内多次讨论和听取指导老师的意见后确定了PCB的最终布局,布线完成后打印输出制成印刷电路板。将所有的元器件放到相应的封装位置,查无误后进行焊接。焊接完成,接入电源后,心形流水灯实现了32个LED灯依次点亮、依次熄灭,对角点亮、间隔点亮灯多种功能。电路能够正常工作,得到了老师的肯定。

    总体说来,电路布局合理,采用了模块化的布局方式即先布局各个功能模块,再将各个功能模块连接在一起组成最终的电路,但是电路还是存在一定的不合理之处,在布局合理美观方面存在一些冲突,由于布线太过宽松,整体尺寸稍大。

5. 获与致谢

经过为期两周的课程设计,我收获很多。在本次课程设计中,我们遇到了很多困难,比如电路图画错、编程出现错误、软件不会使用、元器件虚焊断焊以及焊错等。在这期间,我还是努力认真的去检查和修改,虽然这个过程非常艰难,但还是值得我回味的。在整个课程设计过程中,我查阅了相关书籍和文献资料,从中学习了一些单片机的工作原理以及怎样去设计一个电子电路,还参照了一些以前做过的课程设计。这次课程设计,加深了我对以前学过的课本知识的理解和认识,以前有些课本上的理论知识总是弄不懂,这次通过自己亲自动手去实践,很多问题就通俗易懂了。本次课程设计,真正提高了自己的各项能力,比如独立思考解决问题的能力,与人协作的能力,亲自动手实践的能力,真正的提高了自己的实践技能,培养了自己的创新能力,为今后完成更高质量的项目打下了基础。

这次我们能够顺利完成课程设计,是与老师们的辛勤劳动分不开的,所以在此,特别感谢课程设计辅导老师赵路华老师和单片机任课老师丁莹亮老师,感谢他们在设计中的耐心指导和提出的宝贵建议,同时也感谢小组搭档,和我共同度过这为期两周的课程设计。

6. 参考文献

[1] 林志琦.基于Proteus的单片机可视化软硬件仿真[M] .北京:北京航空航天大学出版社,2006.

[2] 何立民.MCS-51单片机应用系统设计[M] .北京:北京航空航天大学出版社,1990.

[3] 张毅刚.单片机原理及应用[M] .北京:高等教育出版社,2004.

[4] 谷树忠,刘文洲,姜航.Altium Designer教程-原理图、PCB设计与仿真.北京:电子工业出版社,2010.

[5] 张阳天,韩异凡.Protel DXP电路设计[M].北京:高等教育出版社,2005.

7. 附件

7.1 元器件清单

    元器件清单如表2所示。

元器件名称

型号规格

数量

备注

单片机

STC89C52

1

贴片

晶振

11.0592MHZ

1


电容

10uF

1

电解电容

30pF

2

瓷介电容

0.1uF

2


      电阻

100

36


10K

4


LED灯


32


USB接口


1



表2 元器件清单表

7.2 电路仿真图

    电路仿真图如图8所示。

图8  电路仿真图

7.3 电路原理图

    电路原理图如图9所示。

图9 电路原理图

7.4 PCB布线图

    PCB布线图如图10所示。

图10  PCB布线图

7.5 实物图

    实物图如图11所示。

图11 实物图

7.6 程序代码


单片机源程序如下:
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #define              uint unsigned int
  4. #define              uchar unsigned char
  5. uchar code table[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; // 逐个点亮0~7
  6. uchar code table1[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00}; // 逐个点亮7~0
  7. uchar code table2[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff}; // 逐个灭0~7
  8. uchar code table3[]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff}; // 逐个灭7~0
  9. void delay(uint t);              //延时
  10. void zg(uint t,uchar a);//两边逐个亮
  11. void qs(uint t,uchar a);//全部闪烁
  12. void zgxh(uint t,uchar a);  // 逆时针逐个点亮
  13. //void zgxh1(uint t,uchar a);  // 顺时针逐个点亮
  14. void djs(uint t,uchar a);  //对角闪
  15. void lbzgm(uint t,uchar a);//两边逐个灭
  16. //void sszgm(uint t,uchar a); // 顺时针逐个灭
  17. void nszgm(uint t,uchar a); // 逆时针逐个灭
  18. void sztl(uint t,uchar a);//顺时逐个同步亮
  19. void nztl(uint t,uchar a);//逆时逐个同步亮
  20. void sztm(uint t,uchar a);//顺时逐个同步灭
  21. void nztm(uint t,uchar a);//逆时逐个同步灭
  22. void hwzjl(uint t,uchar a); //横往中间亮
  23. void hwzjm(uint t,uchar a); //横往中间灭
  24. //void swzjl(uint t,uchar a); //竖往中间亮
  25. //void swzjm(uint t,uchar a); //竖往中间灭
  26. void nzdl(uint t,uchar a); //逆时逐段亮
  27. void nzdgl(uint t,uchar a);   //逆时逐段一个点亮
  28. void jgs(uint t,uchar a);   //间隔闪
  29. void zg(uint t,uchar a)//两边逐个亮
  30. {
  31.               uchar i,j;
  32.       for(j=0;j<a;j++)
  33.               {
  34.                               P0=P1=P2=P3=0xff;
  35.                               P0=0x7f;delay(t);
  36.                               for(i=0;i<7;i++)
  37.                               {
  38.                               P0=table1[i+1];
  39.                               P2=table1[i];
  40.                               delay(t);            
  41.                               }
  42.                               P2=0x00;P1=0xfe;
  43.                               delay(t);
  44.           for(i=0;i<7;i++)
  45.                               {
  46.                                             P1=table[i+1];
  47.                                           P3=table1[i];
  48.                                           delay(t);
  49.                               }
  50.                               P3=0x00;delay(t);
  51.                 }
  52. }
  53. void qs(uint t,uchar a)              //全部闪烁
  54. {
  55.               uchar j;
  56.               for(j=0;j<a;j++)
  57.               {
  58.                  P0=P1=P2=P3=0xff;
  59.                  delay(t);
  60.                  P0=P1=P2=P3=0x00;
  61.                  delay(t);
  62.               }               
  63. }
  64. void zgxh(uint t,uchar a)  // 逆时针逐个点亮
  65. {
  66.               uchar i,j;
  67.               for (j=0;j<a;j++)
  68.               {
  69.                             P0=P1=P2=P3=0xff;
  70.                             for (i=0;i<8;i++)
  71.                             {
  72.                                           P0=table1[i];
  73.                                           delay(t);
  74.                             }
  75.                             for(i=0;i<8;i++)
  76.                             {
  77.                                           P1=table[i];
  78.                                           delay(t);
  79.                             }
  80.                             for(i=0;i<8;i++)
  81.                             {
  82.                                           P3=table[i];
  83.                                           delay(t);
  84.                             }
  85.                             for(i=0;i<8;i++)
  86.                             {
  87.                                           P2=table[i];
  88.                                           delay(t);
  89.                             }
  90.               }
  91. }

  92. void nszgm(uint t,uchar a) // 逆时针逐个灭
  93. {
  94.               uchar i,j;
  95.               for(j=0;j<a;j++)
  96.               {
  97.                             P0=P1=P2=P3=0x00;
  98.                             for (i=0;i<8;i++)
  99.                             {
  100.                                           P0=table3[i];delay(t);            
  101.                             }
  102.                             for (i=0;i<8;i++)
  103.                             {
  104.                                           P1=table2[i];delay(t);            
  105.                             }
  106.                             for (i=0;i<8;i++)
  107.                             {
  108.                                           P3=table2[i];delay(t);            
  109.                             }
  110.                             for (i=0;i<8;i++)
  111.                             {
  112.                                           P2=table2[i];delay(t);            
  113.                             }
  114.               }
  115. }
  116. void zgxh1(uint t,uchar a)  // 顺时针逐个点亮
  117. {
  118.               uchar i,j;
  119.               for (j=0;j<a;j++)
  120.               {
  121.                             P0=P1=P2=P3=0xff;
  122.                             for (i=0;i<8;i++)
  123.                             {
  124.                                           P2=table1[i];
  125.                                           delay(t);
  126.                             }
  127.                             for(i=0;i<8;i++)
  128.                             {
  129.         P3=table1[i];
  130.                                           delay(t);
  131.                             }
  132.                             for(i=0;i<8;i++)
  133.                             {
  134.                                           P1=table1[i];
  135.                                           delay(t);
  136.                             }
  137.                             for(i=0;i<8;i++)
  138.                             {
  139.                                           P0=table[i];
  140.                                           delay(t);
  141.                             }
  142.               }
  143. }
  144. void sszgm(uint t,uchar a) // 顺时针逐个灭
  145. {
  146.               uchar i,j;
  147.               for(j=0;j<a;j++)
  148.               {
  149.                             P0=P1=P2=P3=0x00;
  150.                             for (i=0;i<8;i++)
  151.                             {
  152.                                           P2=table3[i];delay(t);            
  153.                             }
  154.                             for (i=0;i<8;i++)
  155.                             {
  156.                                           P3=table3[i];delay(t);            
  157.                             }
  158.                             for (i=0;i<8;i++)
  159.                             {
  160.                                           P1=table3[i];delay(t);            
  161.                             }
  162.                             for (i=0;i<8;i++)
  163.                             {
  164.                                           P0=table2[i];delay(t);            
  165.                             }
  166.               }
  167. }
  168. void djs(uint t,uchar a)  //对角闪
  169. {
  170.               uchar j;
  171.               for(j=0;j<a;j++)
  172.               {
  173.         P0=P1=P2=P3=0xff;
  174.                             P0=P3=0x00;
  175.                             delay(t);
  176.                             P0=P1=P2=P3=0xff;
  177.                             P1=P2=0x00;
  178.                             delay(t);
  179.               }
  180.             
  181. }
  182. void lbzgm(uint t,uchar a)//两边逐个灭
  183. {
  184.                 uchar i,j;
  185.                 for (j=0;j<a;j++)
  186.                 {
  187.                               P0=P2=0x00;
  188.                             P3=0x01;delay(t);
  189.                             for(i=7;i>1;i--)
  190.                             {
  191.                                           P1=table[i-1];P3=table1[i-2];
  192.                                           delay(t);
  193.                             }
  194.                             P1=0xfe;P3=0xff;delay(t);
  195.                             P1=0xff;P2=0x01;delay(t);
  196.                             for(i=7;i>1;i--)
  197.                             {
  198.                                           P0=table1[i-1];
  199.                                           P2=table1[i-2];
  200.                                           delay(t);
  201.                             }
  202.                             P0=0x7f;P2=0xff;delay(t);
  203.                             P0=0xff;delay(t);
  204.                 }
  205. }
  206. void sztl(uint t,uchar a)//顺时逐个同步亮
  207. {
  208.               uchar i,j;
  209.               for(j=0;j<a;j++)
  210.               {
  211.                             P0=P1=P2=P3=0xff;
  212.                             for(i=0;i<8;i++)
  213.                             {
  214.                                           P0=table[i];
  215. P1=P2=P3=table1[i];
  216.    delay(t);
  217.                             }
  218.               }
  219. }

  220. void nztl(uint t,uchar a)//逆时逐个同步亮
  221. {
  222.               uchar i,j;
  223.               for(j=0;j<a;j++)
  224.               {
  225.                             P0=P1=P2=P3=0xff;
  226.                             for(i=0;i<8;i++)
  227.                             {
  228.                                           P0=table1[i];
  229.                                           P1=P2=P3=table[i];
  230.                                           delay(t);
  231.                             }
  232.               }
  233. }
  234. void sztm(uint t,uchar a)//顺时逐个同步灭
  235. {
  236.               uchar i,j;
  237.               for(j=0;j<a;j++)
  238.               {
  239.                             P0=P1=P2=P3=0x00;
  240.                             for(i=0;i<8;i++)
  241.                             {
  242.                                           P0=table2[i];
  243.                                           P1=P2=P3=table3[i];
  244.                                           delay(t);
  245.                             }
  246.               }
  247. }
  248. void nztm(uint t,uchar a)//逆时逐个同步灭
  249. {
  250.               uchar i,j;
  251.               for(j=0;j<a;j++)
  252.               {
  253.                             P0=P1=P2=P3=0xff;
  254.                             for(i=0;i<8;i++)
  255.                             {
  256.                                           P0=table3[i];
  257. P1=P2=P3=table2[i];
  258. delay(t);
  259.                             }
  260.               }
  261. }
  262. void hwzjl(uint t,uchar a) //横往中间亮
  263. {
  264.               uchar i,j;
  265.               for (j=0;j<a;j++)
  266.               {
  267.                             P0=P1=P2=P3=0xff;
  268.                             for(i=0;i<8;i++)
  269.                             {
  270.                                           P0=P2=P1=table1[i];
  271.                                           P3=table[i];delay(t);            
  272.                             }
  273.               }
  274. }
  275. void hwzjm(uint t,uchar a) //横往中间灭
  276. {
  277.               uchar i,j;
  278.               for (j=0;j<a;j++)
  279.               {
  280.                             P0=P1=P2=P3=0x00;
  281.                             for(i=0;i<8;i++)
  282.                             {
  283.                                           P0=P2=P1=table3[i];
  284.                                           P3=table2[i];delay(t);            
  285.                             }
  286.               }
  287. }
  288. void swzjl(uint t,uchar a) //竖往中间亮
  289. {
  290.               uchar i,j;
  291.               for (j=0;j<a;j++)
  292.               {
  293.                             P0=P1=P2=P3=0xff;
  294.                             for(i=0;i<8;i++)
  295.                             {
  296.                                           P0=P2=P1=table[i];
  297.                                           P3=table1[i];delay(t);            
  298.                             }
  299.               }
  300. }
  301. void swzjm(uint t,uchar a) //竖往中间灭
  302. {
  303.               uchar i,j;
  304.               for (j=0;j<a;j++)
  305.               {
  306.                             P0=P1=P2=P3=0x00;
  307.                             for(i=0;i<8;i++)
  308.                             {
  309.                                           P0=P2=P1=table2[i];
  310.                                           P3=table3[i];delay(t);            
  311.                             }
  312.               }
  313. }
  314. void nzdl(uint t,uchar a) //逆时逐段亮
  315. {
  316.               uchar i,j;
  317.               for (j=0;j<a;j++)
  318.               {
  319.                             P0=P1=P2=P3=0xff;
  320.                             for(i=0;i<8;i++)
  321.                             {
  322.                                           P0=table1[i];
  323.                                           delay(t);
  324.                             }
  325.                             P0=0xff;
  326.                             for(i=0;i<8;i++)
  327.                             {
  328.                                           P1=table[i];
  329.                                           delay(t);
  330.                             }
  331.                             P1=0xff;
  332.                             for(i=0;i<8;i++)
  333.                             {
  334.                                           P3=table[i];
  335.                                           delay(t);
  336.                             }
  337.                             P3=0xff;
  338.                             for(i=0;i<8;i++)
  339.                             {
  340.                                           P2=table[i];
  341.                                           delay(t);
  342.                             }
  343.                             P2=0xff;                           
  344.               }
  345. }
  346. void nzdgl(uint t,uchar a)   //逆时逐段一个点亮
  347. {
  348.               uchar i,j,k,l;
  349.               for (j=0;j<a;j++)
  350.               {
  351.                             k=table1[0];
  352.                             P0=k;l=table[0];
  353.                             P1=P2=P3=l;delay(t);
  354.                             for(i=0;i<8;i++)
  355.                             {
  356.                                           k=_crol_(k,-1);
  357.                                           P0=k;
  358.                                           l=_crol_(l,1);
  359.                                           P1=P2=P3=l;
  360.                                           delay(t);
  361.                             }
  362.               }
  363. }
  364. void jgs(uint t,uchar a)   //间隔闪
  365. {
  366.               uchar j;
  367.               for (j=0;j<a;j++)
  368.               {
  369.                             P0=0x55;P1=P2=P3=0xaa;
  370.                             delay(t);
  371.                             P0=0xaa;P1=P2=P3=0x55;
  372.                             delay(t);            
  373.               }
  374. }
  375. void main()
  376. {
  377.               uchar i;

  378.               while(1)
  379.               {
  380.               zg(100,1);                                          //两边逐个亮
  381.               lbzgm(100,1);                            //两边逐个灭
  382.               jgs(300,10);
  383.               djs(100,20);  //对角闪
  384.               P1=P2=P3=0xff;
  385.               for(i=0;i<3;i++)
  386.               {
  387.               P0=0x00;delay(800);
  388.               P0=0xff;delay(800);
  389.               }
  390.               P0=0x00;
  391.               for(i=0;i<3;i++)
  392.               {
  393.               P1=0x00;delay(800);
  394.               P1=0xff;delay(800);
  395.               }
  396.               P1=0x00;
  397.               for(i=0;i<3;i++)
  398.               {
  399.               P3=0x00;delay(800);
  400.               P3=0xff;delay(800);
  401.               }
  402.               P3=0x00;
  403.               for(i=0;i<3;i++)
  404.               {
  405.               P2=0x00;delay(800);
  406.               P2=0xff;delay(800);
  407.               }
  408.               qs(500,3);
  409.               for(i=0;i<6;i++)
  410.               {
  411.               zgxh(50,1);
  412.               nszgm(50,1);
  413.               }
  414.               djs(100,20);  //对角闪
  415.               for(i=0;i<3;i++)
  416.               {
  417.               zg(100,1);                                          //两边逐个亮
  418.               lbzgm(100,1);                            //两边逐个灭
  419.               }
  420.               qs(200,10);djs(100,50);
  421.               for(i=0;i<5;i++)
  422.               {
  423.                             sztl(200,1); //顺时逐个同步亮
  424.                             nztm(200,1);
  425.                             nztl(200,1);
  426.                             sztm(200,1); //顺时逐个同步灭
  427.               }
  428.               djs(300,10);  //对角闪
  429.               nzdgl(300,10);   //逆时逐段一个点亮
  430.               jgs(300,10);   //间隔闪
  431.               for(i=0;i<3;i++)
  432.               {
  433.               zgxh(100,1);
  434.               nszgm(100,1);
  435.               }
  436.               for(i=0;i<5;i++)
  437.               {
  438.               zgxh1(100,1);
  439.               sszgm(100,1);
  440.               }
  441.    nzdl(200,3); //逆时逐段亮
  442.    jgs(50,100);   //间隔闪
  443.               P0=P1=P2=P3=0xff;
  444.               for (i=0;i<8;i++)
  445.               {
  446.                             P0=table1[i];
  447.                             delay(200);
  448.               }
  449.               for (i=0;i<8;i++)
  450.               {
  451.                             P1=table[i];
  452.                             delay(200);
  453.               }
  454.               for(i=0;i<3;i++)
  455.               {
  456.                             P0=P1=0x00;delay(200);
  457.                             P0=P1=0xff;delay(200);
  458.               }

  459.               for (i=0;i<8;i++)
  460.               {
  461.                             P2=table1[i];
  462.                             delay(200);
  463.               }
  464.               for (i=0;i<8;i++)
  465.               {
  466.                             P3=table1[i];
  467.                             delay(200);
  468.               }
  469.               for(i=0;i<3;i++)
  470.               {
  471.                             P2=P3=0x00;delay(200);
  472.                             P2=P3=0xff;delay(200);
  473.               }            
  474.               nzdgl(50,40);   //逆时逐段一个点亮
  475.               for(i=0;i<4;i++)
  476.               {
  477.               zg(100,1);qs(100,10);
  478.               lbzgm(100,1);
  479. ……………………

  480. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
心形流水灯设计报告.doc (560.54 KB, 下载次数: 104)


评分

参与人数 3黑币 +13 收起 理由
stu + 3 共享资料的黑币奖励!
ASDFG3 + 5 赞一个!
南风木木 + 5 赞一个!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶7 踩
回复

使用道具 举报

沙发
ID:314732 发表于 2018-4-23 20:34 | 只看该作者
很厉害 想顶一下
回复

使用道具 举报

板凳
ID:353235 发表于 2018-7-1 01:53 来自手机 | 只看该作者
不错可以把原理图和程序发给我吗?邮箱:1298714905@qq.com
回复

使用道具 举报

地板
ID:112406 发表于 2018-11-10 12:13 | 只看该作者
很实用的教程
回复

使用道具 举报

5#
ID:772069 发表于 2020-6-7 18:15 | 只看该作者
赞一个
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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