DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2508|回复: 1
打印 上一主题 下一主题

[待整理] 基于单片机的LED彩灯控制器

[复制链接]
跳转到指定楼层
楼主
发表于 2015-5-2 10:46:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
  1  引言   随着人们生活环境的不断改善和美化,在许多场合可以看到彩色霓虹灯LED 彩灯由于其丰富的灯光色彩,低廉的造价以及控制简单等特点而得到了广泛的应用,用彩灯来装饰已经成为一种时尚。但目前市场上各式样的 LED 彩灯控制器大多数用全硬件电路实现,电路结构复杂、功能单一,这样一旦制作成品只能按照固定的模式闪亮,不能根据不同场合、不同时间段的需要来调节亮灯时间、模式、闪烁频率等动态参数。这种彩灯控制器结构往往有芯片过多、电路复杂、功率损耗大等缺点。此外从功能效果上看,亮灯模式少而且样式单调,缺乏用户可操作性,影响亮灯效果。因此有必要对现有的彩灯控制器进行改进。
  本文提出了一种基于AT89S51单片机的彩灯控制方案,实现对LED彩灯的控制。
  2  设计原理
  2.1 MCS51
  引脚说明
  MCS单片机都采用40引脚的双列直插封装方式。图1为引脚排列图, 40条引脚说明如下:
  (1)主电源引脚Vss和Vcc
  ① Vss接地
  ② Vcc正常操作时为+5伏电源
  (2)外接晶振引脚XTAL1和XTAL2
  ① XTAL1内部振荡电路反相放大器的输入端,是外接晶体的一个引脚。当采用外部振荡器时,此引脚接地。
  ② XTAL2内部振荡电路反相放大器的输出端。是外接晶体的另一端。当采用外部振荡器时,此引脚接外部振荡源。


图1 8051引脚排列图

  (3)控制或与其它电源复用引脚RST/VPD,ALE/PROG,EA和/Vpp
  ① RST/VPD 当振荡器运行时,在此引脚上出现两个机器周期的高电平(由低到高跳变),将使单片机复位
  在Vcc掉电期间,此引脚可接上备用电源,由VPD向内部提供备用电源,以保持内部RAM中的数据。
  ② ALE/PROG正常操作时为ALE功能(允许地址锁存)提供把地址的低字节锁存到外部锁存器,ALE 引脚以不变的频率(振荡器频率的1/6)周期性地发出正脉冲信号。因此,它可用作对外输出的时钟,或用于定时目的。但要注意,每当访问外部数据存储器时,将跳过一个ALE脉冲,ALE 端可以驱动(吸收或输出电流)八个LSTTL电路。   对于EPROM型单片机,在EPROM编程期间,此引脚接收编程脉P冲(PROG功能)
  ③PSEN外部程序存储器读选通信号输出端,在从外部程序存储取指令(或数据)期间,在每个机器周期内两次有效。同样可以驱动八LSTTL输入。
  ④ EA/Vpp 、EA/Vpp为内部程序存储器和外部程序存储器选择端。当EA/Vpp为高电平时,访问内部程序存储器,当/Vpp 为低电平时,则访问外部程序存储器。
  对于EPROM型单片机,在EPROM编程期间,此引脚上加21伏EPROM编程电源(Vpp)。
(4)输入/输出引脚P0.0 - P0.7,P1.0 - P1.7,P2.0 - P2.7,P3.0 - P3.7。
  ① P0口(P0.0 - P0.7)是一个8位漏极开路型双向I/O口,在访问外部存储器时,它是分时传送的低字节地址和数据总线,P0口能以吸收电流的方式驱动八个LSTTL负载。
  ② P1口(P1.0 - P1.7)是一个带有内部提升电阻的8位准双向I/O口。能驱动(吸收或输出电流)四个LSTTL负载……
  ③ P2口(P2.0 - P2.7)是一个带有内部提升电阻的8位准双向I/O口,在访问外部存储器时,它输出高8位地址。P2口可以驱动(吸收或输出电流)四个LSTTL负载。
  ④ P3口(P3.0 - P3.7)是一个带有内部提升电阻的8位准双向I/O口。能驱动(吸收或输出电流)四个LSTTL负载。
  2.2 LED显示数码管
  LED有共阴极和共阳极两种。如图所示。二极管的阴极连接在一起,通常此公共阴极接地,而共阳极则将发光二极管的阳极连接在一起,接入+5V的电压。一位显示器由8个发光二极管组成,其中7个发光二极管构成字型“8”的各个笔划(段)a~g,另一个小数点为dp发光二极管。当在某段发光二极管施加一定的正向电压时,该段笔划即亮;不加电压则暗。为了保护各段LED不被损坏,需外加限流电。




