LED灯控制器.docx

上传人:b****6 文档编号:15281007 上传时间:2023-07-03 格式:DOCX 页数:28 大小:636.07KB
下载 相关 举报
LED灯控制器.docx_第1页
第1页 / 共28页
LED灯控制器.docx_第2页
第2页 / 共28页
LED灯控制器.docx_第3页
第3页 / 共28页
LED灯控制器.docx_第4页
第4页 / 共28页
LED灯控制器.docx_第5页
第5页 / 共28页
LED灯控制器.docx_第6页
第6页 / 共28页
LED灯控制器.docx_第7页
第7页 / 共28页
LED灯控制器.docx_第8页
第8页 / 共28页
LED灯控制器.docx_第9页
第9页 / 共28页
LED灯控制器.docx_第10页
第10页 / 共28页
LED灯控制器.docx_第11页
第11页 / 共28页
LED灯控制器.docx_第12页
第12页 / 共28页
LED灯控制器.docx_第13页
第13页 / 共28页
LED灯控制器.docx_第14页
第14页 / 共28页
LED灯控制器.docx_第15页
第15页 / 共28页
LED灯控制器.docx_第16页
第16页 / 共28页
LED灯控制器.docx_第17页
第17页 / 共28页
LED灯控制器.docx_第18页
第18页 / 共28页
LED灯控制器.docx_第19页
第19页 / 共28页
LED灯控制器.docx_第20页
第20页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

LED灯控制器.docx

《LED灯控制器.docx》由会员分享,可在线阅读,更多相关《LED灯控制器.docx(28页珍藏版)》请在冰点文库上搜索。

LED灯控制器.docx

LED灯控制器

实验名称综合实验-LED灯控制器成绩

 

1、任务要求

利用C8051F310单片机设计一个LED灯控制器

主要功能和技术指标要求:

1.LED灯外接于P0.0端。

2.采用PWM方式调节LED灯的亮度,亮度分为16个等级,亮度顺序为

0-1-2…E-F-E-D…1-0-1-2…F-E…2-1-0,每个亮度等级延时2秒钟。

0对应熄灭,F最亮。

3.在LED显示器上显示当前亮度等级。

4.在LED灯亮度最大最小时蜂鸣器分别鸣响1次(0.5秒钟)。

5.利用单片机内部定时器定时,要求采用中断方式。

提高要求:

1)使用按键(KINT)开关LED灯,要求采用中断方式。

2)改变LED的亮度调节范围为0-31,并在在LED显示器上显示当前亮度值。

3)可用键盘设置亮度值。

4)其它个性化设计。

 

二、设计思路

基础部分:

使用定时器产生不同占空比的信号,具体操作如下:

每0.5ms中断一次,每次中断A加1或减1,当A≥R0时输出高电平,当A<R0时输出低电平,这样就能产生不同占空比的信号。

同时每2s中断一次,每次中断R0加1或减1。

再给A,与R0设定周期,这样就能实现LED从暗到亮再从亮到暗。

数码管根据亮度等级通过查表方式实现亮度显示。

每次R0=0H,或R0=0FH时蜂鸣器打开并用定时器定时0.5s。

提高部分:

按键KINT将作为外部0中断的信号来源,采用低电平触发。

当低电平持续一段时间后进入键盘输入模式,持续时间不足则会进入另外两种模式,模式1暂停并关闭LED,模式2恢复LED。

调节占空比的方式采用F310内部的PWM功能,一个亮度等级对应一个PWM值。

数码管的显示此时变为两位,通过快速切换显示实现两个数码管同时显示。

在键盘输入模式中,先查询是否有按键按下,有按键按下开始进行键盘扫描,通过行扫描和列扫描得到行值与列值,再得到键值,再将键值进行转化即可实现键盘亮度调节。

同时对于按键的使用应进行消抖。

LED阵列是单片机通过控制74HCT164来间接控制,74HCT164是一个移位寄存器,可以通过一个数据输入端以及一个时钟信号输入端实现跑马灯的效果。

3、资源分配

基础部分:

第0组工作寄存器R0,R3,R4:

R0存亮度等级;R3、R4用于循环

位寻址区1H:

用于保护判断位

提高部分:

第0组工作寄存器

R0,R1,R2,R3:

R0存亮度等级;R1记录递增或递减状态;R2记录数码管位选;R3记录PWM;R4,R5,R6,R7用于循环赋值

位寻址区

0H:

用于选择模式

字节地址

30H:

记录输入是第几个数;45H:

记录输入第一个数;46H:

记录输入第二个数;39H:

用于扫描键盘

 

4、流程图

基础部分

 

 

提高部分

 

 

五、源代码(含文件头说明、语句行注释)

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

实验名:

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

LCALLVOICE;最亮蜂鸣器打开

A2:

SETBTR1

SETBTR0

LOOP:

JBPSW.5,NEXT

