LED灯控制器.docx
- 文档编号:30702536
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:28
- 大小:636.06KB
LED灯控制器.docx
《LED灯控制器.docx》由会员分享,可在线阅读,更多相关《LED灯控制器.docx(28页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LED 控制器