LED灯控制器Word格式文档下载.docx
《LED灯控制器Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《LED灯控制器Word格式文档下载.docx(27页珍藏版)》请在冰豆网上搜索。
/******************************************************************************
实验名:
LED灯控制器(基础部分)
*******************************************************************************/
$include(C8051F310.inc)
ORG001BH
LJMPTIME1
ORG00BH
LJMPTIME0
ORG002BH
LJMPTIME2
ORG0000H
LJMPMAIN
ORG1000H
MAIN:
LCALLInit_Device;
初始化配置
LEDBITP0.0
BEEPBITP3.1
CLRP0.6;
选末位数码管
CLRP0.7
CLRBEEP;
关闭蜂鸣器
MOVP1,#0FCH;
初始数码管显示
MOVDPTR,#TAB;
存数码表表头
MOVR0,#00H;
亮度等级初始
MOVR3,#08H;
LED亮度持续循环八次0.25*8
MOVR4,#02H;
蜂鸣器定时循环两次0.25s*2
MOVA,#00
START:
CJNER0,#00H,A1
LCALLVOICE;
最暗蜂鸣器打开
A1:
CJNER0,#0FH,A2
最亮蜂鸣器打开
A2:
SETBTR1
SETBTR0
LOOP:
JBPSW.5,NEXT
CJNEA,00H,CC
CC:
JCOPEN;
判断是熄灭还是点亮LED
SETBLED
SJMPLOOP
OPEN:
CLRLED
NEXT:
CLRPSW.5
DJNZR3,LOOP;
T0定时器定时循环8次0.25*8=2s
CLRTR1;
调整亮度等级模块
CLRTR0
CLRA
MOVR3,#08H
CJNER0,#0FH,L1;
达到亮度等级上限开始递增模式
SETB(20H).0
L1:
CJNER0,#00H,L2;
达到亮度等级下限开始递增模式
CLR(20H).0
L2:
JNB(20H).0,L3
DECR0
SJMPXIAN
L3:
INCR0
XIAN:
PUSHACC;
调整数码管显示模块
MOVA,R0
MOVCA,@A+DPTR
MOVP1,A
POPACC
SJMPSTART
;
***************
蜂鸣器
VOICE:
SETBBEEP;
开蜂鸣
SETBTR2;
开定时器2
RET
TAB:
DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H
DB0FEH,0E6H,0EEH,3EH,1AH,7AH,9EH,8EH
定时器模块
TIME0:
MOVTH0,#06H
MOVTL0,#0C6H
SETBPSW.5;
用于0.25s中断标志
RETI
TIME1:
MOV(20H).1,C;
保护判断位JCUP
INCA
MOVTH1,#0FCH
MOVTL1,#018H
CJNEA,#0FH,L
MOVA,#0H
L:
MOVC,(20H).1
TIME2:
CLRTF2H
DJNZR4,LOOP1;
循环2次0.25*2=0.5s
MOVR4,#02H
关蜂鸣
CLRTR2
LOOP1:
RETI
Peripheralspecificinitializationfunctions,
CalledfromtheInit_Devicelabel
PCA_Init:
anlPCA0MD,#0BFh
movPCA0MD,#000h
ret
Port_IO_Init:
movXBR1,#040h
movP1MDOUT,#0FFh
Timer_Init:
movTMOD,#021h
movTL0,#0C6h
movTL1,#081h
movTH0,#06h
movTH1,#081h
movTMR2L,#0C6h
movTMR2H,#006h
Interrupts_Init:
movIE,#0AAh
Initializationfunctionfordevice,
CallInit_Devicefromyourmainprogram
Init_Device:
lcallPCA_Init
lcallPort_IO_Init
lcallTimer_Init
lcallInterrupts_Init
End
/*******************************************************************************
*实验名:
LED灯控制器(提高部分)
*注意:
系统时钟为内部振荡器8分频,T1,T0时钟为系统时钟12分频
ORG0000H
LJMPMAIN
ORG0003H;
外部中断0入口
LJMPKINT
ORG001BH;
T1中断入口
LJMPTIME1
ORG002BH;
T2中断入口
LJMPTIME2
ORG0100H
CLRP3.1;
关蜂鸣器
ACALLInit_Device;
调用初始化配置
MOVR0,#0;
记录led等级
MOVR1,#1;
R1=0亮度在递减,R1=1亮度在递增
MOVR2,#0;
记录数码管位选
MOVR3,#0;
赋值PCA0CPL0,PCA0CPH0
CLR0H;
位寻址0h判断是暂停LED还是恢复LED
MOV30H,#0;
用于判断输入的是第几位数
主程序
GO:
SETBTR1;
打开定时器t1
MOVR4,#8;
定时0.25s*8=2s
ACALLAA;
数码管,蜂鸣器,led灯模块
AJMPGO
AA:
MOVPCA0CPL0,R3;
输入脉冲占空比
MOVPCA0CPH0,R3
MOVPCA0CN,#040H;
允许PCA计数器/定时器
CJNER0,#0,CHMAX
ACALLVOICE;
r0=0H,蜂鸣器响
SETBP0.0
MOVPCA0CN,#0
CHMAX:
CJNER0,#31H,LED
r0=31H,蜂鸣器响
LED:
CJNER2,#2,FINE;
r2可取值为0或1,为0时末位数码管亮,为1时第三个数码管亮
MOVR2,#0H
FINE:
CJNER2,#0,ONE
MOVA,R0
ANLA,#0FH;
保留低位
CLRP0.6
AJMPLOOK
ONE:
MOVA,R0
ANLA,#0F0H;
保留高位
SWAPA
SETBP0.6
LOOK:
MOVDPTR,#SHUMA;
数码表存于dptr
MOVCA,@A+DPTR;
查表显示亮度等级
MOVP1,A;
送数码管段控
MOVR5,#28H
DL1:
MOVR6,#0FFH;
循环定时
DL10:
DJNZR6,DL10
DJNZR5,DL1
INCR2;
改变位选
SJMPLED
RET
蜂鸣器模块
***************
SETBTR2;
SETBP3.1;
打开蜂鸣器
MOVR7,#2;
用于定时器2,0.25秒*2=0.5秒
RET
键盘输入模块
BB:
ACALLD10MS;
消抖
ACALLKEXAM;
检查是否有按键按下
JZBB
ACALLCHAXUN;
转入键盘扫描
MOVR0,30H;
判断现在是输入第几个数
CJNER0,#0,SECOND;
30h=0表示第一个数,1表示第二个数
MOV45H,A;
取第一个数暂存45h中
CLRC
SUBBA,#4
JCOK;
判断第一个数是否小于4,大于等于4时无效
MOV45H,#0;
无效数清零
AJMPBB;
继续查询
OK:
MOVA,45H
ACALLLED1;
显示按下的数字
INC30H;
进入第二个数的查询
AJMPBB
SECOND:
MOV46H,A;
取第二个数暂存46h中
MOVR6,45H
CJNER6,#3,FF1
SUBBA,#2;
当第一个数是3时第二个数大于1无效
JNCUNLG
MOVA,46H
CJNEA,#1,FF0;
当第一个数是3第二个数是1时,改为递减模式
MOVR1,#0;
下降
AJMPFF0
FF1:
MOVA,45H
CJNEA,#00H,FF0
MOVA,46H;
当输入第一个数为0第二个数也为0时,改为递增模式
上升
FF0:
MOVA,46H
显示按下的数字
MOV30H,#0
AJMPOVER
UNLG:
MOV46H,#0
OVER:
MOVA,45H;
装载亮度等级,以及对应的pwm值
MOVB,#10H
MULAB
ADDA,46H
MOVR0,A
MOVA,45H
MOVB,#0AH
MULAB
ADDA,46H
MOVB,#08
MOVR3,A
装载结束,准备进入缓冲阶段
CLR0H
MOVP1,#0;
关闭数码管
SETBP3.3;
开始启动LED阵列功能
MOVR7,#10H
P20S:
CPLP3.4;
取反CLK用于产生时钟信号
MOVA,#6
P21S:
LCALLD10MS
DJNZACC,P21S
DJNZR7,P20S;
移位8次,led阵列依次熄灭
SETBEX0;
允许外部0中断
LJMPGO;
缓冲阶段结束,跳转回主程序
键盘扫描模块
CHAXUN:
MOV39H,#0FFH
MOVR5,#0FFH
CLRC
SKAN:
MOVA,39H
RLCA;
逐行扫描
INCR5
MOV39H,A
MOVP2,A
MOVA,P2
ANLA,#0F0H
CJNEA,#0F0H,YES;
列检查有低电平时转列扫描
AJMPSKAN
YES:
SETBC
MOVR6,#4
PANDUAN:
RLCA;
逐列扫描
DECR6
JCPANDUAN
MOVA,R5;
r6为列值,r5为行值,两者相加为键值
MOVB,#4
ADDA,R6
MOVDPTR,#JIANPAN
MOVCA,@A+DPTR
RET
判断是否有按键按下
KEXAM:
MOVP2,#0F0H
CJNEA,#0F0H,YES1
MOVA,#0;
没有按键按下
RET
YES1:
MOVA,#1;
有按键按下
用于显示键盘的输入值
LED1:
MOVR7,30H;
30H单元记录按下的是第几个数
MOVDPTR,#SHUMA
CJNER7,#0,DSP10
AJMPTHERE
DSP10:
CLRP0.6
THERE:
MOVCA,@A+DPTR
MOVP1,A
DD5S:
MOVA,P2
CJNEA,#0F0H,DD5S
延时子程序用于消抖
D10MS:
MOVR5,#25H;
6ms延时用于消抖
Dl:
MOVR6,#0FFH;
Dl0:
DJNZR6,Dl0
DJNZR5,Dl
RET
SHUMA:
DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H,0EEH,03EH,09CH,07AH,09EH,08EH,0CEH
JIANPAN:
DB0,4,8,0FFH,1,5,9,0FFH,2,6,0FFH,0FFH,3,7,0FFH,0FFH
外部0中断服务程序用于处理KINT键
KINT:
LCALLD10MS;
延时10ms消抖
关掉led阵列
D21S:
CPLP3.4
DJNZR7,D21S;
移位8次全关
CLREX0;
禁止外部0中断
CLRTR1;
关闭T1定时器
关掉数码管
MOVPCA0CPL0,#0;
关闭LED灯
MOVPCA0CPH0,#0
CLRP3.3;
打开LED阵列,全部点亮则进入键盘模式
D22S:
MOVA,#7
D23S:
MOVC,P0.1
JCLOOP705;
长按才能进入键盘输入模块
DJNZACC,D23S
DJNZR7,D22S;
循环16次,产生8个周期的时钟信号,移位8次全亮
MOV34H,#01H
MOV35H,#5DH;
015DH为BB入口地址
PUSH35H;
将键盘输入模块地址入栈,使中断返回后进入
PUSH34H
LOOP702:
RETI;
跳转到键盘输入模块
LOOP705:
MOVC,0H
JCSTART
CPLC;
暂停并关闭LED中断返回后进入踏步
MOV0H,C
MOV32H,#02H
MOV33H,#0BAH;
02BAH为sjmp$地址入口
PUSH33H;
将sjmp$地址存入堆栈使中断返回后能进入
PUSH32H
AJMPLOOP70
start:
CPLC;
恢复LED
POP32H;
把sjmp$地址从堆栈中移除使中断返回进入主程序
POP33H
D31S:
DJNZR7,D31S;
SETBTR1
LOOP70:
SETBEX0;
允许外部0中断
SJMP$
T1中断服务程序用于调整PWM
DJNZR4,YY6;
先循环8次中断定时2s
CJNER1,#0,YY0;
判断R1的状态
DECR0;
亮度等级在递减
ANLA,#0FH
CJNEA,#0FH,YY00;
当低位从0减到F时将F转化为9
MOVA,R0
CLRC
SUBBA,#06H
MOVR0,A;
得到正确的亮度等级
YY00:
MOVA,R3
CLRC
SUBBA,#8
CJNER0,#0,YY2;
到最暗后开始上升
MOVR1,#1
AJMPYY2
YY0:
INCR0;
亮度等级在递增
CJNEA,#0AH,YY02;
当低位从9加到A时将A转化为0
ADDA,#6
YY02:
MOVA,R3
CJNER