CJNEA,00H,CC

CC:

JCOPEN;判断是熄灭还是点亮LED

SETBLED

SJMPLOOP

OPEN:

CLRLED

SJMPLOOP

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

RETI

TIME2:

CLRTF2H

DJNZR4,LOOP1;循环2次0.25*2=0.5s

MOVR4,#02H

CLRBEEP;关蜂鸣

CLRTR2

LOOP1:

RETI

;Peripheralspecificinitializationfunctions,

;CalledfromtheInit_Devicelabel

PCA_Init:

anlPCA0MD,#0BFh

movPCA0MD,#000h

ret

Port_IO_Init:

movXBR1,#040h

movP1MDOUT,#0FFh

ret

Timer_Init:

movTMOD,#021h

movTL0,#0C6h

movTL1,#081h

movTH0,#06h

movTH1,#081h

movTMR2L,#0C6h

movTMR2H,#006h

ret

Interrupts_Init:

movIE,#0AAh

ret

;Initializationfunctionfordevice,

;CallInit_Devicefromyourmainprogram

Init_Device:

lcallPCA_Init

lcallPort_IO_Init

lcallTimer_Init

lcallInterrupts_Init

ret

End

 

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

*实验名:

LED灯控制器(提高部分)

*注意:

系统时钟为内部振荡器8分频,T1,T0时钟为系统时钟12分频

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

$include(C8051F310.inc)

ORG0000H

LJMPMAIN

ORG0003H;外部中断0入口

LJMPKINT

ORG001BH;T1中断入口

LJMPTIME1

ORG002BH;T2中断入口

LJMPTIME2

ORG0100H

MAIN:

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

ACALLVOICE;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

;***************

;蜂鸣器模块

;***************

VOICE:

SETBTR2;开定时器2

SETBP3.1;打开蜂鸣器

MOVR7,#2;用于定时器2,0.25秒*2=0.5秒

RET

;***************

;键盘输入模块

;***************

BB:

ACALLD10MS;消抖

ACALLKEXAM;检查是否有按键按下

JZBB

ACALLD10MS;消抖

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时,改为递增模式

CJNEA,#00H,FF0

MOVR1,#1;上升

FF0:

MOVA,46H

ACALLLED1;显示按下的数字

MOV30H,#0

AJMPOVER

UNLG:

MOV46H,#0

AJMPBB

OVER:

MOVA,45H;装载亮度等级,以及对应的pwm值

MOVB,#10H

MULAB

ADDA,46H

MOVR0,A

MOVA,45H

MOVB,#0AH

MULAB

ADDA,46H

MOVB,#08

MULAB

MOVR3,A

MOVR2,#0;装载结束,准备进入缓冲阶段

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

MULAB

ADDA,R6

MOVDPTR,#JIANPAN

MOVCA,@A+DPTR

RET

;***************

;判断是否有按键按下

;***************

KEXAM:

MOVP2,#0F0H

MOVA,P2

ANLA,#0F0H

CJNEA,#0F0H,YES1

MOVA,#0;没有按键按下

RET

YES1:

MOVA,#1;有按键按下

RET

;***************

;用于显示键盘的输入值

;***************

LED1:

MOVR7,30H;30H单元记录按下的是第几个数

MOVDPTR,#SHUMA

CJNER7,#0,DSP10

SETBP0.6

AJMPTHERE

DSP10:

CLRP0.6

THERE:

MOVCA,@A+DPTR

MOVP1,A

DD5S:

MOVA,P2

ANLA,#0F0H

CJNEA,#0F0H,DD5S

RET

;***************

;延时子程序用于消抖

;***************

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消抖

SETBP3.3;关掉led阵列

MOVR7,#10H

D21S:

CPLP3.4

DJNZR7,D21S;移位8次全关

CLREX0;禁止外部0中断

CLRTR1;关闭T1定时器

MOVP1,#0;关掉数码管

MOVPCA0CPL0,#0;关闭LED灯

MOVPCA0CPH0,#0

CLRP3.3;打开LED阵列,全部点亮则进入键盘模式

MOVR7,#10H

D22S:

CPLP3.4;取反CLK用于产生时钟信号

MOVA,#7

D23S:

LCALLD10MS

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

MOV0H,C

POP32H;把sjmp$地址从堆栈中移除使中断返回进入主程序

POP33H

SETBP3.3;关掉led阵列

MOVR7,#10H

D31S:

CPLP3.4

DJNZR7,D31S;移位8次全关

SETBTR1

LOOP70:

SETBEX0;允许外部0中断

RETI

SJMP$

;***************

;T1中断服务程序用于调整PWM

;***************

TIME1:

DJNZR4,YY6;先循环8次中断定时2s

CJNER1,#0,YY0;判断R1的状态

DECR0;亮度等级在递减

MOVA,R0

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;亮度等级在递增

MOVA,R0

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

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2