LED数码管结构原理图

  AT89C2051芯片的20个引脚功能为:
  VCC  电源电压。
  GND  接地。
  RST   复位输入。当RST变为高电平并保持2个机器周期时,所有I/O引脚复位至“1”。
  XTAL1  反向振荡放大器的输入及内部时钟工作电路的输入。
  XTAL2  来自反向振荡放大器的输出。
  P1口  8位双向I/O口。引脚P1.2~P1.7提供内部上拉,当作为输入并被外部下拉为低电平时,它们将输出电流,这是因内部上拉的缘故。P1.0和P1.1需要外部上拉,可用作片内精确模拟比较器的正向输入(AIN0)和反向输入(AIN1),P1口输出缓冲器能接收20mA电流,并能直接驱动LED显示器;P1口引脚写入“1” 后,可用作输入。在闪速编程与编程校验期间,P1口也可接收编码数据。
  P3口  引脚P3.0~P3.5与P3.7为7个带内部上拉的双向I/0引脚。P3.6在内部已与片内比较器输出相连,不能作为通用I/O引脚访问。P3口的输出缓冲器能接收20mA的灌电流;P3口写入“1”后,内部上拉,可用输入。P3口也可用作特殊功能口。

  2.3 中断指令
  在CPU和外设交换信息时,存在着快速CPU和慢速外设间的矛盾,机器内部有时也可能出现突发事件,为此,计算机中通常采用中断技术。
  CPU和外设并行工作,当外设数据准备好( 或有某种突发事件发生)时向CPU提出请求,CPU暂停正在执行的程序转而为该外设服务(或处 理紧急事件),处理完毕再回到原断点继续执行原程序。
  中断优先级:当有多个中断源同时 向CPU申请中断时,CPU优先响应最需紧急处理的中断请求,处理完毕再响应优先级别较低的 ,这种预先安排的响应次序。
中断的嵌套:在中断系统中,高优先级的 中断请求能中断正在进行的较低级的中断源处理,
  (1)中断技术是实时控制中的常用技术,51系列单片机有三个内部中断,二个外部中断。所谓 外部中断就是在外部引脚上有产生中断所需要的信号。
  每个中断源有固定的中断服务程序的入口地址(称矢量地址或向量地址)。当CPU响应中断以 后单片机内部硬件保证它能自动的跳转到该地址。因此,此地址是应该熟记的,在汇编程序 中,中断服务程序应存放在正确的向量地址内。
  (或存放一条转移指令);而在C语言中是靠Interrupt n的关键字n自动设置的。
  (2)单片机的中断是靠内部的寄存器管理的,这就是中断允许寄存器IE,中断优先权寄存器IP ,必须在CPU开中断即开全局中断开关EA,开各中断源的中断开关,CPU才能响应该中断源的 中断请求,其中缺一不可。
  (3)从程序表面看来,主程序和中断服务程序好象是没有关连的,只有掌握中断响应的过程, 才能理解中断的发生和返回,看得懂中断程序,并能编写高质量中断程序。

表2.1 常用中断

  
符号


中断服务程序入口
INT0
外部中断0
P3.2引脚的低电平或下降沿信号
0003H

INT1
外部中断1

P3.3引脚的低电平或下降沿信号
0013H

T0
定时器0中断
定时计数器0计数回零溢出
000BH
T1
定时器1中断
定时计数器1计数回零溢出
001BH
T2
定时器2中断
定时计数器2中断(TF2T2EX信号)
002BH

