心形流水灯课程设计.doc
如有侵权,请联系网站删除,仅供学习与交流心形流水灯课程设计【精品文档】第 16 页心形流水灯设计摘 要本课题是利用STC89C52设计了一个心形流水灯电路,该电路可以实现32个LED灯循环闪亮、依次熄灭、对角闪亮、对角熄灭、间隔闪亮、间隔熄灭等多种功能。该电路主要由单片机芯片STC89C52、电源电路、时钟电路、复位电路和显示电路组成。利用Keil软件编写C语言程序,并生成目标代码Hex文件。使用Proteus软件设计仿真电路,并调入已编译好的目标代码,即可在仿真图中看到模拟实物的运行状态和过程。使用Altium Designer软件对电路进行原理图设计和PCB设计,并对该电路行安装和调试,调试结果可以实现流水灯的多种亮灭循环的功能。关键词:AT89C52,复位电路,时钟电路,发光二极管 目 录1 绪论1.1 课题描述 随着现代科学技术的持续进步和发展以及人们生活水平的不断提高,以大规模、超大规模集成电路为首的电子工艺技术的使用也越来越广泛,结合单片机技术设计的电子电路也层出不穷。 LED彩灯由于其丰富的灯光色彩、低廉的造价以及控制简单等特点而得到了广泛的应用,用彩灯来装饰街道和城市建筑物已经成为一种时尚。利用控制电路可使彩灯按一定的规律不断的改变状态,不仅可以获得良好的观赏效果,而且可以省电。 彩灯的运用已经遍布于人们的生活中,从歌舞厅到卡拉OK包房,从节日的祝贺到日常生活中的点缀,这些不仅说明了我们对生活的要求有了质的飞跃,也说明科技在现实生活中的运用有了较大的发展。在这一设计中我们将运用单片机技术,与单片机芯片STC89C52的功能,对心形流水灯系统进行设计,来实现流水灯的多种亮与灭的循环,给人带来美感1。1.2 基本工作原理及框图本课程设计的XX系统原理如图1所示。电源电路 AT89C52 显示电路时钟电路复位电路图1 基本工作原理框图2 相关芯片及硬件电路设计2.1 AT89C52芯片图2 AT89C52引脚图2.1.1 AT89C52的功能特性STC89C52是STC公司生产的一种低功耗、高性能的微控制器,具有8K的系统可编程Flash存储器,其具有传统51单片机不具备的功能,在经典的MCS-51内核上做了很多的改进,使得STC89C52在处理嵌入式控制应用系统时更加高效、灵活。STC89C52具有以下标准功能:4个外部中断、全双工串行口、一个7向量4级中断结构、3个16位定时器/计数器、8K字节Flash、512字节RAM(随机存储器)、看门狗定时器,其12周期和6周期可以任意选择,其工作电压在3V5.5V之间,工作频率在040MHZ,实际工作频率可达48MHZ2。其管脚的封装图如图2所示。2.1.2 AT89C52的主要性能参数AT89C52主要性能参数如下:l 与MC51产品指令系统完全兼容l VCC(38脚):芯片电源,接+5Vl GND(16脚):接地端l XTAL1(15脚):片内振荡器反相放大器和时钟发生器电路的输入端。当使用片内振荡器时,该引脚连接外部石英晶体和微调电容;当采用外接时钟源时,该引脚接外部时钟振荡器的信号 l XTAL2(14脚):片内振荡器反相放大器的输出端。当使用片内振荡器时,该引脚连接外部石英晶体和微调电容;当采用外部时钟源时,该引脚悬空l ALE(27脚):用来锁存P0口送出的低8位地址l PSEN(26脚:外部ROM读选通信号l RST(4脚):复位信号输入端l EA/Vpp(29脚):内外ROM选择/片内EPROM编程电源l P0口:8位,漏极开路的双向I/O口l P1口:8位,准双向I/O口,具有内部上拉电阻l P2口:8位,准双向I/O口,具有内部上拉电阻l P3口:8位,准双向I/O口,具有内部上拉电阻2.2 时钟电路单片机内有一个由反相放大器所构成的振荡电路,XTAL1和XTAL2分别为振荡电路的输入端和输出端。在XTAL1和XTAL2引脚上外接石英晶体和微调电容构成并联振荡回路。晶振频率设置为11.0592MHZ,作用是产生时钟信号。单片机晶振提供的时钟频率越高,那么单片机运行速度就越快,单片接的一切指令的执行都是建立在单片机晶振提供的时钟频率。电容值为30pF,可以起到频率微调作用3。时钟电路如图3所示。图3 时钟电路图2.3 复位电路单片机RST接口为复位信号输入端,高电平有效。在该引脚上加上持续时间大于两个机器周期的高电平,就可以使单片机复位。在单片机正常工作时,此引脚应为小于或等于0.5V的低电平。复位电路接单片机RST端口,在RST输入端出现高电平时实现复位和初始化4。复位电路如4所示。图4 复位电路2.4 显示电路单片机的P0口为8位的漏极开路的双向I/O口,当P0口作为普通的I/O口使用时,需要上拉电阻,这时为准双向口。P1 、P2、 P3 都为8位的准双向口,具有内部上拉电阻。图5为显示电路,单片机I/O口一对一直接控制LED灯,显示电路中的32个电阻既为上拉电阻,也起到电路分压作用,防止烧坏元器件5。显示电路如图5 所示 图5 显示电路图2.6 总原理图设计总结时钟电路、复位电路、以及显示电路,把其放入一个电路。得到总体的电路。总体电路如图6所示。图6 电路原理图3 系统软件设计3.1 程序主要流程单片机的应用系统由硬件和软件组成,在硬件原理图搭建完成上电之后,暂时还不能看到流水灯循环点亮的现象,还需要编写程序控制单片机管脚电平的高低变化,来实现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灯的流水效果了6。程序流程图如图7所示,开始读取I/O口状态判断I/O口状态 低电平 高电平 LED灯点亮LED灯熄灭 延时 灯流动运行 结束 图7 程序设计流程图3.2 程序设计#include<reg52.h>#include <intrins.h>#defineuint unsigned int#defineuchar unsigned charuchar code table=0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00; / 逐个点亮07uchar code table1=0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00; / 逐个点亮70uchar code table2=0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff; / 逐个灭07uchar code table3=0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff; / 逐个灭70void delay(uint t);/延时void zg(uint t,uchar a);/两边逐个亮void qs(uint t,uchar a);/全部闪烁void zgxh(uint t,uchar a); / 逆时针逐个点亮/void zgxh1(uint t,uchar a); / 顺时针逐个点亮void djs(uint t,uchar a); /对角闪void lbzgm(uint t,uchar a);/两边逐个灭/void sszgm(uint t,uchar a); / 顺时针逐个灭void nszgm(uint t,uchar a); / 逆时针逐个灭void sztl(uint t,uchar a);/顺时逐个同步亮void nztl(uint t,uchar a);/逆时逐个同步亮void sztm(uint t,uchar a);/顺时逐个同步灭void nztm(uint t,uchar a);/逆时逐个同步灭void hwzjl(uint t,uchar a); /横往中间亮void hwzjm(uint t,uchar a); /横往中间灭/void swzjl(uint t,uchar a); /竖往中间亮/void swzjm(uint t,uchar a); /竖往中间灭void nzdl(uint t,uchar a); /逆时逐段亮void nzdgl(uint t,uchar a); /逆时逐段一个点亮void jgs(uint t,uchar a); /间隔闪void zg(uint t,uchar a)/两边逐个亮uchar i,j; for(j=0;j<a;j+) P0=P1=P2=P3=0xff; P0=0x7f;delay(t); for(i=0;i<7;i+) P0=table1i+1; P2=table1i; delay(t); P2=0x00;P1=0xfe; delay(t); for(i=0;i<7;i+) P1=tablei+1;P3=table1i;delay(t); P3=0x00;delay(t);void qs(uint t,uchar a) /全部闪烁uchar j;for(j=0;j<a;j+) P0=P1=P2=P3=0xff; delay(t); P0=P1=P2=P3=0x00; delay(t); void zgxh(uint t,uchar a) / 逆时针逐个点亮uchar i,j;for (j=0;j<a;j+)P0=P1=P2=P3=0xff;for (i=0;i<8;i+)P0=table1i;delay(t);for(i=0;i<8;i+)P1=tablei;delay(t);for(i=0;i<8;i+)P3=tablei;delay(t);for(i=0;i<8;i+)P2=tablei;delay(t);void nszgm(uint t,uchar a) / 逆时针逐个灭uchar i,j;for(j=0;j<a;j+)P0=P1=P2=P3=0x00;for (i=0;i<8;i+)P0=table3i;delay(t);for (i=0;i<8;i+)P1=table2i;delay(t);for (i=0;i<8;i+)P3=table2i;delay(t);for (i=0;i<8;i+)P2=table2i;delay(t);void zgxh1(uint t,uchar a) / 顺时针逐个点亮uchar i,j;for (j=0;j<a;j+)P0=P1=P2=P3=0xff;for (i=0;i<8;i+)P2=table1i;delay(t);for(i=0;i<8;i+) P3=table1i;delay(t);for(i=0;i<8;i+)P1=table1i;delay(t);for(i=0;i<8;i+)P0=tablei;delay(t);void sszgm(uint t,uchar a) / 顺时针逐个灭uchar i,j;for(j=0;j<a;j+)P0=P1=P2=P3=0x00;for (i=0;i<8;i+)P2=table3i;delay(t);for (i=0;i<8;i+)P3=table3i;delay(t);for (i=0;i<8;i+)P1=table3i;delay(t);for (i=0;i<8;i+)P0=table2i;delay(t);void djs(uint t,uchar a) /对角闪uchar j;for(j=0;j<a;j+) P0=P1=P2=P3=0xff;P0=P3=0x00;delay(t);P0=P1=P2=P3=0xff;P1=P2=0x00;delay(t);void lbzgm(uint t,uchar a)/两边逐个灭 uchar i,j; for (j=0;j<a;j+) P0=P2=0x00;P3=0x01;delay(t);for(i=7;i>1;i-)P1=tablei-1;P3=table1i-2;delay(t);P1=0xfe;P3=0xff;delay(t);P1=0xff;P2=0x01;delay(t);for(i=7;i>1;i-)P0=table1i-1;P2=table1i-2;delay(t);P0=0x7f;P2=0xff;delay(t);P0=0xff;delay(t);void sztl(uint t,uchar a)/顺时逐个同步亮uchar i,j;for(j=0;j<a;j+)P0=P1=P2=P3=0xff;for(i=0;i<8;i+)P0=tablei;P1=P2=P3=table1i; delay(t);void nztl(uint t,uchar a)/逆时逐个同步亮uchar i,j;for(j=0;j<a;j+)P0=P1=P2=P3=0xff;for(i=0;i<8;i+)P0=table1i;P1=P2=P3=tablei;delay(t);void sztm(uint t,uchar a)/顺时逐个同步灭uchar i,j;for(j=0;j<a;j+)P0=P1=P2=P3=0x00;for(i=0;i<8;i+)P0=table2i;P1=P2=P3=table3i;delay(t);void nztm(uint t,uchar a)/逆时逐个同步灭uchar i,j;for(j=0;j<a;j+)P0=P1=P2=P3=0xff;for(i=0;i<8;i+)P0=table3i;P1=P2=P3=table2i;delay(t);void hwzjl(uint t,uchar a) /横往中间亮uchar i,j;for (j=0;j<a;j+)P0=P1=P2=P3=0xff;for(i=0;i<8;i+)P0=P2=P1=table1i;P3=tablei;delay(t);void hwzjm(uint t,uchar a) /横往中间灭uchar i,j;for (j=0;j<a;j+)P0=P1=P2=P3=0x00;for(i=0;i<8;i+)P0=P2=P1=table3i;P3=table2i;delay(t);void swzjl(uint t,uchar a) /竖往中间亮uchar i,j;for (j=0;j<a;j+)P0=P1=P2=P3=0xff;for(i=0;i<8;i+)P0=P2=P1=tablei;P3=table1i;delay(t);void swzjm(uint t,uchar a) /竖往中间灭uchar i,j;for (j=0;j<a;j+)P0=P1=P2=P3=0x00;for(i=0;i<8;i+)P0=P2=P1=table2i;P3=table3i;delay(t);void nzdl(uint t,uchar a) /逆时逐段亮uchar i,j;for (j=0;j<a;j+)P0=P1=P2=P3=0xff;for(i=0;i<8;i+)P0=table1i;delay(t);P0=0xff;for(i=0;i<8;i+)P1=tablei;delay(t);P1=0xff;for(i=0;i<8;i+)P3=tablei;delay(t);P3=0xff;for(i=0;i<8;i+)P2=tablei;delay(t);P2=0xff;void nzdgl(uint t,uchar a) /逆时逐段一个点亮uchar i,j,k,l;for (j=0;j<a;j+)k=table10;P0=k;l=table0;P1=P2=P3=l;delay(t);for(i=0;i<8;i+)k=_crol_(k,-1);P0=k;l=_crol_(l,1);P1=P2=P3=l;delay(t);void jgs(uint t,uchar a) /间隔闪uchar j;for (j=0;j<a;j+)P0=0x55;P1=P2=P3=0xaa;delay(t);P0=0xaa;P1=P2=P3=0x55;delay(t);void main()uchar i;while(1) zg(100,1); /两边逐个亮 lbzgm(100,1); /两边逐个灭 jgs(300,10); djs(100,20); /对角闪P1=P2=P3=0xff;for(i=0;i<3;i+) P0=0x00;delay(800); P0=0xff;delay(800); P0=0x00; for(i=0;i<3;i+) P1=0x00;delay(800); P1=0xff;delay(800); P1=0x00; for(i=0;i<3;i+) P3=0x00;delay(800); P3=0xff;delay(800); P3=0x00; for(i=0;i<3;i+) P2=0x00;delay(800); P2=0xff;delay(800); qs(500,3);for(i=0;i<6;i+) zgxh(50,1); nszgm(50,1);djs(100,20); /对角闪for(i=0;i<3;i+) zg(100,1); /两边逐个亮 lbzgm(100,1); /两边逐个灭 qs(200,10);djs(100,50); for(i=0;i<5;i+) sztl(200,1); /顺时逐个同步亮nztm(200,1); nztl(200,1);sztm(200,1); /顺时逐个同步灭 djs(300,10); /对角闪 nzdgl(300,10); /逆时逐段一个点亮 jgs(300,10); /间隔闪for(i=0;i<3;i+) zgxh(100,1); nszgm(100,1);for(i=0;i<5;i+) zgxh1(100,1); sszgm(100,1); nzdl(200,3); /逆时逐段亮 jgs(50,100); /间隔闪P0=P1=P2=P3=0xff;for (i=0;i<8;i+)P0=table1i;delay(200);for (i=0;i<8;i+)P1=tablei;delay(200);for(i=0;i<3;i+)P0=P1=0x00;delay(200);P0=P1=0xff;delay(200);for (i=0;i<8;i+)P2=table1i;delay(200);for (i=0;i<8;i+)P3=table1i;delay(200);for(i=0;i<3;i+)P2=P3=0x00;delay(200);P2=P3=0xff;delay(200);nzdgl(50,40); /逆时逐段一个点亮for(i=0;i<4;i+) zg(100,1);qs(100,10); lbzgm(100,1); djs(50,100); /对角闪for(i=0;i<3;i+) zgxh(100,1); nszgm(100,1); djs(1000,10); for(i=0;i<10;i+)hwzjl(200,1); /横往中间亮hwzjm(200,1); /横往中间灭 djs(300,10); /对角闪 for(i=0;i<10;i+) swzjl(200,1); /竖往中间亮swzjm(200,1); /竖往中间灭for(i=0;i<5;i+) zgxh(100,1); nszgm(100,1); djs(100,20); /对角闪 zg(300,1); lbzgm(300,1);for(i=0;i<5;i+) zgxh1(100,1); sszgm(100,1); for(i=0;i<5;i+) sztl(200,1); /顺时逐个同步亮nztm(200,1); nztl(200,1);sztm(200,1); /顺时逐个同步灭 djs(500,20); /对角闪 djs(100,30); /对角闪 djs(50,50); /对角闪/ djs(10,100); /对角闪 delay(1000);void delay(uint t) uint x,y;for (x=t;x>0;x-)for (y=120;y>0;y-);3.4 电路功能仿真在各部分电路设计的基础上,按照总体电路图在Proteus上一一进行器件选择,并连接。将电路连接好后,为各个器件选择合适的参数,然后调入已编译好的目标代码Hex文件,启动仿真。根据LED灯是否发亮,判断所设计的电路是否可以实现32个LED灯依次点亮、依次熄灭、对角闪亮、对角熄灭、间隔闪亮、间隔熄灭等多种功能。刚开始时,LED灯不亮,仔细检查原来是将LED灯接反了,改正之后LED灯便可以正常发光了。电路仿真的结果为32个LED灯依次发亮、依次熄灭,并可以实现多种亮灭功能。根据仿真结果可知电路原理及程序无误,可以进行PCB设计7。如图8所示。图8 电路仿真图总 结在设计电路图的过程中,经过了多次分析和仿真验证,并结合所给的器件清单最后确定了需要哪些器件来实现电路的功能,并且保证了所需要的元器件在给出的清单范围内。经过Proteus软件多次仿真和修改后,在仿真电路图实现设计要求的前提下确定了最终的原理图。然后在Altium Designer中画出来所对应的原理图8,再导入到PCB设计的环境中,进行PCB设计。在经过小组内多次讨论和听取指导老师的意见后确定了PCB的最终布局,布线完成后打印输出制成印刷电路板。将所有的元器件放到相应的封装位置,查无误后进行焊接。焊接完成,接入电源后,心形流水灯实现了32个LED灯依次点亮、依次熄灭,对角点亮、间隔点亮灯多种功能。电路能够正常工作,得到了老师的肯定。 总体说来,电路布局合理,采用了模块化的布局方式即先布局各个功能模块,再将各个功能模块连接在一起组成最终的电路,但是电路还是存在一定的不合理之处,在布局合理美观方面存在一些冲突,由于布线太过宽松,整体尺寸稍大。致 谢经过为期两周的课程设计,我收获很多。在本次课程设计中,我们遇到了很多困难,比如电路图画错、编程出现错误、软件不会使用、元器件虚焊断焊以及焊错等。在这期间,我还是努力认真的去检查和修改,虽然这个过程非常艰难,但还是值得我回味的。在整个课程设计过程中,我查阅了相关书籍和文献资料,从中学习了一些单片机的工作原理以及怎样去设计一个电子电路,还参照了一些以前做过的课程设计。这次课程设计,加深了我对以前学过的课本知识的理解和认识,以前有些课本上的理论知识总是弄不懂,这次通过自己亲自动手去实践,很多问题就通俗易懂了。本次课程设计,真正提高了自己的各项能力,比如独立思考解决问题的能力,与人协作的能力,亲自动手实践的能力,真正的提高了自己的实践技能,培养了自己的创新能力,为今后完成更高质量的项目打下了基础。这次我们能够顺利完成课程设计,是与老师们的辛勤劳动分不开的,所以在此,特别感谢课程设计辅导老师付瑞玲老师和单片机任课老师王玉巧老师,感谢他们在设计中的耐心指导和提出的宝贵建议,同时也感谢小组搭档,和我共同度过这为期两周的课程设计。参考文献1 林志琦.基于Proteus的单片机可视化软硬件仿真M .北京:北京航空航天大学出版社,2006.2 何立民.MCS-51单片机应用系统设计M .北京:北京航空航天大学出版社,1990.3 张毅刚.单片机原理及应用M .北京:高等教育出版社,2004.4 谷树忠,刘文洲,姜航.Altium Designer教程-原理图、PCB设计与仿真.北京:电子工业出版社,2010.5 张阳天,韩异凡.Protel DXP电路设计M.北京:高等教育出版社,2005.6 李全利,迟荣强编著 单片机原理及接口技术M.北京:高等教育出版社,2004.1.7 楼然苗等51系列单片机设计实例M北京:北京航空航天出版社,2003.3 8 赵晓安. MCS-51单片机原理及应用M. 天津:天津大学出版社,2001.3