课程设计报告课程名称:技能课课程设计系部:专业班级:学号:学生姓名:指导教师:完成时间: 2018.12.15报告成绩:1、问题分析 (1)2、总体设计思想 (2)3.具体实现方法 (3)4.硬件连线图及流程图 (4)5.主程序的流程图 (5)四、PROTEUS 调试过程及现象 (6)五、调试问题及解决方法 (10)六、源程序 (10)七、心得体会 (13)八、参考文献 (13)一、设计课题及要求1、课题内容:五彩灯以其流光溢彩的效果而广泛用于广告宣传和装饰美化方面。
本设计要求用51单片机控制八只霓虹灯 L1~L8,使其按以下九种状态循环显示。
2、动作要求:状态1:L1~L8依次点亮至全亮。
状态2:L8~L1依次熄灭至全灭。
状态3:L8~L1依次点亮至全亮。
状态4:L1~L8依次熄灭至全灭。
状态5:L1~L8依次轮流点亮。
状态6:L8~L1依次轮流点亮。
状态7:由中间向两边呈发散式点亮。
状态8:由两边向中间呈收拢式点亮。
状态9:全亮全灭闪烁3次。
按下停止键,灯全熄灭。
二、设计目的:通过解决实际问题,巩固和加深“单片机原理与应用”课程中所学的理论知识和实验能力,基本掌握单片机应用电路的一般设计方法,提高电子电路的设计和实验能力,加深对单片机软硬知识的理解,获得初步的应用经验,为以后从事生产和科研工作打下一定的基础。
三、具体设计内容:1、问题分析:该彩灯控制器是一种基于AT89C51 单片机的彩灯控制器,实现对LED 彩灯的控制。
本方案以AT89C51 单片机作为主控核心,与键盘、显示等模块组成核心主控制模块。
在主控模块上设有5 个按键和1 位七段码LED 显示器,根据用户需要可以编写若干种亮灯模式,根据各种亮灯时间的不同需要,利用软件产生的延时来控制在不同时刻输出灯亮或灯灭的控制信号,然后驱动灯亮或灭。
该新型LED 彩灯与普通LED 彩灯相比,具有体积小、价格低、低能耗等优点。
2、总体设计思想:五彩灯分为2 部分,即彩灯控制器<主控模块)和显示模块<受控模块)。
整个系统工作由软件程序控制运行,根据需要,用户可以在LED 彩灯工作时通过主控模块上的按键来控制LED 彩灯的不同的点亮模式。
上电后系统经过初始化,直接进入一号功能键模式。
再等待按键输入控制信号控制中断的来临并扫描按键进入中断子服务程序实现1 键、2 键、3 键、4 键和5 键的各种功能。
LED 彩灯控制器按照程序设定好的按下不同按键实现不同的5 个亮灯花样模式并显示按下的是几号功能键。
该系统中用了两个中断,其中前面四个功能共用一个外部INTT0 则5 号功能通过外部中断INTT1 来实现。
七段码LED 显示器用来显示当前是几号键已经按下,这两个功能都是通过查询而进入不同的中断子程序。
在硬件上单片机选用MSC-51 系列的80C51,P2 口输出控制信号控制LED 灯的亮或灭,单片机的串行输出接上74HC164 转换成并行输出来控制七段码LED显示器。
3.具体实现方法:本设计是基于AT89C51 单片机的键盘控制及显示电路设计,从系统的设计功能上看,系统可分为两大部分,即键盘输入控制部分和显示部分,对于每一个部分都有不同的设计方案,起初我对键盘和显示每个都拟订了下面两种方案:键盘部分:第一种方案:采用扫描键盘,可以用普通按键构成4×4 矩阵键盘,直接接到80C51 单片机的P1 口,高四位作为行,低四位作为列,通过软件完成键盘的扫描和定位。
这种方式相对下面的独立式键盘节省了很多的I/O 口。
第二种方案:键盘控制采用独立式按键 个按键的一端均接地,另一端直接和P1 口相连,在按键和P1 口之间通过10K 电阻与+5V 电源相连。
键盘通过检测输入线的电平状态就可以很容易地判断哪个键被按下了,这种方法操作速度高而且软件结构很简单,比较适合按键较少或操作速度较高的场合,这种独立式接口的应用很普遍。
显示部分:第一种方案:显示部分采用静态显示方法,所谓静态显示,就是每一个显示器都要占用一个独立的具有锁存功能的接口用于存储字形码。
这样单片机只要把要显示的字形代码发送到接口电路,从而输送至各数码管显示。
被显示的数据只要输出一次,直到要显示新的数据时,再发送新的字形码。
静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O 端口多,如驱动5 个数码管静态显示则需要5×8,40 根I/O 端口来驱动,<要知道一个89S51 单片机可用的I/O端口才32 个),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。
第二种方案:显示部分采用动态显示。
数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8 个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O 线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM 端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
通过分轮流控制各个数码管的的COM 端,就使各个数码管轮流受控显示,这就是动态驱动。
动态显示是利用人眼视觉暂留特性来实现显示的。
事实上,显示器上任何时刻只有一个数码管有显示。
因为各数码管轮流显示的时间间隔短、节奏快,人的眼睛反应不过来,因此看到的是连续显示的现象。
为防止闪烁延时的时间在1ms 左右,不能太长,也不能太短。
本设计可采用74HC164驱动七段数码管显示。
此方单片机的I/O 口占用较少,可以节约单片机接口资源,而且功耗更低。
因为本设计要求按键较少,且本次设计只是对所学知识的一次实践,设计要求简单,容易实现,成本低廉。
比较以上各种设计方案,采用独立式键盘,因为本系统只有一个七段数码管显示故显示部分选用静态,这样的设计比较适合本次设计,故最终决定选用这样的一种搭配设计方案。
对于LED 彩灯,将采用p2 口和1k 欧姆的限流电阻组成外围电路驱动LED 彩灯。
在程序设计方面,将显示程序做成一个中断子程序。
另外可以将键盘扫描程序置于中断程序中,采用扫描方式检测键盘的按键情况。
4.硬件连线图及流程图:图<2)硬件连线图硬件连接说明:本系统以8051 单片机为核心。
单片机采用内部振荡的方式。
P2 口通过1 欧姆的限流电阻与8 个LED 彩灯相连。
从串行口输出通过74HC164 输出LED 数码管的字形码,低电平有效。
4 个功能按键和P1 口相连,中间通过10K 的电阻与+5V 电源相连,按键另一端接地,P1 口低电平时表示按键被按下。
5.主程序的流程图:四、PROTEUS 调试过程及现象:上电后LED 数码管显示8,程序处于等待状态,LED 灯进入1 号功能键模式并待中断。
测到有键按下后,转到相应的中断子程序执行。
没有中断则循环当前的模式。
此时的模式为一号功能键模式即所有的灯都熄灭。
调试如图<4)所示:图<4)仿真初始状态图5号键按下后,产生中断,硬件自身识别外部中断0 或1,并扫描键盘进入相应的中断子程序。
此时产生外部中断并扫描键盘进入子程序实现5号键功能,LED 彩灯为全灭,LED 数码管显示1,此后一直循环此功能直到下一个中断产生才结束。
调试如图<5)所示:图<5)功能1 仿真图2 号键按下后,产生中断,硬件自身识别INTT0 或INTT1 并扫描键盘进入相应的中断子程序。
此时产生INTT0 中断并扫描键盘进入子程序实现2 号键功能,LED1----LED8 流动点亮,LED 数码管显示2,此后一直循环此功能直到下一个中断产生才结束。
调试如图<6)所示:图<6)功能2仿真图3 号键按下后,产生中断,硬件自身识别INTT0 或INTT1 并扫描键盘进入相应的中断子程序。
此时产生INTT0 中断并扫描键盘进入子程序实现3 号键功能,LED1----LED8 依次点亮,LED 数码管显示3,此后一直循环此功能直到下一个中断产生才结束。
调试如图<7)所示:图<7)功能3仿真图五、调试问题及解决方法:开始在硬件上想采用并行输出驱动七段数码管,但后来发现单片机的P1 口,P2 口都用上了,P3 口又作第二功能输出。
P0 口通常做数据复用总线,要作I/O借口那还得接上拉电阻,后来就采用了串行输出的办法来解决,所以选用了74HC164 进行串行和并行的转换再输出驱动数码管。
后来调试的时候又出现了问题,编写程序的时候把二号键的功能写在前面了,导致系统一上电就默认实现二号键功能,即LED 彩灯实现LED1----LED8 流动点亮。
还在硬件上的链接和软件有一点点的不错位,结果导致数码管不能正确显示按下的功能键,后来我们通过修改软件得到了纠正。
至于系统上电后默认的状态,我们就设为2 号键的功能,在软件上我们让系统设为一上电就执行1 号键的LED 彩灯亮或灭的程序,而数码管显示程序不执行,这样系统在默认的时候会使彩灯就是全灭。
对于数码管显示不正确我没就没有去修改软件区解决,而是我在硬件上进行了修改。
六、源程序:#include<reg52.h>Sbit k1=P1^0。
Sbit k2=P1^1。
Sbit k3=p1^2。
Sbit k4=P1^3。
Sbit k5=p1^4。
Sbit k6=p1^5。
Sbit k7=P1^6Sbit k8=P1^7Sbit k9=P1^8Unsigned char i。
Void delay(unsigned int i>{Unsigned int j。
While(i-->}{for(j=0。
j<115。
j++>{。
}void main(>{ P0=0xc0。
if(k1==0>{ P0=0xf9。
P2=0x00。
}If(k2==0>{ P0=0xa4。
P2=0x01。
Delay(500>。
P2=0x02。
Delay(500>。
P2=0x08。
Delay(500>。
P2=0x10。
Delay(500>。
P2=0x20。
Delay(500>。
P2=0x40。
Delay(500>。
P2=0x80。
Delay(500>。
}if(k3==0>{ P0=0xb0。
P2=0x01。
Delay(500>。
P2=0X03。
Delay(500>。
P2=0x07。
Delay(500>。
P2=0x0f。
Delay(500>。
P2=0x1f。
Delay(500>。
P2=0x3f。
Delay(500>。