闪烁LED灯的设计---单片机课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
闪烁LED灯的设计
本设计的闪烁小灯控制器,可使小灯轮流点亮、逐个点亮、间隔闪亮。如果要控制交流彩灯,可在P1端口加接继电器或可控硅接口电路。本设计可应用在广告彩灯控制器和舞台灯光控制器等领域。
一、系统硬件电路的设计
图1为闪烁小灯控制器的电路原理图,其中:单片机采用AT89C2051,P1口作LED发光管输出控制用,P3.0-P3.2口为闪烁方式控制开关K1、K2、K3按键接口,P3.3口的按键作备用,限流电阻为510Ω,发光管工作电流约10mA,采用12MHz晶振。
图1 闪烁小灯电路原理图
二、系统主要程序的设计
1、主程序
通过扫描P3.0-P3.2口,判断是否有按键按下,然后在20H内存单元的低3
位的对应位置1标志,确定应执行的闪烁功能。当20H.0为1时,发光管轮流点亮;当20H.1为1时,发光管逐点点亮;当20H.2为1时,发光管间隔闪亮。在主程序对20H的低3位进行位值判定后,转入相应的闪烁控制程序。上电初始化时,对20H的最低位置1,系统进入轮流点亮方式。主程序流程图如图2所示。
2、键扫描子程序
因按键较少,采用直接端口扫描键开关,用软件延时消抖确认后,对20H 内存单元相应的位置1,并把其余位清0。
图2 主程序流程图
3、闪烁控制程序
闪烁控制程序用来控制P1口的发光管发光变化方式,其中:
执行功能程序0(FUN0)时的P1口输出值变化为11111110→延时→11111101→延时→11111011→延时→11110111→延时→11101111→延时→11011111→延时→10111111→延时→01111111→延时→结束转主程序。
执行功能程序1(FUN1)时的P1口输出变化为11111110→延时→11111100
→延时→11111000→延时→11110000→延时→11100000→延时→11000000→延时→10000000→延时→00000000→延时→结束转主程序。
执行功能程序2(FUN2)时的P1口输出变化为10101010→延时→01010101→延时→结束转主程序。
4、延时子程序
延时子程序有10ms和0.5s两个,用作键扫描消抖及发光管闪烁延时。发光管闪烁的快慢可由R4寄存器内的初值进行改变。
本控制器在使用中,如果要改变闪烁的方式,可按下相应的功能按键。当一个完整的闪烁循环结束后,即可转入新的闪烁方式。由于键扫描是在闪烁循环结束时进行,因此,功能开关按下的时间应较长才能被读入。改进的方法是把DL05S 延时子程序用键扫描子程序来代替,这样,只要按下按键即可被键扫描程序读入。
三、汇编语言
以下是闪烁LED小灯控制器完整的汇编程序清单:
小灯控制程序
中断入口程序
ORG 0000H ;程序执行开始地址
LJMP START ;跳到START执行
ORG 0003H ;外中断0中断入口地址
RETI ;中断返回(不开中断)
ORG 000BH ;定时器T0中断入口地址
RETI ;中断返回(不开中断)
ORG 0013H ;外中断1中断入口地址
RETI ;中断返回(不开中断)
ORG 001BH ;定时器T1中断入口地址
RETI ;中断返回(不开中断)
ORG 0023H ;串行口中断入口地址
RETI ;中断返回(不开中断)
初始化程序
CLEAR: MOV 20H,#00H ;20H单元内存清0(闪烁标志清0) SETB 00H ;20H.0位置1(上电时自动执行闪烁
功能1)
RET ;子程序返回
主程序
START: ACALL CLEAR ;调用初始化子程序
MAIN: LCALL KEYWORK ;调用键扫描子程序
JB 00H,FUN0 ;20H.0位为1时执行FUN0
JB 01H,FUN1 ;20H.1位为1时执行FUN1
JB 02H,FUN2 ;20H.2位为1时执行FUN2
JB 03H,MAIN ;备用
AJMP MAIN ;返回主程序MAIN
功能程序
第1种闪烁功能程序
FUN0: MOV A,#0FEH ;累加器赋初值
FUN00: MOV P1,A ;累加器值送至P1口
LCALL DL05S ;延时
JNB ACC.7,MAIN ;累加器最高位为0时转MAIN
RL A ;累加器A中数据循环左移1位
AJMP FUN00 ;转FUN00循环
第2种闪烁功能程序
FUN1: MOV A,#0FEH ;累加器赋初值
FUN11: MOV P1,A ;累加器值送至P1口
LCALL DL05S ;延时
JZ MAIN ;A为0转MAIN
RL A ;累加器A中数据循环左移1位
ANL A,P1 ;A同P1口值相“与”
AJMP FUN11 ;转FUN11循环
第3种闪烁功能程序
FUN2: MOV A,#0AAH ;累加器赋初值
MOV P1,A ;累加器值送至P1口
LCALL DL05S ;延时
CPL A ;A中各位取“反”
MOV P1,A ;累加器值送至P1口
LCALL DL05S ;延时
AJMP MAIN ;转MAIN
扫描程序
KEYWORK:MOV P3,#0FFH ;置P3口为输入状态
JNB P3.0,KEY0 ;读P3.0口,若为0转KEY0
JNB P3.1,KEY1 ;读P3.1口,若为0转KEY1
JNB P3.2,KEY2 ;读P3.2口,若为0转KEY2
JNB P3.3,KEY3 ;读P3.3口,若为0转KEY3
RET ;子程序返回
闪烁功能0键处理程序
KEY0: LCALL DL10MS ;延时10ms消抖
JB P3.0,OUT0 ;P3.0为1,子程序返回(干扰)
SETB 00H ;20H.0位置1(执行闪烁功能1标志) CLR 01H ;20H.1位清0
CLR 02H ;20H.2清0
CLR 03H ;20H.3位清0
OUT0: RET ;子程序返回
闪烁功能1键处理程序