LED灯控制器Word格式文档下载.docx

上传人:b****6 文档编号:18665727 上传时间:2022-12-31 格式:DOCX 页数:27 大小:650.74KB
下载 相关 举报
LED灯控制器Word格式文档下载.docx_第1页
第1页 / 共27页
LED灯控制器Word格式文档下载.docx_第2页
第2页 / 共27页
LED灯控制器Word格式文档下载.docx_第3页
第3页 / 共27页
LED灯控制器Word格式文档下载.docx_第4页
第4页 / 共27页
LED灯控制器Word格式文档下载.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

LED灯控制器Word格式文档下载.docx

《LED灯控制器Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《LED灯控制器Word格式文档下载.docx(27页珍藏版)》请在冰豆网上搜索。

LED灯控制器Word格式文档下载.docx

/******************************************************************************

实验名:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 笔试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1