单片机控制的花样流水灯设计.doc
【精品文档】如有侵权,请联系网站删除,仅供学习与交流单片机控制的花样流水灯设计.精品文档.目录引言31. 绪论42 相关元件及电路设计42.1 AT89C52芯片功能特性及应用42.2 AT89C5252单片机52.2.1 AT89C52单片机的硬件结构52.2.2主要性能参数62.2.3 AT89C52管脚说明72.2.4 外部总线构成112.3 单片机时钟电路及时钟时序单位122.4单片机的复位132.4.1 复位状态132.4.2 复位电路143.Keil C51开发系统基本知识Keil C51开发系统基本知识154 电路及程序设计164.1 电路原理图设计16总结17参考文献18附录19引言单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。单片机微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。随着电子技术和微机计算机的迅速发展,单片机的档次不断提高,其应用领域也在不断的扩大,已在工业控制、尖端科学、智能仪器仪表、日用家电、汽车电子系统、办公自动化设备、个人信息终端及通信产品中得到了广泛的应用,成为现代电子系统中最重要的智能化的核心部件。通常,单片机由单块集成电路芯片构成,内部包含有计算机的基本功能部件:中央处理器、存储器和I/O接口电路等。因此,单片机只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。单片机经过1、2、3、3代的发展,目前单片机正朝着高性能和多品种方向发展,它们的CPU功能在增强,内部资源在增多,引角的多功能化,以及低电压底功耗。当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未见的速度被单片机智能控制系统所取代。单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。学习单片机的最有效方法就是理论与实践并重,本文笔者用AT89C52单片机自制了一款简易的流水灯,重点介绍了其软件编程方法,以期给单片机初学者以启发更快地成为单片机领域的优秀人才。1. 绪论当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未见的速度被单片机智能控制系统所取代。目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。本设计用AT89C51单片机自制了一款简易的花样流水灯,介绍了其硬件电路及软件编程方法,在实践中体验单片机的自动控制功能。该设计具有实际意义,可以在广告业、媒体宣传、装饰业等领域得到广泛应用。学习单片机的最有效方法就是理论与实践并重,现在我把单片机流水灯设计作为一个课程设计,需要更深的去了解单片机的很多功能,努力的去查找资料。本课题将以发光二极管作为发光器件,用单片机自动控制,实现一个简易的花样流水灯设计。2 相关元件及电路设计2.1 AT89C52芯片功能特性及应用单片机在我们的日常生活和工作中无处不在、无处不有:家用电器中的电子表、洗衣机、电饭褒、豆浆机、电子秤;住宅小区的监控系统、电梯智能化控制系统;汽车电子设备中的ABS、GPS、ESP、TPMS;医用设备中的呼吸机,各种分析仪,监护仪,病床呼叫系统;公交汽车、地铁站的IC卡读卡机、滚动显示车次和时间的LED点阵显示屏;电脑的外设,如键盘、鼠标、光驱、打印机、复印件、传真机、调制解调器;计算机网络的通讯设备;智能化仪表中的万用表,示波器,逻辑分析仪;工厂流水线的智能化管理系统,成套设备中关键工作点的分布式监控系统;导弹的导航装置,飞机上的各种仪表等等。有资料表明:2007年全球单片机的产值达到151亿美元,我国单片机的销售额达到400亿元人民币,我国每年单片机的需求量达50至60亿片,是全球单片机的最大市场。可以说单片机已经渗透到了我们生活的各个领域。AT89C52是美国Atmel公司生产的低电压、高性能CMOS 8位单片机,片内含8KB的可反复檫写的程序存储器和12B的随机存取数据存储器(RAM),器件采用Atmel公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内配置通用8位中央处理器(CPU)和Flash存储单元,功能强大的AT89C52单片机可灵活应用于各种控制领域。AT89C52单片机属于AT89C51单片机的增强型,与Intel公司的80C52在引脚排列、硬件组成、工作特点和指令系统等方面兼容。其主要工作特性是:(1)片内程序存储器内含8KB的Flash程序存储器,可擦写寿命为1000次;(2)片内数据存储器内含256字节的RAM;(3)具有32根可编程I/O口线;(4)具有3个可编程定时器;(5)中断系统是具有8个中断源、6个中断矢量、2个级优先权的中断结构;(6)串行口是具有一个全双工的可编程串行通信口;(7)具有一个数据指针DPTR;(8)低功耗工作模式有空闲模式和掉电模式;(9)具有可编程的3级程序锁定位;(10)AT89C52工作电源电压为5(1+0.2)V,且典型值为5V;在AT89C52芯片内部有一个高增益反相放大器,用于构成振荡器。反相放大器的输入端为引脚XTAL1,输出端为引脚XTAL2,在芯片的外部通过这两个引脚跨接晶体振荡器和微调电容C1、C2形成反馈电路,可构成稳定的自激振荡器,振荡频率通常是24MHz。若晶体振荡器频率高,则系统的时钟频率也高,单片机的运行速度也就快2.2 AT89C5252单片机2.2.1 AT89C52单片机的硬件结构AT8952系列单片机内部采用模块式结构,其结构组成框图如图1所示。图1 AT8952系列单片机组成框图由图1可见,MCS-52系列单片机主要由以下部件通过片内总线连接而成:中央处理器(CPU)、数据存储器(RAM)、程序存储器(ROM)、并行输入/输出口(P0口P3口)、串行口、定时器/计数器、中断控制、总线控制及时钟电路。2.2.2主要性能参数 8K字节可重擦写Flash闪速存储器 1000次可擦写周期 全静态操作:0Hz-24MHz 三级加密程序存储器 256×8字节内部RAM 32个可编程I/O口线 3个16位定时/计数器 8个中断源 可编程串行UART通道 低功耗空闲和掉电模式图 2 AT89C52外部引脚图2.2.3 AT89C52管脚说明VCC:电源GND:接地P0口:P0口是一个8位漏级开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0口端口写“1”时,引脚作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上拉电阻。在flash编程时,P0口也用来接受指令字节:在程序效验时,输出指令字节。程序效验时,需要外部上拉电阻。 P1口:P1口是一个具有内部上拉电阻的8位是双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑电平。对P1口写“1”时,内部上拉电阻的原因,将输出电流ILL。此外,与AT89C51不同之处是,P1.0和P1.1还可分别作为定时/计数器2的外部计数输入(P1.0/T2)和输出(P1.1/T2EX),具体如下表所示。表 1 P1.0和P1.1的第二功能引脚号功能特性P1.0T2(定时/计数器2外部计数脉冲输入),时钟输出P1.1T2EX定时/计数2捕获/重装载触发和方向控制在Flash编程和校验时,P1口接收低8位地址字节。 P2口:P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲级可驱动吸收或输出电流4个TTL逻辑电平。对P2口写“1”时,通过内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流ILL。 在访问外部好曾许存储器或用16位地址读取外部数据存储器时,P2口送出高8位地址。在这种应用中,P2口使用很强的内部上拉发送1。在使用8位地址访问外部数据存储器时,P2口输出P2锁存器的内容。在Flash编程和校验时,P2口接收低8位地址字节和一些控制信号。P3口:P3口是一个具有内部上拉电阻的8位双向I/O口,P3输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑电平。对P3口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入端口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流ILL。P3口除了作为一般、的I/O口线外,更重要的是它的第二功能,如下表所示。表 2 P3口引脚第二功能引脚号第二功能P3.0RXD(串行输入)P3.1TXD(串行输出)P3.2INT0(外部中断0)P3.3INT1(外部中断1)P3.4T0(定时器0外部输入)P3.5T1(定时器1外部输入)P3.6WR(外部数据存储器写选通)P3.7RD(外部数据存储器读选通)在Flash编程和校验时,P3口也接收一些控制信号。 RST:复位输入。晶振工作时,RST脚持续2个机器周期以高电平将使用单片机复位。 ALE/:地址锁存器控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。在Flash编程时,此引脚()也使用作编程输入脉冲。 在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。 如果需要,通过将地址为8EH的SFR的第0位置“1”,ALE操作无效。这一位置“1”,ALE仅在执行MOVX或MOVC指令时有效。否则,ALE将被微弱拉高。这个ALE使能标志位的设置对微控制器处于外部执行模式下无效。 :外部程序储存器选通信号()是外部程序存储器选通信号。当AT89C52从外部程序存储器执行外部代码时,在每个机器周期被激活两次,而在访问外部数据储存器时,将不被激活。 :访问外部程序存储器控制信号。为使能从0000HFFFFH的外部程序存储器读取指令,端必须保持低电平(接地)。为了执行内部程序指令,应该接VCC。 在flash编程期间,也接受12伏VPP电压。 XTA L1:振荡器反相放大器及内部时钟发生器的输入端。 XTA L2:振荡器反相放大器的输出端。MCS-52系列单片机的引脚封装主要有: PDIP40、PLCC44和PQFP/TQFP44。不同封装的芯片其引脚的排列位置有所不同,但他们的功能和特性都相同。方形封装(PLCC44和POFP/TQFP44)有44引脚,其中4个NC为空引脚。采用40引脚PDIP封装的80C52单片机的引脚排列及逻辑符号如图2所示。由于工艺及标准化等原因,芯片的引脚数量是有限的,但单片机为实现控制所需要的信号数目却远远超过其引脚数目。为解决这一矛盾,单片机的某些信号引脚被赋以双重功能。1)电源及电源复位引脚:(1)VCC(40脚):正常操作时接+5V直流电源。(2)VSS (20脚):接地端。图3 40引脚PDIP封装的80C52单片机的引脚排列及逻辑符号图(3)RST/VPD(9脚):复位信号输入端。在该引脚上输入一定时间(约两个机器周期)的高电平将使单片机复位。该引脚的第二功能是VPD,即备用电源输入端。当主电源发生故障,降低到低电平规定值时,可将+5V备用电源自动接入VPD端,以保护片内RAM中的信息不丢失,使复电后能继续正常运行。(4)/VPP(31脚):访问程序存储器控制信号/编程电源输入。当保持高电平时,访问内部程序存储器,访问地址范围在04KB内;当PC(程序计数器)值超过0FFFH,即访问地址超出4KB时,将自动转向执行外部程序存储器内的程序;当保持低电平时,不管单片机内部是否有程序存储器,则只访问外部程序存储器(从0000H地址开始)。由此可见,对片内有可用程序存储器的单片机而言,端应接高电平,而对片内无程序存储器的单片机,可将接地。对于EPROM型单片机,在EPROM编程期间,此引脚用于施加21V的编程电源(VPP)。2)时钟振荡电路引脚XTAL1和XTAL2:(1)XTAL1(19脚):外接石英晶体和微调电容引脚1。它是片内振荡电路反向放大器的输入端。采用外部振荡器时此引脚接地。(2)XTAL2(18脚):外接石英晶体和微调电容引脚2。它是片内振荡电路反向放大器的输出端。采用外部振荡器时此引脚为外部振荡信号输入端。3) (30脚):低8位地址锁存控制信号/编程脉冲输入。在系统扩展时,ALE用于把P0口输出的低8位地址锁存起来,以实现低8位地址和数据的隔离。在访问外部程序存储器期间,ALE信号两次有效;而在访问外部数据存储器期间,ALE信号一次有效。对于EPROM型单片机,在EPROM编程期间,此引脚用于输入编程脉冲。4)(29脚):外部程序存储器的读选通信号输出端,低电平有效。在从外部程序存储器取指令(或常数)期间,此引脚定时输出负脉冲作为读取外部程序存储器的信号,每个机器周期两次有效,此时地址总线上送出的地址为外部程序存储器地址;在此期间,如果访问外部数据存储器和内部程序存储器,不会产生信号。5)并行双向输入/输出(I/O)口引脚:(1)P0口的P0.0P0.7引脚(3932脚):8位通用输入/输出端口和片外8位数据/低8位地址复用总线端口。(2)P1口的P1.0P1.7引脚(18脚):8位通用输入/输出端口。(3)P2口的P2.0P2.7引脚(2821脚):8位通用输入/输出端口和片外高8位地址总线端口。(4)P3口的P3.0P3.7引脚(1017脚):8位通用输入/输出端口,具有第二功能。2.2.4 外部总线构成所谓总线,就是连接单片机与各外部器件的一组公共的信号线。当系统要求扩展时,单片机要与一定数量的外部器件和外围设备连接。如果各部件及每一种外围设备都分别用各自的一组线路与CPU直接连接,那么连线将会错综复杂,甚至难以实现。为了简化硬件电路的设计和系统结构,常用一组线路,并配以适当的接口电路来与各个外部器件和外围设备连接,这组共用的连接线路就是总线。采用总线结构便于扩展外部器件和外围设备,而统一的总线标准则使不同设备间的互连更容易实现。利用片外引脚可以构造MCS-51系列单片机的三总线结构。单片机的引脚除了电源端VCC、接地端VSS、复位端RST、晶振接入端XTAL1和XTAL2、通用I/O口的P1.0P1.7以外,其余的引脚都是为实现系统扩展而设置的。用这些引脚构造的单片机系统的三总线结构如3所示。图4 MCS-51系列单片机片外三总线结构1)地址总线(Address Bus,AB):MCS-51系列单片机总共有16根地址线A15 A0,片外存储器可寻址范围达64KB(216=65536字节),由P2口直接提供高8位地址A15 A8,P0口经地址锁存器提供低8位地址A7 A0。2)数据总线(Data Bus,DB):MCS-51系列单片机总共有8根数据线D7D0,全由P0口提供。由于P0口是分时复用总线,分时输送低8位地址(通过地址锁存器锁存)和高8位数据信息。 3)控制总线(Control Bus,CB):控制总线由P3口的第二功能(P3.6)、(P3.7)和3根独立的控制线、ALE、组成。2.3 单片机时钟电路及时钟时序单位1) 时钟电路单片机本身如同一个复杂的同步时序电路,为了保证同步工作,电路应在唯一的时钟信号控制下,严格地按规定时序工作。而时钟电路就用于产生单片机工作所需要的时钟信号。MCS-52单片机时钟电路示意图如图4所示。图5 MCS-52单片机时钟振荡电路示意图在MCS-52芯片内部有一个高增益反相放大器,用于构成振荡器。反相放大器的输入端为引脚XTAL1,输出端为引脚XTAL2,在芯片的外部通过这两个引脚跨接晶体振荡器和微调电容C1、C2形成反馈电路,可构成稳定的自激振荡器,振荡频率范围通常是1.212MHz。晶体振荡频率高,则系统的时钟频率也高,单片机的运行速度也就快。振荡电路产生的振荡脉冲并不直接使用,而是经分频后再为系统所用。振荡脉冲在片内通过一个时钟发生电路二分频后才作为系统的时钟信号。片内时钟发生电路实质上是一个二分频的触发器,其输入来自振荡器,输出为二相时钟信号,即状态时钟信号,其频率为fosc/2;状态时钟三分频后为ALE信号,其频率为fosc/6;状态时钟六分频后为机器周期,其频率为fosc/12。在图4中,使用晶体振荡器时,C1、C2取值30±10pF;使用陶瓷振荡器时,C1、C2取值40±10pF。C1、C2的取值虽然没有严格的要求,但电容的大小影响振荡电路的稳定性和快速性,通常取值2030pF。在设计印制电路板时,晶振和电容等应尽可能靠近芯片,以减少分布电容,保证振荡器振荡的稳定性。也可以由外部时钟电路向片内输入脉冲信号作为单片机的振荡脉冲。这时外部脉冲信号是经XTAL1引脚引入的,而XTAL2引脚悬空或接地。对外部信号的占空比没有要求,但高低电平持续的时间不应小于20ns。这种方式常用于多块芯片同时工作,便于同步。其外部脉冲接入方式如图5所示。图6 MCS-52单片机外部时钟输入接线图所谓时序,是指在指令执行过程中,CPU的控制器所发出的一系列特定的控制信号在时间上的先后关系。CPU发出的控制信号有两类:一类是用于单片机内部的,用户不能直接接触此类信号,不必对它作过多了解;另一类是通过控制总线送到片外的,人们通常以时序图的形式来表示相关信号的波形及出现的先后次序。为了说明信号的时间关系,需要定义时序单位。89C52的时序单位共有四个,从小到大依次是拍节、状态、机器周期和指令周期。如图4所示。2.4单片机的复位2.4.1 复位状态复位是单片机的初始化操作,其主要功能是将程序计数器PC初始化为0000H,使单片机从0000H单元开始执行程序。除了进入系统的正常初始化外,当程序运行出错或操作错误使系统处于死锁状态时,也须重新启动单片机,使其复位。 单片机复位后,除P3P0的端口锁存器被设置成FFH、堆栈指针SP设置成07H和串行口的SBUF无确定值外,其它各专用寄存器包括程序计数器PC均被设置成00H。片内RAM不受复位的影响,上电后RAM中的内容是随机的。记住这些特殊功能寄存器的复位状态,对熟悉单片机操作,简短应用程序中的初始化部分是十分必要的。2.4.2 复位电路单片机的复位操作有上电自动复位和手动按键复位两种方式。上电自动复位操作要求接通电源后自动实现复位操作。如图1.5-1所示。图6(a)所示为最简单的复位电路。上电瞬间由于电容C上无储能,其端电压近似为零,RST获得高电平,随着电容器C的充电,RST引脚上的高电平将逐渐下降,当RST引脚上的电压小于某一数值后,单片机就脱离复位状态,进入正常工作模式。只要高电平能保持复位所需要的时间(约两个机器周期),单片机就能实现复位。相比于图6(a),图6(b)所示的电路只是增加了外接二极管VD和电阻R。其优越性在于停电后,二极管VD给电容C提供了快速放电通路,保证再上电时RST为高电平,从而保证单片机可靠复位。正常工作时,二极管反偏,对电路没影响。断电后,VCC逐渐下降,当VCC=0时,电容C通过VD迅速放电,恢复到无电量的初始状态,为下次上电复位做好准备。(a) (b)图6 上电自动复位电路手动按键复位要求在电源接通的条件下,用按钮开关操作使单片机复位,如图7所示。其工作原理为:复位键按下后,电容C通过R2放电,放电结束后,RST引脚的电位由R1和R2 分压决定,由于R2<<R1,因此,RST引脚为高电平,单片机进入复位状态,松开按键后,电容充电,RST上的电位降低,经过一定的延时,单片机就脱离复位状态,进入正常工作模式。R2的作用在于限流,避免按键按下的瞬间电容C放电产生火花,保护按键的触点。图7 手动按键复位电路系统上电运行后,若需要复位,一般是通过手动复位来实现的。通常采用手动复位和上电自动复位结合。复位电路虽然简单,但其作用十分重要。一个单片机系统能否正常运行,首先要检查是否能复位成功。初步检查可用示波器探头监视RST引脚,按下复位键,观察是否有足够幅度的波形输出(瞬时的),还可以通过改变复位电路阻容值的方法进行检测。3.Keil C51开发系统基本知识Keil C51开发系统基本知识系统概述Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。下面详细介绍Keil C51开发系统各部分功能和使用。2. Keil C51单片机软件开发系统的整体结构C51工具包的整体结构,如图(1)所示,其中uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。然后分别由C51及A51编译器编译生成目标文件(.OBJ)。目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。使用独立的Keil仿真器时,注意事项* 仿真器标配11.0592MHz的晶振,但用户可以在仿真器上的晶振插孔中换插其他频率的晶振。 * 仿真器上的复位按钮只复位仿真芯片,不复位目标系统。 * 仿真芯片的31脚(/EA)已接至高电平,所以仿真时只能使用片内ROM,不能使用片外ROM;但仿真器外引插针中的31脚并不与仿真芯片的31脚相连,故该仿真器仍可插入到扩展有外部ROM(其CPU的/EA引脚接至低电平)的目标系统中使用。4 电路及程序设计4.1 电路原理图设计按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。AT89C52单片机是美国ATMEL公司生产的低电压、高性能CMOS 8位单片机,具有丰富的内部资源:4kB闪存、128BRAM、32根I/O口线、2个16位定时/计数器、5个向量两级中断结构、2个全双工的串行口,具有4.255.50V的电压工作范围和024MHz工作频率,使用AT89C52单片机时无须外扩存储器。因此,本流水灯实际上就是一个带有八个发光二极管的单片机最小应用系统,即为由发光二极管、晶振、复位、电源等电路和必要的软件组成的单个单片机。从原理图中可以看出,如果要让接在P1.0口的LED1亮起来,那么只要把P1.0口的电平变为低电平就可以了;相反,如果要接在P1.0口的LED1熄灭,就要把P1.0口的电平变为高电平;同理,接在P1.1P1.7口的其他7个LED的点亮和熄灭的方法同LED1。因此,要实现流水灯功能,我们只要将发光二极管LED1LED8依次点亮、熄灭,8只LED灯便会一亮一暗的做流水灯了。在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。设计原理图如图8所示:图8流水灯硬件原理图总结本次课程设计我的课题是花样流水灯的设计,开始的几个星期我针对这个课题的任务要求从图书馆、上网等渠道获取相关信息,查找相关的参考资料,然后设定了本课题的设计方案。经过近多日的努力,终于将本次课程设计做完了,但由于水平有限,肯定有很多不恰当的地方,请老师指出其中的错误和不当之处,使我能做出改正,我会虚心接受。在本次课程设计过程中,我增强了自己的动手能力和分析能力。在以后的学习生活中,我会努力学习专业知识,完善自我,为将来的发展做好充分的准备。总之,在这次课程设计中,我受益匪浅,学到了很多书本上所没有的东西,懂得了理论和实际联系的重要性。在以后的学习中,我不仅要把理论知识掌握牢固,更要提高自己的动手能力和分析能力。参考文献1 胡汉才单片机原理与接口技术M北京:清华大学出版社,1995.62 楼然苗等51系列单片机设计实例M北京:北京航空航天出版社,2003.33 何立民. 单片机高级教程M北京:北京航空航天大学出版社,20014 赵晓安. MCS-51单片机原理及应用M. 天津:天津大学出版社,2001.35 肖洪兵. 跟我学用单片机M. 北京:北京航空航天大学出版社,2002.86 夏继强. 单片机实验与实践教程M. 北京:北京航空航天大学出版社, 20017于凤明单片机原理及接口技术M北京:中国轻工业出版社1998附录程序如下#include<reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char /延时void delay(uint k) uint i,j;for(i=k;i-;i>0)for(j=100;j-;j>0);void main() /主函数uchar temp0,temp1;uchar yi;uchar yi0,yi1; uint i,j,k,a,b;j=k=a=b=3;/全部亮P1=P2=0x00;delay(700);P1=P2=0xff;/每个io口独自亮for(i=2;i-;i>0)P1=0x00;delay(500);P1=0xff;P2=0x00;delay(500);P2=0xff;/全部亮,闪三次for(i=2;i-;i>0)P1=P2=0x00;delay(100);P1=P2=0xff;delay(100);/P1、P2亮for(i=3;i-;i>0)P1=0x00,P2=0x00;delay(500);P1=0xff,P2=0xff,delay(500);/四个点的流水while(j>0)temp0=0xfe,temp1=0x7f;P1=temp0,P2=temp1;delay(100);for(i=7;i-;i>0)temp0=_crol_(temp0,1),temp1=_cror_(temp1,1);P1=temp0,P2=temp1;delay(100); j-; /全部亮,闪三次for(i=3;i-;i>0)P1=P2=0x00;delay(300);P1=P2=0xff;delay(300);/四个IO口同样跟踪流水while(k>0)temp0=0xfe,temp1=0x7f;P1=temp0,P2=temp1;delay(60);for(i=7;i-;i>0)temp0=temp0<<1,temp1=temp1>>1;P1=temp0,P2=temp1;delay(60);k-; P1=P2=0xff; while(k<3) temp0=0x7f,temp1=0xfe; P1=temp0,P2=temp1; delay(60); for(i=7;i-;i>0) temp0=temp0>>1,temp1=temp1<<1;P1=temp0,P2=temp1;delay(60); k+; P2=0xff; /两边单个从上向下流水yi=0xfe;P1=yi;delay(50);for(i=7;i-;i>0)yi=_crol_(yi,1);P1=yi;delay(50);P1=0xff;yi=0xfe;P2=yi;delay(50);for(i=7;i-;i>0)yi=_crol_(yi,1);P2=yi;delay(50);P2=0Xff; /两边单个返回流水for(i=7;i-;i>0) yi=_cror_(yi,1);P2=yi;delay(50);P2=0xff;for(i=7;i-;i>0)yi=_cror_(yi,1);P1=yi;delay(50); /全部亮,闪三次P1=P2=0xff;for(i=3;i-;i>0)P1=P2=0x00;delay(100);P1=P2=0xff;delay(100); /流水灯yi0=0xfe,yi1=0x7f;P2=yi1,P1=yi0;delay(100);for(i=7;i-;i>0) yi0=yi0<<1, yi1=yi1>>1; P1=yi0,P2=yi1; delay(100);P1=P2=0xff;delay(200);yi0=0x7f,yi1=0xfe;P1=yi0,P2=yi1;for(i=7;i-;i>0)yi0=yi0>>1,yi1=yi1<<1;P1=yi0,P2=yi1;delay(100); /大循环跟踪流水P2=P1=0xff;for(i=8;i-;i>0) P1=P1<<1; delay(50);for(i=8;i-;i>0) P2=P2>>1; delay(50); /逆向大循环跟踪流水P2=P1=0xff;for(i=8;i-;i>0) P2=P2<<1; delay(50);for(i=8;i-;i>0) P1=P1>>1; delay(50); /全部亮,闪三次P1=P2=0xff;for(i=4;i-;i>0)P1=P2=0x00;delay(100);P1=P2=0xff;delay(100); /全部亮,只有一个暗的在流水temp0=0x01,temp1=0x00;P1=temp0,P2=temp1;delay(100);for(i=7;i-;i>0)temp0=_crol_(temp0,1);P1=temp0;delay(100);P1=0x00;temp1=0x01;P2=temp1;delay(100);for(i=7;i-;i>0)temp1=_crol_(temp1,1);P2=temp1;delay(100); /全部亮,逆向一个暗在流水temp0=0x00,temp1=0x80;P1=temp0,P2=temp1;delay(100);for(i=7;i-;i>0)temp1=_cror_(temp1,1);P2=temp1;delay(100);P2=0x00;temp0=0x80;P1=temp0;delay(100); for(i=7;i-;i>0)temp0=_cror_(temp0,1);P1=temp0;delay(100); /花样temp0=0xaa,temp1=0x55;P1=temp0,P2=temp1;delay(500);for(;a-;a>0)for(i=7;i-;i>0)temp0=_crol_(temp0,1),temp1=_cror_(temp1,1);P1=temp0,P2=temp1;delay(500);for(;b-;b>0)temp0=0xee,temp1=0x77;P1=temp0,P2=temp1;delay(300);for(i=7;i-;i>0)temp0=_crol_(temp0,1),temp1=_cror_(temp1,1);P1=temp0,P2=temp1;delay(300); /环形逐个亮P1=P2=0xff;for(i=8;i-;i>0) P2=P2<<1; delay(50);for(i=8;i-;i>0) P1=P1>>1; delay(50); /逐个熄灭for(i=7;i-;i>0)P2=P2<<1;P2=P2;delay(50);P2=0xff;for(i=7;i-;i>0)