利用单片计算机实现彩灯控制
利用单片计算机实现彩灯控制
1设计要求
利用彩灯的各种闪烁的变换作为装饰在生活中处处都能够看到。彩灯的闪烁变换可以用简易的数字电路等来实现,在学习了单片计算机之后试着利用单片机的功能来控制其闪烁变换。
2硬件设计方案
电路元器件:面包板;
普通的发光二极管,导通电压0.5V;
芯片插座;
晶振;
时钟电容:22pF*2;
限流电阻:220Ω*8
限流电阻:1K*1;
复位电路电容:30uF;
点触式开关:1;
2.1 二极管发光的实现
由于单片机P1.口的输出电流仅有十几到几十uF,这样小的电流不能使发光二极管发光,于是采用了“灌电流”的方法,如图1所示——
图1 二极管发光的实现
选用的外加电源Vcc=5V,根据二极管的导通电压是0.5V的性质,可以求的限流电阻的阻值,在实验中选用220Ω的电阻即可。
2.2时钟电路的组成
在实验用采用了12M的晶振,与之配合使用的是22pF的陶瓷电容。如图2所示
图2 时钟电路的组成
2.3 复位电路的设计
所谓复位,就是在单片机MPU的RESET引脚上出现3-5个时钟周期的高电平。当MPU被复位以后,其内部的寄存器的各项数值将会被恢复成硬件电路规定的初值。
复位有上电复位和自动复位两种,根据实际用途的需要,在本实验中采用的上电复位,如图3所示——
图3 复位电路的组成
2.4 硬件电路其他部分的安排
考虑到本实验的特点,MPU的EA/VPP引脚,即程序存储器选择信号端和编程电源输入端不能悬空,应长置为“1”,这点在芯片插座引脚和外电路的连接上可以体现出来。
2.5 整体的电路图
综上,可以得到总体上的电路原理图。
3软件实现
人眼能看到发光二极管的闪烁是因为其闪烁的时间间隔大于一个特定的值,低于这个值我们将无法看到其闪烁变换,为此,确定二极管的闪烁间隔为0.2s 。这种延时的功能可以用调用延时子程序或者中段服务程序来实现。以下讨论两种方法及其实现:
3.1延时子程序实现延时
单片计算机运行每条程序将占用1个、2个或4个机器周期。为此,可以用一定数量的程序的执行来实现延时。
总延时 ,其中N为指令总数,t为一个周期的时间。
以下是延时程序的代码——
ORG 0000H
AJMP START
ORG 0040H
START:MOV P1,#0FFH ;灯全灭
LCALL DELAY ;调用延时子程序
MOV P1,#000H ;灯全亮
LCALL DELAY
MOV P1,#0FFH ;等全灭
LCALL DELAY
MOV P1,#07EH ;第8、第1灯亮
LCALL DELAY
MOV P1,#03CH ;第7、8,第1、2灯亮
DALAY:MOV R5,#20 ;延时子程序,延时0.2s
D1:MOV R6,#20
D2:MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
END
3.2中断实现延时的程序
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP INT0
ORG 0030H
MAIN:MOV P1,#03CH ;第7、8和第1、2灯亮
MOV R7,#00H
MOV TMOD,#010H
MOV TL0,#0E0H
MOV TH0,#0B1H
SETB EA
SETB ET0
SETB TR0
HERE:SJMP HERE
INT0:PUSH ACC
MOV TL0,#0E0H
MOV TH0,#0B1H
INC R7
CJNZ R7,#26,PEND
MOV R7,#00H
MOV P1,#0C3H ;第3、4、5,6灯亮
POP ACC
PEND:RETI
END
4程序的调试
将写好的程序在伟福编译器中进行编译,得到.BIN文件,固化到单片机的芯片中,将芯片插到前面已经组装完毕的硬件电路的芯片插座上,这样就组成了一个完整的彩灯控制电路,当接通电源之后理论上就应该看到彩灯按照预定的方式闪烁。
4.1延时子程序的运行
该程序的运行按照预定的程序运行,每隔0.2s可以看到彩灯闪烁一次,并且8个发光二极管的亮和灭严格按照程序的要求进行;
4.2中断程序实现的延时
由于程序采用了中断方式延时,所以彩灯闪烁的改变只能由中断服务子程序中设定的程序来实现对其的改变,在此程序中,在MAIN主程序中已经设定了彩灯初始时有第1、2和第7、8灯亮,而在中断服务子程序中有第3、4、5,6灯亮,从而实现了“闪烁”,但是这种中断方式的缺点在于闪烁的模式太过于单一,只能进行这两种方式的循环改变。在实际中难以满足人们多样化的需求,这是一个需要解决的问题。
4.3中断程序实现的延时方法的改进
为此,我对以上的程序进行了一点改动,综合子程序延时和中断延时两程序写了下面这些代码:
ORG 0000H
AJMP MAIN0 ;第一种亮的模式
ORG 000BH
AJMP INT0
AJMP MAIN1 ;第二种亮的模式
ORG 000BH
AJMP INT0
AJMP MAIN2 ;第三种亮的模式
ORG 000BH
AJMP INT0
ORG 0030H
MAIN0:MOV P1,#00FH ;第一种亮的模式:5、6、7,8灯亮
AJMP MAIN
MAIN1:MOV P1,#0F0H ;第二种亮的模式:1、2、3,4灯亮
AJMP MAIN
MAIN2:MOV P1,#000H ;第三种亮的模式:全亮
AJMP MAIN
MAIN:MOV R7,#00H
MOV TMOD,#010H
MOV TL0,#0E0H
MOV TH0,#0B1H
SETB EA
SETB ET0
SETB TR0
HERE:SJMP HERE
INT0:PUSH ACC
MOV TL0,#0E0H
MOV TH0,#0B1H
INC R7
CJNZ R7,#26,PEND
MOV R7,#00H
MOV P1,#0FFH ;灯全灭
POP ACC
PEND:RETI
END
在这段程序中,中断服务程序执行的是“灯全灭”这一动作。灯的闪烁模式有三种,由对P1口送指定的立即数来实现。
可以看到,等待计数器计数到FFFF需要一段时间,这也就是灯闪烁的时间差。
利用这种方式也可以达到延时的目的,同时也增加了一些彩灯的闪烁模式,但是同样可以看到其缺点,就是为了增加闪烁的模式,必须在主程序前的声明部分增加相应的跳转指令,并且指明中断服务程序的入口地址,这样一来又增加了程序的长度,使其繁琐。
5结论
利用程序延时和中断延时,都可以实现彩灯电路闪烁方式的控制,两种电路各有其优缺点:
程序延时程序中,需要频繁地调用延时子程序,如果在大型的程序中会影响程序的效率;
中断延时方式中彩灯的闪烁方式不如前者丰富,不能满足实际视觉上的审美需要。