我也要单片机流水灯设计的说明书

лл... лл 展开
 我来答
匿名用户
2013-10-15
展开全部
单片机流水灯设计 作者:贵州民族学院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-10 2.焊电路最主要是细心和耐心。慢慢检查。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
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-10-15
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式