单片机彩灯控制.docx
《单片机彩灯控制.docx》由会员分享,可在线阅读,更多相关《单片机彩灯控制.docx(29页珍藏版)》请在冰豆网上搜索。
单片机彩灯控制
目录
摘要2
引言3
1彩灯控制器方案设计和选择4
1.1设计要求4
1.2系统功能4
1.3方案选择5
2彩灯控制器设计过程7
2.1元件选取7
2.2硬件设计7
2.2.1AT89C52管脚说明图8
2.2.2AT89C52主要特性9
2.2.3主控模块9
2.2.474HC595管脚说明10
2.2.574HC595主要特性10
2.2.6驱动模块10
2.2.7显示模块简介12
2.2.8彩灯控制器总图12
2.3软件设计13
2.3.1语言选择13
2.3.2程序功能说明14
2.3.3主程序流程图15
2.3.4程序简介15
2.3.5编写程序15
3彩灯控制器的仿真与调试18
结论与心得22
参考文献23
附录23
致谢27
摘要
本设计是一种基于AT89C52单片机的彩灯控制方案,实现对LED彩灯的控制。
本方案以AT89C52单片机作为主控核心,用32个LED构成显示模块、用74HC595作为驱动模块,由编程实现亮灯循环模式。
由在显示模块上有32个LED彩灯,根据用户需要可以编写若干种亮灯模式.本系统具有体积小、硬件少、电路结构简单及容易操作和阅读等优点。
该LED彩灯控制器实际应用效果较好,亮灯模式多。
与其他LED彩灯相比,具有体积小、价格低、低能耗等优点。
在能源比较匮乏的今天,彩灯的循环控制在显示方面更表现出一种节约能源的魅力.这将使彩灯具有更广阔的发展天地。
关键字:
AT89C5174HC595循环LED彩灯
Abstract
ThedesignisaprojectofthecolourlanterncontrolwhichbasedonaAT89c52single-chiptoachievethecontroloftheLEDlanterns.ThemastercoreofthedesignisAT89c52single-chip,thedisplaymoduleisformedwith32LEDS,thedrivemoduleofthedesignuse74HC595,theprogrammeachievethecirclemodeofthecolourLEDS.The32LEDSonthedisplaymodulecanbecompiledalotofmodesbasedontheneedsoftheusers。
Thissystemhassomeexcellencesofsmallbulk,fewhardware,simplecircuitframe,easyhandleandread.Thepracticeapplianceeffectofthiscolourlanterncontrolisbetterandlotsofmodesofthecolourlantern.ThisLEDhassomeexcellencesofsmallbulk,lowprice,lowenergyconsumecomparedwithelseLEDS.Inlackenergytoday,theLEDcirclemodecomportsacharmoftheeconomyingenergyonthedisplay.ThiswillletsLEDhasmoreamplitudeheavenandearthtodevelop.
Keywords:
AT89C5174HC595CirculateLEDLantern
引言
随着人们生活环境的不断改善和美化,在许多场合可以看到彩色霓虹灯。
LED彩灯由于其丰富的灯光色彩,低廉的造价以及控制简单等特点而得到了广泛的应用。
彩灯的运用已经遍布于人们的生活中,从歌舞厅到卡拉OK包房,从节的祝贺到常生活中的点缀。
这些不紧说明了我们对生活的要求有了质的飞跃,也说明科技在现实运用中有了较大的发展,用彩灯来装饰街道和城市建筑物已经成为一种时尚。
但目前市场上各式样的LED彩灯控制器大多数用全硬件电路实现,电路结构复杂、功能单一,这样一旦制作成品只能按照固定的模式闪亮,不能根据不同场合、不同时间段的需要来调节亮灯时间、模式、闪烁频率等动态参数。
这种彩灯控制器结构往往有芯片过多、电路复杂、功率损耗大等缺点。
此外从功能效果上看,亮灯模式少而且样式单调,缺乏用户可操作性,影响亮灯效果。
因此有必要对现有的彩灯控制器进行改进。
本文提出了一种基于AT89C52单片机的彩灯控制方案,实现对LED彩灯的控制。
1彩灯控制器方案设计和选择
1.1设计要求
本次毕业设计要求设计一个可编程彩灯控制器,其设计要求如下:
1、用32个发光二极管作为显示电路。
2、实现LED动态显示。
3、能连续循环显示。
1.2系统功能
彩灯控制器可直接与220V交流市电相连接,经过开关电源变换,输出直流工作电压,一方面为管内LED模块提供12V工作电源,另一方面为主控模块单片机系统提供5V工作电源。
整个系统工作由软件程序控制运行。
上电后,彩灯控制器按程序设计好的模式进行显示,由全灭→按程序显示→全都熄灭为一个周期。
然后循环继续工作。
1.3方案选择
方案1:
可只采用AT89C51作为主控芯片,将P1口的P10P11P12P13分别接8个LED实现显示,可用C语言或者汇编语言编程实现。
方案框图如图1:
此方案电路比较简单,编程亦简单,但显示比较单调。
方案2:
可采用AT89C52作为主控制芯片,用74LS164作为驱动,用4个164分别接8个LED,32个LED构成显示模块。
可用C或者汇编编程实现。
方案框图如图2:
图2
方案2用了164作为驱动,编程有些复杂,实现功能比方案1多,但164不具有数据锁存功能,显示不稳定,容易受干扰。
方案3:
可用AT89C52作为主控芯片,用74HC595作为驱动,用4个595分别接8个LED,32个LED构成显示模块。
可用C或者汇编编程实现。
方案框图如图3:
图3
方案3采用595作为驱动,由于595有数据锁存功能,显示稳定,不易受干扰,显示方案也比方案1多。
综合考虑:
本设计采AT89C52作为主控芯片,595作为驱动,实现彩灯循环显示。
2彩灯控制器设计过程
2.1元件选取
名称
规格型号
数量
面包板
…
1
微处理器
AT89C52
1
I/O扩展
74HC595
4
电阻
5.1k,1k,10k
32,1,2
电容
30pf
2
极性电容
10vf
1
晶振
11.0592MHZ
1
按钮
…
1
LED(R)
…
16
LED(G)
…
16
2.2硬件设计
2.2.1AT89C52管脚说明图
VCC:
供电电压。
GND:
接地。
P0口:
P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口。
作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用。
在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。
在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
P1口:
P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
与AT89C51不同之处是,P1.0和P1.1还可分别作为定时/计数器2的外部计数输入(P1.0/T2)和输入(P1.1/T2EX),参下表。
Flash编程和程序校验期间,P1接收低8位地址。
表.P1.0和P1.1的第二功能
引脚号
功能特性
P1.0
T2,时钟输出
P1.1
T2EX(定时/计数器2)
P2口:
P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口P2写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
在访问外部程序存储器或16位地址的外部数据存储器时,P2口送出高8位地址数据。
在访问8位地址的外部数据存储器时,P2口输出P2锁存器的内容。
Flash编程或校验时,P2亦接收高位地址和一些控制信号。
P3口:
P3口是一组带有内部上拉电阻的8位双向I/O口。
P3口输出缓冲级可驱动4个TTL逻辑门电路。
对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。
此时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。
P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。
RST:
复位输入。
当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
振荡器特性:
AT89C52中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。
这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成自激振荡器。
外接石英晶体(或陶瓷谐振器)及电容C1、C2接在放大器的反馈回路中构成并联振荡电路。
使用石英晶体,我们推荐电容使用30pF±10pF,使用陶瓷谐振器建议选择40pF±10F。
用户也可以采用外部时钟。
这种情况下,外部时钟脉冲接到XTAL1端,即内部时钟发生器的输入端,XTAL2则悬空。
2.2.2AT89C52主要特性
兼容MCS51指令系统,8k可反复擦写(>1000次)FlashROM
32个双向I/O口·,256x8bit内部RAM
3个16位可编程定时/计数器中断,时钟频率0-24MHz
2个串行中断,可编程UART串行通道
2个外部中断源,共6个中断源
2个读写中断口线,3级加密位
低功耗空闲和掉电模式,软件设置睡眠和唤醒功。
2.2.3主控模块
本设计用AT89C52作为主控模块,用P10口作为信号口与驱动模块相连。
AT89C52单片机作为主控模块,由C1,C2和X1构成振荡器,引脚XTAL1和XTAL2分别是输入端和输出端。
P1口的P10作为信号输出,将控制程序烧入单片机上电后开始工作。
2.2.474HC595管脚说明
Q0…Q715,1,7并行数据输出
GND8地
Q7’9串行数据输出
MR10主复位(低电平)
SHCP11移位寄存器时钟输入
STCP12存储寄存器时钟输入
OE13输出有效(低电平)
DS14串行数据输入
VCC16电源
2.2.574HC595主要特性
8位串行输入/8位串行或并行输出存储状态寄存器,三种状态输出寄存器可以直接清除100MHz的移位频率。
并行输出,总线驱动。
595移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。
2.2.6驱动模块
本设计用74HC595作为驱动,有4个74HC595构成驱动模块,将单片机的P10,P11,P12,P13口分别与595的SH_CP,DS,ST_CP,MR相连,并注上相应标号。
DS作为数据口,SH_CP和ST_CP作为时钟,第一个595的输入端DS与P11口相连,第一个595输出端与第二个595输入端相连,直到连到最后一个。
将输出端与LED相连构成驱动模块。
驱动模块图如图4:
图4
驱动模块工作原理:
本设计采用AT89C52的P10口输出信号,P11和P12作为时钟输入,用了4个74HC595。
上电后P10口输出信号给595,74HC595是含8位串入、串/并出移位寄存器和8位三态输出锁存器。
寄存器和锁存器都有自己的时钟输入,都是上升沿有效。
当SH_CP从低到高电平跳变时,串行输入数据移入寄存器;当ST_CP从低到高电平跳变时,寄存器的数据置入锁存器;清除端MR的低电平只对寄存器复位(Q7为低电平),而对锁存器无影响。
当输出允许控制E为高电平时,并行输出(O0-O7)为高阻态,而串行输出(Q7)不受影响。
74HC595最多只需要5根控制线,即SH_CP、DS、ST_CP、MR和E。
其中MR可以直接接到高电平,用软件来实现寄存器清零;把SH_CP、ST_CP、MR三根线和单片机的P10、P13、P12口相接,数据从DS口送入74HC595,在每个SH_CP的上升沿,DS口上的数据移入寄存器,在SH_CPMR的第9个上升沿,数据开始从Q7移出。
把第一个74HC595的Q7和第二个74HC595的DS相连,数据即移入第二个74HC595中,照此一个一个接下去,直到接到第4个。
数据全部送完后,给ST_CP一个上升沿,寄存器中的数据置入锁存器。
如果E为低电平,数据即从并口O0-O7输出,把O0-O7与八个LED相连,LED就可以实现显示了。
2.2.7显示模块简介
显示模块有32个LED构成,分成4行8列,每行8个,每列4个。
每个LED分别与1K的电阻相连,在接上电源。
当程序烧入单片机,上电后在595的驱动下按程序循环显示。
如图5:
图5
2.2.8彩灯控制器总图
将主控模块,驱动模块,显示模块连接起来构成控制器总图。
将程序烧入单片机,上电后,信号由P1口输出送入595,在由595驱动显示模块按程序设定的模式循环显示。
如图6:
图6
2.3软件设计
2.3.1语言选择
新型LED彩灯控制器最大特点在于所有亮灯模式均由软件控制完成。
本设计采用AT89C51单片机为主控芯片,所以程序实现可以用汇编语言或C语言,也可以汇编和C混合使用。
汇编语言有其一定的优点,比如:
能够直接访问与硬件相关的存储器或I/O端口;能够不受编译器的限制,对生成的二进制代码进行完全的控制;能够根据特定的应用对代码做最佳的优化,提高运行速度;能够最大限度地发挥硬件的功能;用汇编语言编写的程序比用高级语言编写的程序所要求的存储空间与执行时间将显著减少等。
但是汇编语言是一种层次非常低的语言,它仅仅高于直接手工编写二进制的机器指令码,因此不可避免地存在一些缺点。
比如:
编写的代码非常难懂,不好维护;很容易产生Bug,难于调试;只能针对特定的体系结构和处理器进行优化;开发效率很低,时间长且单调。
使用汇编语言编写的程序,机器不能直接识别,要由一种程序将汇编语言翻译成机器语言等。
而C语言也有其缺点,主要是表现在数据的封装性上,这一点使得C在数据的安全性上做的有很大缺陷;C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。
但是C语言简洁紧凑、灵活方便、运算符丰富、数据结构丰富、C语法限制不太严格,程序设计自由度大、C语言允许直接访问物理地址,可以直接对硬件进行操作、C语言程序生成代码质量高,程序执行效率高,一般只比汇编程序生成的目标代码效率低10へ20%,C语言适用范围大,可移植性好。
由于本设计需要仿真调试,经过综合考虑,选用C语言编程实现对LED彩灯的控制。
2.3.2程序功能说明
LED彩灯控制器所有亮灯模式均由软件控制完成。
可以根据需要来确定各种模式工作时间Ti,以及确定在各种亮灯模式Model_i内点亮和熄灭各种颜色LED灯的时刻。
整个系统软件由主程序(Main)、各个模式子程序(Model_i)、显示子程序(Display)等程序组成。
根据模式需要计算好各控制信号的发生时刻,根据不同的模式Model_i可以设定不同的工作时间Ti通过P1口输出,使LED彩灯按照设计的模式工作。
亮灯模式子程序Model_i可以编写若干(n种),只要控制好各色灯触发和熄灭时刻就可以组合成各种亮灯效果。
本设计的功能是通过改变LED亮灭方式使彩灯轮流显示,上电后在缺省状态顺序调用Model_i花样亮灯模式,由从右到左同步依次点亮→两列一组从右到左同步依次点亮→6,7,8列点亮→2,3,4列点亮→右4列亮左4列灭→右四列灭左4列亮→3,4,7,8列亮→2,3,4,6,7,8列亮→全亮→奇数列亮→偶数列亮→从两边到中间依次点亮→从中间到两边依次熄灭→前两行亮后两行灭→前两行灭后两行亮→左4列亮右4列灭→左4列灭右四列亮→对角亮→OK图形构成亮灯模式的循环。
2.3.3主程序流程图
2.3.4程序简介
本设计用了P1口的P10,P11,P12和P13。
程序有主程序,子程序,延时程序。
定义LED低电平亮高电平灭。
由于显示方式比较多,需要定义一个数组来存放显示数据。
当显示方式比较简单逐个点亮时还可以调用流水灯程序段。
延时一定时间后按显示数据依次显示下去直到最后一种显示方式。
延时一定时间后循环继续显示。
2.3.5编写程序
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineulongunsignedlong
#defineBUF_LONG42
sbitST_CP=P1^3;
sbitSH_CP=P1^0;
sbitMR=P1^2;
sbitDS=P1^1;
voiddelay_ms(uint);
voidwrit_data(ulong);
ulongcodedata_buf[BUF_LONG]={
0xfefefefe,0xfdfdfdfd,0xfbfbfbfb,0xf7f7f7f7,0xefefefef,0xdfdfdfdf,0xbfbfbfbf,0x7f7f7f7f,0xfcfcfcfc,0xf3f3f3f3,0xcfcfcfcf,0x3f3f3f3f,0xf8f8f8f8,0x8f8f8f8f,0xf0f0f0f0,0x0f0f0f0f,0xcccccccc,0x88888888,0x00000000,0x7f7f7f7f,0x5f5f5f5f,0x57575757,0x55555555,0xbfbfbfbf,0xafafafaf,0xabababab,0xaaaaaaaa,0x7e7e7e7e,0x3c3c3c3c,0x18181818,0x00000000,0x18181818,0x3c3c3c3c,0x7e7e7e7e,0xffffffff,0x0000ffff,0xffff0000,0x0f0f0f0f,0xf0f0f0f0,0x0f0ff0f0,0xf0f00f0f,0xf61313f6
};
voidmain()
{
ulongtxdata=0x1;
uchari;
ST_CP=0;
SH_CP=0;
MR=0;
ST_CP=1;
ST_CP=0;
MR=1;
delay_ms(800);
writ_data(0XFFFFFFFF);
delay_ms(800);
while
(1)
{
for(i=0;i{
writ_data(data_buf[i]);
delay_ms(800);
}
}
/*while
(1)
{
txdata=(0x01);
for(i=32;i;i--)
{
writ_data(~txdata);
txdata<<=1;
delay_ms(400);
}
}*/
}
voidwrit_data(ulongtxdata)
{
uchari;
SH_CP=0;
ST_CP=0;
for(i=32;i;i--)
{
txdata<<=1;
DS=CY;
SH_CP=1;
SH_CP=0;
}
ST_CP=1;
ST_CP=0;
}
voiddelay_ms(uintt)
{
uintt1;
for(;t;t--)
{
for(t1=110;t1;t1--);
}
}
3彩灯控制器的仿真与调试
本设计采用Proteus.Professional(单片机仿真软件)进行仿真,由于电路图是用Protel99SE所绘制,Proteus不能识别,所以进行仿真前打开Proteus新建文件→添加元件→在新建文件界面放置元件→布局→连线→修改。
确定无误后保存。
程序则由KEIL编译,编译成功后保存。
在打开Proteus→打开电路图→双击单片机→添加程序→点击开始→进行仿真。
若不能实现预期效果,则检查电路图和程序进行修改,直致实现按程序中数组(0xfefefefe,0xfdfdfdfd,0xfbfbfbfb,0xf7f7f7f7,0xefefefef,0xdfdfdfdf,0xbfbfbfbf,0x7f7f7f7f,0xfcfcfcfc,0xf3f3f3f3,0xcfcfcfcf,0x3f3f3f3f,0xf8f8f8f8,0x8f8f8f8f,0xf0f0f0f0,0x0f0f0f0f,0xcccccccc,0x88888888,0x00000000,0x7f7f7f7f,0x5f5f5f5f,0x57575757,0x55555555,0xbfbfbfbf,0xafafafaf,0xabababab,0xaaaaaaaa,0x7e7e7e7e,0x3c3c3c3c,0x18181818,0x00000000,0x18181818,0x3c3c3c3c,0x7e7e7e7e,0xffffffff,0x0000ffff,0xffff0000,0x0f0f0f0f,0xf0f0f0f0,0x0f0ff0f0,0xf0f00f0f,0xf61313f6)显示的结果。
部分仿真图如下:
此图为左4列亮右4列灭显示方式,对应程序数组中的0x0f0f0f0f显示方式。
此图是3,4列和7,8列同时亮显示方式,对应程序数组中的0xcccccccc显示方式。
此图是奇数列亮显示方式,对应程序数组中的0x55555555显示方式。
此图是偶数列显示方式,对应程序数组中的0xaaaaaaaa显示方式。
此图是对角亮显示方式,对应程序数组中的0x0f0ff0f0显示方式。
此图是最后一种显示方式“OK”,对应程序数组中的0xf61313f6显示方式。
结论与心得
在本设计过程中虽然遇到很多困难,但是从中收获很多。
本设计主要是用单片机设计彩灯控制器,用C语言编程实现对彩灯亮灭模式的