一、系统设计本设计以STC89C52单片机为核心,用独立键盘控制模式的选择,STC89C52单片机接收到键盘信号后控制发光二极管以不同的模式闪烁的实验装置,用STC89C52单片机控制8个发光二极管发光,实现亮点的循环移动。通过Protel软件设计,布线排版,手工制版,并能掌握通过软件控制发光二极管的思路和技巧。这次设计重点就在于利用单片机的知识去控制系统的运行,图1-1为整体方案设计框图。图1-1总体方框图1.设计要求:a.上电复位。b.上电后数码管消隐,LED灯全灭。c.当按下第一个按键后数码管显示1第二个按键显示2以此类推。d.每个按键控制不同的闪烁模式。e.数码管显示有保持功能。独立键盘电路单片机系统LED灯电路数码显示管二、方案设计本设计总体设计思路为:以STC89C52单片机为核心,用独立键盘作STC89C52单片机的信号输入,STC89C52单片机接收到键盘信号后经单片机内部软件处理后将数据输出至P1口和P0口,使8发光二极管以不同的模式闪烁,并由七段数码管显示其闪烁模式编号。在课程设计中通过Protel软件设计原理图,布线排版,用万能版(单孔)手工焊接制作出实物。1.方案论证方案一:采用汇编语言编程的软件的STC89C52单片机系统。本方案设计的核心为STC89C52单片机系统,包括硬件和软件,硬件采用四位独立键盘做信号输入,STC89C52单片机进行信号处理并输出,显示部分为八个发光二级管和七段数码管,八个发光二极管采用共阴极接法,七段数码管采用共阳极的。软件采用Kell编辑的汇编语言程序,并烧写至STC89C52单片机。图2-1为方案一方框图图2-1方案一方框图汇编语言程序共阴极LED灯共阳极七段数码管52单片机独立键盘电路方案二:采用C语言编程的软件的STC89C52单片机系统。本方案设计的核心为STC89C52单片机系统,包括硬件和软件,硬件采用四位独立键盘做信号输入,STC89C52单片机进行信号处理并输出,显示部分为八个发光二级管和七段数码管,八个发光二极管采用共阳极接法,七段数码管采用共阴极的。软件采用Kell编辑的C语言程序,并烧写至STC89C52单片机。图2-2为方案二方框图。图2-2方案二方框图2.方案比较由于方案一软件部分采用的汇编语言编程较为复杂,其对STC89C52单片机硬件匹配度较高,所以其移植性也差,同时对于我来说汇编语言并不太熟练。又由于方案一八个发光二极管采用的是共阴极,七段数码管采用的是共阳极,这对编辑程序带来很大的麻烦。而方案二软件部分采用的是C语言编程,其对STC89C52单片机硬件匹配度较小,所以其移植性也好,同时对于我来说C语言比汇编语言更加熟练。又由于方案二八个发光二极管采用的是共阳极,七段数码管采用的是共阴极,这对编辑程序带来很大的方便。综上述,采用方案二更为适合。C语言程序单片机独立键盘电路共阳极LED灯共阴极七段数码管三、系统模块设计1.四位独立键盘键盘为本系统的唯一信号源,由于键盘为四位,只需要四个按键即可,而STC89C52单片机有24个I/O口,故四位键盘采用独立式键盘电路,按键采用4X4按键。当按键按下时,电路接通电源负极,此时想STC89C52单片机输入一个低电平,当按键没有按下时此时电路处于悬空状态。图3-1为四位键盘电路图。图3-1四位独立键盘电路2.数字显示模块7段数码管一般由8个发光二极管组成,其中由7个细长的发光二极管组成数字显示,另外一个圆形的发光二极管显示小数点。当发光二极管导通时,相应的一个点或一个笔画发光。控制相应的二极管导通,就能显示出各种字符,尽管显示的字符形状有些失真,能显示的数符数量也有限,但其控制简单,使有也方便。发光二极管的阳极连在一起的称为共阳极数码管,阴极连在一起的称为共阴极数码管。图3-27段数码管结构图发光二极管(LED是一种由磷化镓(GaP)等半导体材料制成的,能直接将电能转变成光能的发光显示器件。当其内部有一一电流通过时,它就会发光。7段数码管每段的驱动电流和其他单个LED发光二极管一样,一般为5~10mA;正向电压随发光材料不同表现为1.8~2.5V不等。7段数码管的显示方法可分为静态显示与动态显示,下面分别介绍。(1)静态显示所谓静态显示,就是当显示某一字符时,相应段的发光二极管恒定地寻能可截止。这种显示方法为每一们都需要有一个8位输出口控制。对于51单片机,可以在并行口上扩展多片锁存74LS573作为静态显示器接口。7段数码管内部字段LED和引脚分布共阳极共阴极静态显示器的优点是显示稳定,在发光二极管导通电注一定的情况下显示器的亮度高,控制系统在运行过程中,仅仅在需要更新显示内容时,CPU才执行一次显示更新子程序,这样大大节省了CPU的时间,提高了CPU的工作效率;缺点是位数较多时,所需I/O口太多,硬件开销太大,因此常采用另外一种显示方式——动态显示。(2)动态显示所谓动态显示就是一位一位地轮流点亮各位显示器(扫描),对于显示器的每一位而言,每隔一段时间点亮一次。虽然在同一时刻只有一位显示器在工作(点亮),但利用人眼的视觉暂留效应和发光二极管熄灭时的余辉效应,看到的却是多个字符“同时”显示。显示器亮度既与点亮时的导通电流有关,也与点亮时间和间隔时间的比例有关。调整电流和时间参烽,可实现亮度较高较稳定的显示。若显示器的位数不大于8位,则控制显示器公共极电位只需一个8位I/O口(称为扫描口或字位口),控制各位LED显示器所显示的字形也需要一个8位口(称为数据口或字形口)由于本设计只需一个数码管即可显示模式编号,所以本设计显示模块采用静态显示,七段数码管阴极直接与电源负极相连,段选数据(即七个阳极)与STC89C52单片机P0口连接。此设计方法电路简单,也便于软件部分的设计。图3-3为显示模块电路。图3-3显示模块电路3、STC89C52单片机STC89C52是一种带8K字节闪烁可编程可檫除只读存储器(FPEROM-FlashProgramableandErasableReadOnlyMemory)的低电压,高性能COMOS8的微处理器,俗称单片机。该器件采用ATMEL搞密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。1.时钟电路结构及工作原理STC89C52内部有一个用于构成振荡器的高增益反相放大器,引脚RXD和TXD分别是此放大器的输入端和输出端。时钟可以由内部方式产生或外部方式产生。内部方式的时钟电路如图4—10(a)所示,在RXD和TXD引脚上外接定时元件,内部振荡器就产生自激振荡。定时元件通常采用石英晶体和电容组成的并联谐振回路。晶体振荡频率可以在1.2~12MHz之间选择,电容值在5~30pF之间选择,电容值的大小可对频率起微调的作用。外部方式的时钟电路如图3-5(b)所示,RXD接地,TXD接外部振荡器。对外部振荡信号无特殊要求,只要求保证脉冲宽度,一般采用频率低于12MHz的方波信号。片内时钟发生器把振荡频率两分频,产生一个两相时钟P1和P2,供单片机使用。(a)内部方式时钟电路(b)外部方式时钟电路图3-5时钟电路2.复位及复位电路RST引脚是复位信号的输入端。复位信号是高电平有效,其有效时间应持续24个振荡周期(即二个机器周期)以上。若使用颇率为6MHz的晶振,则复位信号持续时间应超过4us才能完成复位操作。整个复位电路包括芯片内、外两部分。外部电路产生的复位信号(RST)送至施密特触发器,再由片内复位电路在每个机器周期的S5P2时刻对施密特触发器的输出进行采样,然后才得到内部复位操作所需要的信号。复位操作有上电自动复位相按键手动复位两种方式。上电自动复位是通过外部复位电路的电容充电来实现的,其电路如图4—4(a)所示。这佯,只要电源Vcc的上升时间不超过1ms,就可以实现自动上电复位,即接通电源就成了系统的复位初始化。按键手动复位有电平方式和脉冲方式两种。其中,按键电平复位是通过使复位端经电阻与Vcc电源接通而实现的,其电路如图4—4(b)所示;而按键脉冲复位则是利用RC微分电路产生的正脉冲来实现的,上述电路图中的电阻、电容参数适用于6MHz晶振,能保证复位信号高电平持续时间大于2个机器周期。由于本设计单片机系统使用12M晶振,所以本设计的复位电路采用图3-6上电复位方式。图3-6复位电路STC89C52具体介绍如下:①主电源引脚(2根)VCC(Pin40):电源输入,接+5V电源GND(Pin20):接地线②外接晶振引脚(2根)XTAL1(Pin19):片内振荡电路的输入端XTAL2(Pin20):片内振荡电路的输出端③控制引脚(4根)RST/VPP(Pin9):复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。ALE/PROG(Pin30):地址锁存允许信号PSEN(Pin29):外部存储器读选通信号EA/VPP(Pin31):程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。④可编程输入/输出引脚(32根)STC89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。PO口(Pin39~Pin32):8位双向I/O口线,名称为P0.0~P0.7P1口(Pin1~Pin8):8位准双向I/O口线,名称为P1.0~P1.7P2口(Pin21~Pin28):8位准双向I/O口线,名称为P2.0~P2.7P3口(Pin10~Pin17):8位准双向I/O口线,名称为P3.0~P3.7STC89C52主要功能如表二所示。表一STC89C52主要功能主要功能特性兼容MCS51指令系统8K可反复擦写FlashROM32个双向I/O口256x8bit内部RAM316位可编程定时/计数器中断时钟频率0-24MHz2个串行中断可编程UART串行通道2个外部中断源共6个中断源2个读写中断口线3级加密位低功耗空闲和掉电模式软件设置睡眠和唤醒功能四、软件设计本设计单片机系统的软件采用模块化设计,由主程序、查表子程序和延时子程序组成。各程序模块的流程图如图4-1所示:主程序处于循环工作状态,主要完成各种模式闪烁花样灯,并用静态显示方式送到数码管显示模式编号。图4-1为软件程序流程图。图4-1软件程序流程图五、参考文献郭天祥:《新概念51单片机C语言教程》唐方红饶欲:《单片机原理与接口及顺》附录1:软件程序#includereg52.h#includeintrins.h#defineuintunsignedint#defineucharunsignedcharvoiddelayms(uint);sbitkey0=P2^0;sbitkey1=P2^1;sbitkey2=P2^2;sbitkey3=P2^3;uintcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voidmain(){P0=0;while(1){if(key0==0){delayms(10);if(key0==0){uchari;P0=table[1];i=5;while(i!=0){P1=0x00;delayms(300);P1=0xff;delayms(300);i--;}i=5;while(i!=0){P1=0xf0;delayms(300);P1=0x0f;delayms(300);i--;}while(!key0);}P1=0xff;}if(key1==0){delayms(10);if(key1==0){uchari;P0=table[2];i=5;while(i!=0){P1=0xaa;delayms(300);P1=0x55;delayms(300);i--;}i=3;while(i!=0){ucharj;for(j=3;j0;j--){P1=0xaa;delayms(300);P1=0xff;delayms(300);}for(