目录11设计目的1.1设计目的1、通过单片机课程设计,熟练掌握单片机C语言的编程方法,将理论联系到实践中去,提高我们的动脑和动手的能力。2、通过定时器控制两个LED显示器显示10秒秒表系统的设计,掌握定时/计数器和LED显示器的使用方法,同时掌握简单程序的编写,最终提高我们的逻辑抽象能力。1.2设计内容和要求内容:设计一个能够控制两个LED显示器显示10秒秒表的模拟系统。要求:利用单片机的定时器定时,控制LED显示器显示。1.3设计思路1.先熟悉实验原理,了解4只LED滚动闪烁系统灯的工作过程,组成滚动闪烁系统需要的组件。2.了解各个硬件的工作原理,3.绘制电路原理图,编写程序,并进行仿真,基本实现LED滚动闪烁系统灯的功能。22设计原理分析2.1十秒秒表的系统设计通过编写程序,实现对发光二极管的控制,来4只LED滚动闪烁灯的管理。每延时一段时间,灯的显示情况都会按LED灯的显示规律进行状态转换。采用单片机内部的I/O口上的P0口中的4个引脚即可来控制4个LED灯。2.2十秒秒表的功能要求本设计能模拟基本的LED滚动闪烁系统,是用中断的方式定时控制LED定的闪烁及滚动。2.2.1计时显示定时/计数器工作方式寄存器,定时器采用T0定时器0工作于模式2位数:8位计数范围:0-255具有自动加载功能2.2.2中断设置每累计若干次定时器中断才执行一次闪烁。2.3定时器控制4只LED滚动闪烁制系统的基本构成及原理单片机设LED灯闪烁系统,可用单片机直接控制信号灯的状态变化可以广泛的应用到商业和工业的流程控制测电路当中。图2.1系统的总体框图据此,本设计系统以单片机为控制核心,连接成最小系统。系统的总体框图如上所示。因为它能够准确地划分成时钟频率,与UART(通用异步接收器/发送器)量常见的波特率相关。特别是较高的波特率(19600,19200),不管多么古怪的值,这些晶振都是准确,常被使用的。当定时器1被用作波特率发生器时,波特率工作于方式1和方式3是由定时器1的溢出率和SMOD的值(PCON.7------双倍速波特率)决定:单片机晶振LED灯3方式1、3波特率=(定时器1的溢出率)特殊时,定时器被设在自动重袋模式(模式2,TMOD的高四位为0100B),其为:方式1、3波特率=11.0592MHZ晶振的一些典型波特率如下:波特率SMODTH11920010FDH960000FDH480000FAH240000F4H120000E8H30000A0H更换一种计算方式,它将以修改公式达到我们需求的波特率来计算出晶振。最小晶振频率=波特率x384x2SMOD这就是我们所需波特率的最小晶振频率,此频率能成倍增加达到我们需求的时钟频率。43系统硬件电路的设计3.1系统硬件总电路构成及原理实现本设计要求的具体功能,可以选用AT89S51单片机及外围器件构成最小控制系统,4个发光二极管分成1组红绿蓝黄4灯构成信号灯指示模块等。主要器件的选择:器件个数LED4晶振(11.0592)1电阻若干电容2表3-13.2主控制部分――AT89C51单片机简介89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。AT89C51单片机为40引脚双列直插芯片,有4个I/O口,P0,P1,P2,P3,单片机的最小系统如图所示,18引脚和19引脚接时钟脉冲电路,XTAL1接外部晶振和微调电容的一端,在片内它是震荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内她是振荡器倒相放大器的输出端,第9引脚为复位输入端,接上电容,电阻及开关后构成上电复位电路,20引脚为接地端,40引脚为电源端。如图所示:5图3.1晶振与单片机的连接3.2.1AT89C51的内部结构功能·中央处理器:中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。·数据存储器(内部RAM):数据存储器用于存放变化的数据。AT89S51中数据存储器的地址空间为256个RAM单元,但其中能作为数据存储器供用户使用的仅有前面128个,后128个被专用寄存器占用。·程序存储器(内部ROM):程序存储器用于存放程序和固定不变的常数等。通常采用只读存储器,且其又多种类型,在89系列单片机中全部采用闪存。AT89C51内部配置了4KB闪存。·定时/计数器(T0):定时/计数器用于实现定时和计数功能。AT89C51共有2个16位定时/计数器。·并行输入输出(I/O)口:8051共有4组8位I/O口(P0、P1、P2或P3),用于对外部数据的传输。每个口都由1个锁存器和一个驱动器组成。它们主要用于实现与外部设备中数据的并行输入与输出,有些I/O口还有其他功能。6·全双工串行口:A89C51内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。·时钟电路:时钟电路的作用是产生单片机工作所需要的时钟脉冲序列。·中断系统:中断系统的作用主要是对外部或内部的终端请求进行管AT89C51共有5个中断源,其中有2个外部中断源和3个内部中断源。3.2.251单片机的串行接口工作方式51单片机的串行接口有四种工作方式。方式0是将SBUF作为8位同步移位寄存器使用(固定波特率);方式1是10位异步通信方式(可变波特率);方式2是11位异步通信方式(固定波特率);方式3是11位异步通信方式(可变波特率)。图3.2串行接口与单片机的连接3.3其它器件3.4.1发光二极管根据本设计的特点,LED的显示不可少,LED的显示采用普通的发光二极管。在硬件上连接图上也是对称分布的,如下图3.4所示。7图3.3LED灯的连接在本设计中,实际控制的灯只有4个,其中均是低电平有效,所以在运行前LED灯的状态是灭。3.4定时器控制4只LED滚动闪烁控制系统原理图本系统以单片机为核心,系统硬件电路由单片机,电阻,LED显示组成。其具体的硬件电路总图如图3.6所示。图3.4系统原理83.5设计的连线图:3.5.1单片机实物图:图3.5实物图3.6硬件资源及其分配主要用到的硬件:P0口、LED发光二极管、定时器T0。硬件分配:(1)P1口:做为输出口,与发光二极管相连接。(2)定时/计数器T0用来产生1秒的定时。93.7运行步骤1、接硬件图接线,为了确保LED灯能够对应显示,实验时,对P0口的接线做了调整。即,P0.0接L1,P0.1接L2,P0.2接L3,P0.3接L4。2、开始连续运行,观察4个LED灯是与程序设计思路对应,如果有偏差,则单步运行或断点运行,进行调试,直至满足设计要求。3、整体运行,观察LED显示是否都符合要求,如果不符合,则再调试。直至满足要求。3.8检测与调试3.8.1硬件调试:硬件调试是利用开发系统、基本测试仪器(万用表、示波器等),检查用户系统硬件中存在的故障。硬件调试可分为静态调试与动态调试两步进行。静态调试静态调试是在用户系统未工作时的一种硬件检测。第一步:目测。检查外部的各种元件或者是电路是否有断点。第二步:用万用表测试。先用万用表复核目测中有疑问的连接点,再检测各种电源线与地线之间是否有短路现象。第三步:加电检测。给板加电,检测所有的插座或是器件的电源端是否符合要求的值第四步:是联机检查。因为只有用单片机开发系统才能完成对用户系统的调试。动态调试动态调试是在用户系统工作的情况下发现和排除用户系统硬件中存在的器件内部故障、器件连接逻辑错误等的一种硬件检查。动态调试的一般方法是由近及远、由分到合。由分到合是指首先按逻辑功能将用户系统硬件电路分为若干块,当10调试电路时,与该元件无关的器件全部从用户系统中去掉,这样可以将故障范围限定在某个局部的电路上。当各块电路无故障后,将各电路逐块加入系统中,在对各块电路功能及各电路间可能存在的相互联系进行调试。由分到合的调试既告完成。由近及远是将信号流经的各器件按照距离单片机的逻辑距离进行由近及远的分层,然后分层调试。调试时,仍采用去掉无关元件的方法,逐层调试下去,就会定位故障元件了。3.8.2软件调试:软件调试是通过对拥护程序的汇编、连接、执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。程序后,编辑,查看程序是否有逻辑的错误。114系统软件程序的简单设计4.1程序框图图4.1程序框图4.2程序流程图及程序4.2.1程序流程图:开始初始化,全灭蓝灯亮,开始闪烁延时蓝灯灭,绿灯亮,开始闪烁延时绿灯灭,红灯亮,开始闪烁延时红灯灭,黄灯亮,开始闪烁延时12图4.2程序图4.2.2程序清单:主程序:#includereg51.h//定义8051寄存器的头文件#defineucharunsignedchar//定义无符号字符型(0——255)#defineuintunsignedint//定义无符号整型(0——65535)//字符与整型分为有符号(signed)与无符号(unsigned)两类//通常sbit数据类型是用于存取内部可位寻址的数据存储器sbitB1=P2^0;//声明B1为P1.0端口sbitG1=P2^1;sbitR1=P2^2;sbitY1=P2^3;//若要使用权sbit数据类型,则其声明方式有下列几种://1.先声明一个bdata存储器形式的变量,再声明属于该变量的sbit变量,例如://charbdatascan;声明scan为bdata存储器类型的字符//sbitinput_0=scan^0;声明input_0为scan变量的bit0//2.先声明一个sfr变量,再声明属于该变量的sbit变量,例如://sfrP0=0x80;声明P0为0X80存储器位置,即P0开始初始化设置计数器i=0;i++_LED灯开始循环闪烁计数器开始计数计数完成程序中断,i自加1,下一个LED灯开始闪烁否否13//sbitP0_0=P0^0;声明P0_0为P0变量的bit0//3.直接指定存储器位置,例如要声明P0的bit0,则//sbitP0_0=0X80^0;声明P0_0为0x80地址的bit0uinti,j,k;//-------------------------------------------------------------------//主程序//-------------------------------------------------------------------voidmain()//主程序开始{i=j=k=0;P2=0xff;//开始时全部关闭TMOD=0X02;//定时/计数器工作方式寄存器低4位//T0定时器0工作于模式2位数:8位计数范围:0-255具有自动加载功能TH0=256-200;//200us定时TL0=256-200;IE=0X82;//中断使能寄存器IE,相当于EA=1;ET0=1;TR0=1;//定时器/计数器控制寄存器TCODTimer0的启动开关while(1);//无穷循环}//-------------------------------------------------------------//T0中断函数//-------------------------------------------------------------