⑴ 我也要单片机流水灯设计的说明书
单片机流水灯设计作者:贵州民族学院04级电子班马宏亮指导教师:聂思敏 (副教授)摘要:介绍如何利用80C51单片机P0口的扩展来制作16盏流水彩灯,并使用片外程序存储器(2764)。关键词:最小系统﹑P0扩展﹑时序图﹑机器周期、片外程序存储器的扩展,地址线,数据线、片选.所需硬件:80C51 一块 2764 一块 74LS373 三块 74LS02一块 发光二极管和电阻若干。各集成块的引脚图: 80C51 2764 74LS373 74LS02各集成块引脚功能介绍:一、 80C51引脚介绍:主电源引脚Vss(20脚)和Vcc(40脚);时钟电路引脚XTAL1(19脚)和XTAL2(18脚)。 控制信号引脚如下:RST复位(9脚)输入24个时钟脉冲周期宽度以上H电平复位。ALE或/PROG、(30脚)锁存扩展地址低位字节控自信号。/PSEN、(29脚)访问片外程序存储器是输出负脉冲作片选控制信号,12个始终周期2次生效,但访问片外RAM时无效。EA(31脚)当此脚输入高电平时,CPU从片内程序存储器地址0000H单元开始执行程序。当地址超出4KB时,将自动执行片外程序存储器的程序。当此脚输入低电平时,CPU仅访问片外程序存储器。输入/输出脚:(1)P0.0—P0.7 (39脚—32脚)(2)P1.0—P1.7 (1脚—8脚)(3)P2.0—P2.7 (26脚—21脚)(4)P3.0—P3.7 (10脚—17脚)在单片机中P3口还有第二功用,在我们这个设计中就要用到P3口的部分脚的第二功能:P3.0和P3.1口的第二功用是单片机一个重要的脚,即串行接口。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)外部数据存储器读选通信号。在本设计中要用到P3口的第二功用的脚有:P3.6用做写控制端。还有用到的P3.0,P3.1即要求我们做串口。串口的意思是:就是计算机发送数据由单片机接受。具体的实现过程在后面做我所理解了的理论介绍,但是本人到交作品前还在调试串口程序。做出来了再做补充。二、2764引脚介绍:A12~A0:13条地址线,表示有 个地址单元。
D7~D0: 8条数据线,表示地址单元字长8位。Q7~Q0: 8条数据线。和P0口的8条线想连。
-ALE/CS: 片选控制输入端,低电平有效。
-OE: 读出控制输入端,低有效。
Vcc: 工作电源+5V。
Vpp: 编程电源+5V。
-PRG: 编程脉冲输入端。
GND: 芯片接地端。和单片机的具体接法在后面细说。三、74LS373引脚介绍:74LS373为8位数据锁存器,其中D7~D0为输入数据端,Q7~Q0为输出数据端,G为输入数据锁存端, 为输出数据控制端。只要 端接高电平,锁存器输出呈高阻态;当G接正脉冲时,可将输入数据D7~D0暂存在锁存器内部;一旦当 端施加低电平信号,暂存数据才反映到输出数据端Q7~Q0上。将 端始终接一低电平,保持输出常通。使G端与单片机的ALE(30脚)相连。在一个指令周期中ALE两次出现高平,当我们用MOVX @DPTR,A送数到外部存储器时,因为MOVX是单字节双周期指令,先从ROM中读取指令,然后对外部RAM进行写操作,在第一个机器周期,在ALE出现一个高电平时,读取指令(即操作码)有效,第二机器周期时,进行外部RAM访问,此时ALE信号无关,所以,第二机器周期不产生取指操作,利用74LS373锁存作用,锁存低8位地址线A0~A7。当ALE为低电平时,并输出供系统使用。 四、74LS02引脚介绍:74LS02为在数字电路课程中有讲。74LS02为或非门。一块74LS02里面集成了四个或非门。74LS02是两个脚作为输入一个脚作为输出。如图:1、4、10、13脚分别作为四个或非门的输出。以一个或非门为例来讲。其他的几个都一样。2、3脚作为输入,1脚作为输出,这三个脚构成一个或非门。其逻辑功能为:Y=A+B非,当A和B脚都输入低电平时输出Y就为高电平,其他的情况输出Y都为低电平。总设计思路:80C51通过执行片外(2764)中的程序来控制P0口所接灯。其中P0口是做分时复用的。P0口有地址线/数据线双用功能。单片机扩展片外程序存储器就是利用一个8D地址锁存器来对P0口送出的地址进行锁存然后再取数由Q0~Q7口传到P0口。然后由单片机的写端口来控制写的数据(既接灯的两个74LS373)。具体的电路原理图如下:电路原理图此处应说明这两片锁存器的地址定义,以使后面的控制有根据。聂2007-4-10本电路是用一个叫Proteus的软件做的,为什么使用这个软件?因为这个软件可以对单片机仿真。可以把程序添加到里面然后就可以运行看你写的程序是否符合自己的想法。就可以省去多次写自己的2764,这样子可以节省很多时间。元件的损耗方面也会少的多。本人在用的是keil uvision2.0+Proteus软件进行调试的。这两个软件可以连接调试。在后面再具体介绍。系统调试:电路焊接好后先别通电,先检查电路。首先检查几个重要的接线。1. 单片机的ALE端和做地址锁存器的74LS373的OE端相接。2. 单片机的PSEN端和2764的OE端相连接。3. 单片机的EA脚必须接地。EA脚的功用是当接搞好电平时就是先执行片内程序,执行完了再执行片外的程序。而直接接地就是不读片内的程序而直接去执行片外的程序,这也是老师要求的必须使用片外程序存储器而不使用片内的。4. 2764中的CE脚是否接地,这个脚的功能是:接低电平表示选中该程序存储器。这个几个特别的并不是说其他的不重要,只要有一根线错了导致的后果就不堪设想。这几个检查好了,然后在用外用表检查所有的连线是否是通的。本人在此电路中碰到的问题:我焊这个电路焊了四遍才好的,焊四遍的原因是线路太多而且线焊的太合适没发检查。所以焊线路时得注意这个问题。1.我的第一次电路就焊好了,出现问题的原因是一个非常低级的错误。就是我把74LS02的脚给弄错了。主要是我到网上查的资料是错的。我查到的引脚图下:这个引脚图是错的。我当时没注意到这个问题。这个问题是我在后面发现的。我焊了三次电路都是一样的效果。我怀疑过是晶振的问题。于是我换了三个晶振但是问题还没得到解决我想再怎么也不会坏三个晶振。我就到我的计算机上(用Protues仿真)仿真可能出现这种情况的连线。最后才发现只有把74LS373使用在高阻的状态下没的反应。就是OE端为低时无效。也就是74LS02接74LS373的脚一直是低电平。我总结了我三次失败的原因我第四次焊的时候也就没问题了。此处还是没有清楚地说明什么是错的,什么是对的?出的问题如何解决?聂2007-4-102.焊电路最主要是细心和耐心。慢慢检查。3.我后面还使用的最小系统来检查我的硬件是不是好的。最小系统检查方法是:在P1口的任意一个口接一个发光管然后写程序进去看是否能行。本人写的程序是用C(keil)语言写的。我也用汇编写了相应功能的程序。汇编程序就不写出来了,不然篇幅太长了。C程序如下:#include "reg51.h" /*为单片机的一个头文件*/#ifdef MONITOR51char code reserve[3] _at_ 0x23;#endif /*是否使用串口,是留下一个地址供串口使用*/xdata unsigned char f _at_ 0x3fff; /*你可以写一个自己的头文件,将这些定义*/xdata unsigned char i _at_ 0x7fff; /*和函数声明写入头文件中去。聂2007-4-10*/xdata unsigned char j _at_ 0xbfff; /*定义绝对寻址区*/#define N 40000void delay(unsigned int d);void tongse(); /*应注释一个这几个函数的用途。聂2007-4-10*/void san();void db();void gaoliang();void diliang(); /*程序申明*/ void main(void){#ifndef MONITOR51TMOD |=0x20;TH1 =250;TL1 =250;TR1 =1;PCON =0x80;SCON=0x50;#endif /*初始化串口*/while(1) { gaoliang(); delay(N); diliang(); f=0xff; delay(N); tongse(); db(); /*最好不要用这个汇编语言的保留字db。聂2007-4-10*/ san(); /*程序调用*/ }} void delay(unsigned int d) /*延时程序*/{while(d!=0)</p><p> {d--;}} void tongse() /*同色灯轮流亮*/{ f=0xfc; delay(N); f=0xf3; delay(N); f=0xcf; delay(N); f=0x3f; delay(N); f=0xff; delay(N);} void san() /*所有的灯一起闪三次*/ {unsigned char p;</p><p>for(p=0;p<3;p++)</p><p> {f=0x00;</p><p> delay(N);</p><p> f=0xff;</p><p> delay(N);</p><p> }} void db() /*16颗灯两颗两颗轮流亮*/{ j=0xfc; delay(N); j=0xf3; delay(N); j=0xcf; delay(N); j=0x3f; delay(N); j=0xff; i=0xfc; delay(N); i=0xf3; delay(N); i=0xcf; delay(N); i=0x3f; delay(N); i=0xff; delay(N);} void gaoliang() /*片选7FFF的灯一个一个的亮*/{ unsigned char LED;unsigned char x; LED = 0xff; P0 = LED;for(x=0;x<8;x++) {LED = LED>>1; </p><p> i = LED;</p><p> delay(N);</p><p> } } void diliang() /*片选BFFF的灯一个一个的亮*/{ unsigned char LED; unsigned char x; LED = 0xff; P0 = LED;for(x=0;x<8;x++) {LED = LED>>1; </p><p> j = LED;</p><p> delay(N);</p><p>}}在以上子程序中,应加上对所控制对象的控制意图或应产生的控制效果的说明。聂2007-4-10以上程序都是调试过的(在windows2000操作系统下使用Keil uvision2.0调试的)。串口程序我写了但是还没调试。等调试过了在把串口的程序补写上来。PROTEUS程序的介绍由于篇幅所限这里就不写KEIL UVISION+PROTEUS的连接调试了。因为这不是一下就说的清楚的,我怕说不清楚反而把大家给弄糊涂了。但是用WAVE所写的程序生成的二进制文件也可以在PROTEUS上运行。二进制文件即写入单片机的那个文件就是后缀名为:*.hex的文件。具体使用方法是:在Proteus里面把电路画好。然后鼠标右键单击80C51。当80C51变成红色后在鼠标左键电击就出现对话框。注意都是单击(元件变成红色再单击的话元件就被删除了咯)。然后在对话框中的Program Files栏选择你的程序文件。单击OK。再点击运行就可以了。对了大家得注意只能写在片内而不内写在片外写在片外的话就不执行的。单片机片内的程序写到片外也可以执行的。所以在片内能运行的程序,写到片外也就行了。由于PROTEUS是一个比较新的软件,你对它已作过一些应用并取得了一些经验,可以在下一篇论文中作一些更详细的使用说明及使用经验谈。聂2007-4-10 聂思敏评论:该文写得很好,完全是自己工作经验的总结。在这一工作中表现出了自己独立工作和研究的能力,发展这样的能力是把自己培养成创新人材的必由之路。文中使用了C语言编程,这个语言不在教学的要求之内,但这一个发展方向更接近实际工作。文中使用了非常新颖和强大的PROTEUS电子设计自动化开发平台,这一方法使得工作更因事半功倍,是今后单片机开发的方向。希望其它同学的作品都能经过这一个仿真过程。聂2007-4-10
⑵ 流水灯如何制作
接触过单片机的朋友都会对流水灯有了解,那时我们是用单片机来制作的,但是你如果单纯做个流水灯,选择使用单片机来做的话未免有些资源的浪费,今天就教给大家一个不用单片机就可以交替闪烁的跑马灯。
单片机流水灯(图片来源于网络,若侵权请联系删除)
单片机流水灯(图片来源于网络,若侵权请联系删除)
怎么制作的呢?来看一下原理图
流水灯原理图
由这个原理图可以看出我们使用的元件有电阻、电容、LED灯、三极管就这些常用的元件就可以了。
至于能够闪烁的原理呢也不难理解,三极管在电路中充当开关的作用,通上电后最左边的LED由于三极管最先被导通,从而最先被点亮,集电极串联一个电容连接到下一个三极管,当电容充电后把后一个三极管导通,导致后一个LED灯点亮,而由于后一个三极管导通又会引起前一个三极管截止,造成前一个LED熄灭,以次类推循环,这样就形成了这三类LED灯轮流被点亮,通过改变电容的大小还可以改变跑马灯闪烁的时间。
讲完原理后就准备下材料吧,来看下图片
制作材料
找到材料之后接下来就是按照原理图把应该连接的部分进行电气连接,大家在焊接的时候,最好把这些元件焊接到洞洞板上或者说在面包板上进行连接也行,如果单纯进行连接的话,会很乱,故障也难排查,而且容易失败,这几天给大家介绍几个小制作基本上都用到了洞洞板,也把我仅有的几个洞洞板给消耗完了,如果不用洞洞板直接焊接是很乱的,看下焊接图你就知道了
制作图
是不是看起来非常乱,确实是这样,再来看一张以前打印的PCB
PCB跑马灯
打成PCB板的看起来是不是好多了,把它设计成心形就更好看了。
可能有人不理解了为什么原理图中的跑马灯的制作是三个LED灯,而到变成那么多了,其实不管LED灯再多原理都是一样的,那个原理图可以说是单位电路,我们需要多加LED无外乎在原先有LED的地方再多并联几个LED,这样就能做成上图中的心形。
这种制作方法,简单,材料好找又不需要单片机基础,可以说只要你想做就能做出来,还不赶快制作一个。
注:流水灯和跑马灯是指一种东西,所以文章中没有区分,不同的人有不同的叫法!
⑶ 广告牌流水灯的制作
看你的分类,应该是网页设计类吧。
查一下代码即可。
如果是实际的制作,可以找厂家。
⑷ 七彩流水灯的制作方案
几个灯?用什么控制
⑸ 流水灯实训报告
转载于 http://www.scetop.com/jpkc/pld/ArticleShow.asp?ArticleID=565&BigClassName=%CA%B5%D1%B5%BD%CC%D1%A7
希望对你有帮助
实训项目(一) 流水灯 1. 实验目的通过此实验让用户进一步了解、熟悉和掌握CPLD/FPGA开发软件的使用方法及Ver-ilog HDL的编程方法;学习简单时序电路的设计和硬件测试.2. 实验内容本实验的内容是建立可用与控制LED流水灯的简单硬件电路,要求在SmartSOPC实验箱上实现LED1-LED8发光二极管流水灯显示.3. 实验原理(1) 在引脚上周期性地输出流水数据,如原来输出的数据是11111100则表示点亮LED1、LED2.流水一次后,输出数据应该为11111000,而此时则应点亮LED1~LED3三个LED发光二极管,这样就可以实现LED流水灯.为了观察方便,流水速率最好在2Hz左右.在QuickSOPC核心板上有一个48MHz的标准钟源,该时钟脉冲CLOCK与芯片的28脚相连.为了产生2Hz的时钟脉冲,在此调用了一个分频模块,通过修改分频系数来变改输出频率.当分频系数为24×10时,输出即为2Hz的频率信号.(2) int_div分频模块说明: int_div模块是一个占空比为50%的任意整数分频器.输入时钟为clock,输出时钟为clk_out.其中F_DIV为分频系数,分频系数范围为1~2N(n=F_DIV_WIDTH).若要改变分频系数,则改变参数F_DIV和F_DIV_WIDTH到相应范围即可.在本例中输入时钟频率为48MHz,要得到2Hz的信号,分频系数应为48×10/2=24×10.对于分频系数为24×10的数需要一个25位宽的计数器.在以后的实验中还会多次用到这个模块,用户可以分析它的基本原理.4. 实验步骤(1) 启动QUARTUSⅡ建立一个空白工程,然后命名为.(2) 新建VerilogHDL源程序文件ledwater.v,输入程序代码并保存,然后进行综合编译.若在编译过程中发现错误,则找出并更正错误,直到编译成功为止.(3) 从设计文件创建模块,由ledwater.v生成名为ledwater.bsf的模块符号文件.(4) 将光盘中EDA_component目录下的int_div.bsf和int_div.v拷贝到工程目录.(5) 新建图形设计文件命名为led_wter.bdf在空白处双击鼠标左键,在sym-bol对话框左上脚的的Iibraries中,分别将projet下的ledwater和int_div模块放在图形文件ed_wter.bdf中,加入输入、输出引脚,双击各引脚符号,进行引脚命名.将与ledwater模块led[7..0]连接的引脚命名为led[7..0],与int_div模块clock连接的引脚命名为clock. int_div模块的clk_out与ledwater模块的clk相连接.双击int_div的参数框,并修改参数,将F_DIV的值改为24000000, F_DIV_WIDTH的值改为25,单击“确定”按扭保存修改的文件的参数如果led_water.bdf中部能看到参数设置框,可在空白处右击鼠标,选择Show Parameter Assignments命令来显示参数设置框。(6) 选择目标器件并对相应的引脚进行锁定,正在这里所选择的器件为Altera公司Cyclone系列的EP 1C6Q240C8芯片,引脚锁定方法如表3.1所列。将未使用的引脚设置为三态输入(一定要设置,否则可能会损坏芯片)。 表3.1 引脚锁定方法 信号引脚 信号引脚1C61C12EDA1C61C12EDALed[0]505050led[5]474747led[1]535353led[6]484848led[2]545454led[7]494949led[3]555555clock282828led[4]176176176 (7) 将led_water.bdf设置为顶层实体。对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。(8) 最后将跳线短接帽跳接到smartSOPC实验箱上JP6的LED0~LED7,使LED1~LED8 分别与FPGAD的引脚50、53~55、176和47~49相连。将AlteraByteBlasterⅡ下载电缆的两端分别接到PC机的打印机并口和QuickSOPC核芯板上的JTAG下载口上,打开电源,执行下载命令,把程序下载到FPGA器件中,此时,即可在smartSOPC实验箱上看到流水灯。(9 更改分频模块(int_div)的分频系数,并重新编译下载,观察流水灯的变化。 5. 实验参考程序 程序清单3.2ledwater.v Mole ledwater(led,clk); //模块名ledwaterOutput[7:0]led; //定义LED输出口Input clk; //定义时钟输入口Reg[8:0] led_r; //定义输出寄存器Assign led=led_r[7:0]; //寄存器输出always@(posedge clk) //在时钟上升沿触发进程beginled_r<=led_r<<1; //是,则输出左移一位if(led_r==9`d0) //循环完毕吗?led_r<=9`b11111111; //是,则重新赋初值endendmole 6. 日积月累(1) 思考:如何实现左流水灯或其他花样流水呢?用户自己动手试试。(2) REG数据类型:由两大类数据类型,线网类型和寄存器类型。REG是最常见的寄存器类型,形式如下:REG[msb:lsb]reg1,reg2,…regN;其中,msb和lsb定义了范围,并且均匀为常数值表达式。范围定义是可以选的。如果没有定义范围,默认值为1位寄存器。 reg数据类型的默认初始值是不定值X,它可以赋正值,也可以赋负值。当一个reg类型数据是一个表达式中的操作数时,他的值被当作是无符号值,即正值(如意个4)为寄存器被赋值-1,则在表达式中进行运算时,其值被认为是+15)。 reg型只表示被定义的信号将用在always块内,理解这一点很重要。并不是说reg 型信号一定是寄存器或触发器的输出。虽然reg型信号常常是寄存器或触发器的输出,但并不一定总是这样,只有在时序逻辑中他对应的才是寄存器,而在组合逻辑中他则表达一个节点。(3)按照上述管工程进行编译,会出现“warning: found pins functioning as undefined clocks and/or memory enables Info: Assuming node ”clock” is an undefined clock”的警告,大概意思是指发现clock节点没有定义成时钟信号。消除这个警告的方法如下: ①选择assignments→timing settings命令,在弹出的对话框中的clockseteings选项区中选中settingsfor indivial clock signals项。 ②对clocks进行设置,在弹出的对话框中单击按钮添加节点,按图中所示进行设置。图中requiredfmax 为系统需求的最大时钟频率,在这里填50HZ即可。 ③设置好之后连续单击OK按钮保存设置,最后再进行编译,原先的warning就会消除。以上的操作是将“clock”加入时钟域。如果“clock”不是一个时钟信号,可将设置属性改为“not a clock ”,也可以消除warning。
⑹ 如何制作LED流水灯,随音乐变化
用LM339集成运放可以实现,把正相(5、7、9、11)脚分别接在不同的电压端(由多回个电阻串联分压组成答),把反相(4、6、8、10)脚接在一起然后接到喇叭端检测声音大小,把四个发光二极管负极分别接在输出端(1、2、13、14)脚,发光二极管正极分别接电阻,然后接到电压正极,LM339的3脚接电源正极12脚接电源负极
⑺ 求有四种流水方式的流水灯制作流程图和程序(汇编)
http://..com/question/200867792.html
⑻ 简单LED流水灯的制作及电路图
看看这个,用51单片机做的
//P2.0、P2.1、P2.2三个口分别接黄红绿三个信号灯,每隔59秒红灯和绿灯轮流亮和暗,
//第60秒黄灯持续亮一秒,此时其他灯不亮。
#include<reg52.h>
#define uchar unsigned char
sbit yellow=P2^0;
sbit red=P2^1;
sbit green=P2^2;
sbit coma=P2^3;
sbit comb=P2^4;
int i=0,k=0,j=59;
///////////////////////////////////////////
uchar getcode(uchar a)
{
uchar p;
switch (a)
{
case 0: p=0xC0; break; /* 0 */
case 1: p=0xF9; break; /* 1 */
case 2: p=0xA4; break; /* 2 */
case 3: p=0xB0; break; /* 3 */
case 4: p=0x99; break; /* 4 */
case 5: p=0x92; break; /* 5 */
case 6: p=0x82; break; /* 6 */
case 7: p=0xF8; break; /* 7 */
case 8: p=0x80; break; /* 8 */
case 9: p=0x90; break; /* 9 */
default: break;
}
return(p);
}
///////////////////////////////////////////////
void delay( )
{
int x,y;
for(x=4;x>0;x--)
for(y=0;y<125;y++)
{ }
}
//////////////////////////////////////////////
void display( )
{
P1=getcode(j/10);coma=1;comb=0;delay();
P1=getcode(j%10);coma=0;comb=1;delay();
}
///////////////////////////////////////////
main( )
{
TMOD=0x01;
TH0=-(50000/256);
TL0=-(50000%256);
TR0=1;
EA=1;
ET0=1;
do{ display(); }
while(1);
}
////////////////////////////////////////////
void timer0( ) interrupt 1
{
i++;
TH0=-(50000/256);
TL0=-(50000%256);
if(i==20)
{i=0;j--;}
if(j<0)
{j=59;k++;}
if(k==2)
k=0;
if(j==0)
{yellow=0;red=1;green=1;}
if(k==0&&j!=0)
{red=0;yellow=1;green=1;}
if(k==1&&j!=0)
{green=0;red=1;yellow=1;}
}
⑼ 求一篇关于单片机制作流水灯的论文
毕业设计都有16花样流水灯呢,膜拜!
这种论文,8051单片机简介就要占3页~~~哈哈哈