TI/RI
串行口中断
串行通信完成一帧数据发送或接收引起中断
0023H

  3  硬件原理图
  晶振(12MHz)定时1秒,对于12MHz的晶振而言,其时钟周期T=1/f=1/12us,而89C51的一个机器周期包括12个时钟周期,所以一个机器周期为1us,对于T0而言,使之工作于16-bit,最大计时为65536*1=65536us,需要多次定时才能实现一秒定时。


  4  软件设计

  4.1 流程图

4.2 源程序
  ORG 0000H                     ;中断入口程序;
  LJMP START
  ORG 0003H
  RETI
  ORG 000BH
  RETI
  ORG 0013H
  RETI
  ORG 001BH
  RETI
  CLEAR: RET;                ; 初始化程序
  ;START:ACALL CLEAR         ; 主 程 序
  STAR1:MOV P3,#0FFH
  JNB P3.2,FUN2
  JNB P3.3,FUN3              ;关闭按纽
  JNB P3.4,FUN0
  JNB P3.5,FUN1
  JNB F0,STAR1               ;曾经有键按下F0置1
  RET;
  FUN0:LCALL DL10MS          ;消除抖动
  JB P3.4,STAR1
  WAITL0:JNB P3.4,WAITL0     ;等待键释放
  SETB F0
  FUN01:LCALL FUN00
  LCALL STAR1
  LJMP FUN01;
  FUN1:LCALL DL10MS          ;消除抖动
  JB P3.5,STAR1
  WAITL1:JNB P3.5,WAITL1       ;等待键释放
  SETB F0
  FUN10:LCALL FUN11
  LCALL STAR1
  LJMP FUN10;
  FUN2:LCALL DL10MS            ;消除抖动
  JB P3.2,STAR1
  WAITL2:JNB P3.2,WAITL2       ;等待键释放
  SETB F0
  FUN20:LCALL FUN22
  LCALL STAR1
  LJMP FUN20;
  FUN3:LCALL DL10MS            ;消除抖动
  JB P3.3,STAR1
  WAITL3:JNB P3.3,WAITL3       ;等待键释放
  CLR F0
  MOV P1,#0FFH                 ;关显示
  LJMP STAR1;
  FUN00:MOV A,#0FEH            ;从P1.0到P1.7移动点亮
  FUN000:MOV P0,A
  LCALL DL05S
  JNB ACC.7,OUT
  RL A
  AJMP FUN000
  OUT: RET;
  FUN11:MOV A,#0FEH            ;从P1.0到P1.7依次点亮
  FUN111:MOV P1,A
  LCALL DL05S
  JZ OUT
  RL A
  ANL A,P1
  AJMP FUN111;
  FUN22:MOV A,#0FEH               ;间隔点亮
  FUN222:MOV P1,A
  LCALL DL01S
  CPL A
  RL A
  MOV P1,A
  LCALL DL01S
  RET;
  FUN33: MOV A,#01H                 ;逐点熄灭
  FUN333: MOV P1,A
  LCALL DL01S
  JNZ OUT
  RL A
  ORL A,P1
  AJMP FUN333
  DL01S:MOV R2,#0FFH              ; 延时程序
  MOV R7,#02H
  LOOP1: DJNZ R2,LOOP1
  LOOP5:DJNZ R7,DL512
  RET
  DL10MS:MOV R3,#14H
  LOOP2: LCALL DL512
  DJNZ R3,LOOP2
  RET
  DL05S:MOV R4,#0AH
  LOOP3: LCALL DL10MS
  DJNZ R4,LOOP3
  RET
  DL30S:MOV R5,#03H
  LOOP4:LCALL DL05S
  DJNZ R5,LOOP4
  RET
  END
  4.2一秒钟定时程序
  MOV B,#0AH        ;允许中断
  MOV TMOD,#01H         ;工作方式1
  MOV TH0,#0B0H
  MOV TL0,#3CH
  SETB TR0                ;启动计数
  SETB EA                 ;开中断
  BU:JBC TF0,SHI
  SJMP BU
  SHI:MOV TH0,#3CH
  MOV TL0,#0B0H
  RET
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-12-23 18:16 , 耗时 0.116073 秒, 20 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表