LED灯控制器综述综述_第1页
LED灯控制器综述综述_第2页
LED灯控制器综述综述_第3页
LED灯控制器综述综述_第4页
LED灯控制器综述综述_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验名称 综合实验-LED灯控制器 成 绩 1、 任务要求利用C8051F310单片机设计一个LED灯控制器主要功能和技术指标要求:1. LED灯外接于P0.0端。 2. 采用PWM方式调节LED灯的亮度,亮度分为16个等级,亮度顺序为0-1-2E-F-E-D1-0-1-2F-E2-1-0,每个亮度等级延时2秒钟。 0对应熄灭,F最亮。3. 在LED显示器上显示当前亮度等级。 4. 在LED灯亮度最大最小时蜂鸣器分别鸣响1次(0.5秒钟)。 5. 利用单片机内部定时器定时,要求采用中断方式。 提高要求: 1)使用按键(KINT)开关LED灯,要求采用中断方式。 2)改变LED的亮度调节范围为0

2、-31,并在在LED显示器上显示当前亮度值。3)可用键盘设置亮度值。 4)其它个性化设计。二、设计思路基础部分:使用定时器产生不同占空比的信号,具体操作如下:每0.5ms中断一次,每次中断A加1或减1,当AR0时输出高电平,当AR0时输出低电平,这样就能产生不同占空比的信号。同时每2s中断一次,每次中断R0加1或减1。再给A,与R0设定周期,这样就能实现LED从暗到亮再从亮到暗。数码管根据亮度等级通过查表方式实现亮度显示。每次R0=0H,或R0=0FH时蜂鸣器打开并用定时器定时0.5s。提高部分:按键KINT将作为外部0中断的信号来源,采用低电平触发。当低电平持续一段时间后进入键盘输入模式,持

3、续时间不足则会进入另外两种模式,模式1暂停并关闭LED,模式2恢复LED。调节占空比的方式采用F310内部的PWM功能,一个亮度等级对应一个PWM值。数码管的显示此时变为两位,通过快速切换显示实现两个数码管同时显示。在键盘输入模式中,先查询是否有按键按下,有按键按下开始进行键盘扫描,通过行扫描和列扫描得到行值与列值,再得到键值,再将键值进行转化即可实现键盘亮度调节。同时对于按键的使用应进行消抖。LED阵列是单片机通过控制74HCT164来间接控制,74HCT164是一个移位寄存器,可以通过一个数据输入端以及一个时钟信号输入端实现跑马灯的效果。3、 资源分配基础部分:第0组工作寄存器R0,R3,

4、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)ORG 001BH LJMP TIME1ORG00BHLJMPTIME0O

5、RG002BHLJMPTIME2ORG0000HLJMPMAINORG1000HMAIN: LCALL Init_Device ;初始化配置LEDBITP0.0BEEP BIT P3.1CLRP0.6;选末位数码管CLRP0.7CLRBEEP;关闭蜂鸣器MOVP1,#0FCH;初始数码管显示MOVDPTR,#TAB;存数码表表头MOVR0,#00H;亮度等级初始MOVR3,#08H;LED亮度持续循环八次0.25*8MOVR4,#02H;蜂鸣器定时循环两次0.25s*2MOVA,#00START:CJNER0,#00H,A1LCALLVOICE;最暗蜂鸣器打开A1:CJNER0,#0FH,A2

6、LCALLVOICE;最亮蜂鸣器打开A2:SETBTR1SETBTR0LOOP:JBPSW.5,NEXTCJNEA,00H,CCCC:JCOPEN;判断是熄灭还是点亮LEDSETBLEDSJMPLOOPOPEN:CLRLEDSJMPLOOPNEXT:CLRPSW.5DJNZR3,LOOP ;T0定时器定时循环8次0.25*8=2sCLRTR1 ;调整亮度等级模块CLRTR0CLRAMOVR3,#08HCJNER0,#0FH,L1 ;达到亮度等级上限开始递增模式SETB(20H).0L1:CJNER0,#00H,L2 ;达到亮度等级下限开始递增模式CLR(20H).0L2:JNB(20H).0,

7、L3DECR0SJMPXIANL3:INCR0XIAN:PUSHACC;调整数码管显示模块MOVA,R0MOVCA,A+DPTRMOVP1,APOPACCSJMPSTART;*;蜂鸣器;*VOICE:SETB BEEP ;开蜂鸣 SETB TR2 ;开定时器2 RETTAB:DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0HDB0FEH,0E6H,0EEH,3EH,1AH,7AH,9EH,8EH;*;定时器模块;*TIME0:MOVTH0,#06HMOVTL0,#0C6HSETBPSW.5 ;用于0.25s中断标志RETITIME1:MOV(20H).1,C ;保护

8、判断位 JC UPINCA MOVTH1,#0FCHMOVTL1,#018HCJNEA,#0FH,LMOVA,#0HL:MOVC,(20H).1RETITIME2:CLRTF2HDJNZR4,LOOP1;循环2次0.25*2=0.5sMOVR4,#02HCLRBEEP;关蜂鸣CLRTR2LOOP1:RETI; Peripheral specific initialization functions,; Called from the Init_Device labelPCA_Init: anl PCA0MD, #0BFh mov PCA0MD, #000h retPort_IO_Init: m

9、ov XBR1, #040hmov P1MDOUT, #0FFh retTimer_Init: mov TMOD, #021h mov TL0, #0C6h mov TL1, #081h mov TH0, #06h mov TH1, #081h mov TMR2L, #0C6h mov TMR2H, #006h retInterrupts_Init: mov IE, #0AAh ret; Initialization function for device,; Call Init_Device from your main programInit_Device: lcall PCA_Init

10、lcall Port_IO_Initlcall Timer_Init lcall Interrupts_Init retEnd/* 实验名:LED灯控制器(提高部分)* 注 意:系统时钟为内部振荡器8分频,T1,T0时钟为系统时钟12分频 */$include (C8051F310.inc)ORG0000HLJMPMAINORG0003H;外部中断0入口LJMPKINTORG001BH;T1中断入口LJMPTIME1ORG002BH;T2中断入口LJMPTIME2ORG0100HMAIN:CLRP3.1;关蜂鸣器ACALLInit_Device;调用初始化配置MOVR0,#0;记录led等级M

11、OVR1,#1;R1=0亮度在递减,R1=1亮度在递增MOVR2,#0;记录数码管位选MOVR3,#0;赋值PCA0CPL0,PCA0CPH0CLR0H;位寻址0h判断是暂停LED还是恢复LEDMOV30H,#0;用于判断输入的是第几位数;*;主程序 ;*GO:SETBTR1;打开定时器t1MOVR4,#8;定时0.25s*8=2sACALLAA;数码管,蜂鸣器,led灯模块AJMPGOAA:MOVPCA0CPL0,R3;输入脉冲占空比MOVPCA0CPH0,R3MOV PCA0CN,#040H;允许PCA计数器/定时器CJNER0,#0,CHMAXACALLVOICE;r0=0H,蜂鸣器响S

12、ETBP0.0MOVPCA0CN,#0CHMAX:CJNER0,#31H,LEDACALLVOICE;r0=31H,蜂鸣器响LED:CJNER2,#2,FINE;r2可取值为0或1,为0时末位数码管亮,为1时第三个数码管亮MOVR2,#0HFINE:CJNER2,#0,ONEMOVA,R0ANLA,#0FH;保留低位CLRP0.6AJMPLOOKONE:MOVA,R0ANLA,#0F0H;保留高位SWAPASETBP0.6LOOK:MOVDPTR,#SHUMA;数码表存于dptrMOVCA,A+DPTR;查表显示亮度等级MOVP1,A;送数码管段控MOVR5,#28HDL1:MOVR6,#0F

13、FH;循环定时DL10:DJNZR6,DL10DJNZR5,DL1INCR2;改变位选SJMPLEDRET;*;蜂鸣器模块;*VOICE:SETBTR2;开定时器2SETBP3.1;打开蜂鸣器MOVR7,#2;用于定时器2,0.25秒*2=0.5秒RET;*;键盘输入模块;*BB:ACALLD10MS;消抖ACALLKEXAM;检查是否有按键按下JZBBACALLD10MS;消抖ACALLCHAXUN;转入键盘扫描MOVR0,30H;判断现在是输入第几个数CJNER0,#0,SECOND;30h=0表示第一个数,1表示第二个数MOV45H,A;取第一个数暂存45h中CLRCSUBBA,#4JC

14、OK;判断第一个数是否小于4,大于等于4时无效MOV45H,#0;无效数清零AJMPBB;继续查询OK:MOVA,45HACALLLED1;显示按下的数字INC30H;进入第二个数的查询AJMPBBSECOND:MOV46H,A;取第二个数暂存46h中MOVR6,45HCJNER6,#3,FF1SUBBA,#2;当第一个数是3时第二个数大于1无效JNCUNLGMOVA,46HCJNEA,#1,FF0;当第一个数是3第二个数是1时,改为递减模式MOVR1,#0;下降AJMPFF0FF1:MOVA,45HCJNEA,#00H,FF0MOVA,46H;当输入第一个数为0第二个数也为0时,改为递增模式

15、CJNEA,#00H,FF0MOVR1,#1;上升FF0:MOVA,46HACALLLED1;显示按下的数字MOV30H,#0AJMPOVERUNLG:MOV46H,#0AJMPBBOVER:MOVA,45H;装载亮度等级,以及对应的pwm值MOVB,#10HMULABADDA,46HMOVR0,AMOVA,45HMOVB,#0AHMULABADDA,46HMOVB,#08MULABMOVR3,AMOVR2,#0;装载结束,准备进入缓冲阶段CLR0HMOVP1,#0;关闭数码管SETBP3.3;开始启动LED阵列功能MOVR7,#10HP20S:CPLP3.4;取反CLK用于产生时钟信号MOV

16、A,#6P21S:LCALLD10MSDJNZACC,P21SDJNZR7,P20S;移位8次,led阵列依次熄灭SETBEX0;允许外部0中断LJMPGO;缓冲阶段结束,跳转回主程序;*;键盘扫描模块;*CHAXUN:MOV39H,#0FFHMOVR5,#0FFHCLRCSKAN:MOVA,39HRLCA;逐行扫描INCR5MOV39H,AMOVP2,AMOVA,P2ANLA,#0F0HCJNEA,#0F0H,YES;列检查有低电平时转列扫描AJMPSKANYES:SETBCMOVR6,#4PANDUAN:RLCA;逐列扫描DECR6JCPANDUANMOVA,R5;r6为列值,r5为行值,

17、两者相加为键值MOVB,#4MULABADDA,R6MOVDPTR,#JIANPANMOVCA,A+DPTRRET;*;判断是否有按键按下;*KEXAM:MOVP2,#0F0HMOVA,P2ANLA,#0F0HCJNEA,#0F0H,YES1MOVA,#0;没有按键按下RETYES1:MOVA,#1;有按键按下RET;*;用于显示键盘的输入值;*LED1:MOVR7,30H;30H单元记录按下的是第几个数MOVDPTR,#SHUMACJNER7,#0,DSP10SETBP0.6AJMPTHEREDSP10:CLRP0.6THERE:MOVCA,A+DPTRMOVP1,ADD5S:MOVA,P2

18、 ANLA,#0F0HCJNEA,#0F0H,DD5SRET;*;延时子程序用于消抖;*D10MS:MOVR5,#25H;6ms延时用于消抖Dl:MOVR6,#0FFH;循环定时Dl0:DJNZR6,Dl0DJNZR5,DlRETSHUMA:DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H,0EEH,03EH,09CH,07AH,09EH,08EH,0CEHJIANPAN:DB0,4,8,0FFH,1,5,9,0FFH,2,6,0FFH,0FFH,3,7,0FFH,0FFH;*;外部0中断服务程序用于处理KINT键;*KINT:LCALLD10

19、MS;延时10ms消抖SETBP3.3;关掉led阵列MOVR7,#10HD21S:CPLP3.4DJNZR7,D21S;移位8次全关CLREX0;禁止外部0中断CLRTR1;关闭T1定时器MOVP1,#0;关掉数码管MOVPCA0CPL0,#0;关闭LED灯MOVPCA0CPH0,#0CLRP3.3;打开LED阵列,全部点亮则进入键盘模式MOVR7,#10HD22S:CPLP3.4;取反CLK用于产生时钟信号MOVA,#7D23S:LCALLD10MSMOVC,P0.1JCLOOP705;长按才能进入键盘输入模块DJNZACC,D23SDJNZR7,D22S;循环16次,产生8个周期的时钟信

20、号,移位8次全亮MOV34H,#01HMOV35H,#5DH;015DH为BB入口地址PUSH35H;将键盘输入模块地址入栈,使中断返回后进入PUSH34HLOOP702:RETI;跳转到键盘输入模块LOOP705:MOVC,0HJCSTARTCPLC;暂停并关闭LED中断返回后进入踏步MOV0H,CMOV32H,#02HMOV33H,#0BAH;02BAH为sjmp $地址入口PUSH33H;将sjmp $地址存入堆栈使中断返回后能进入PUSH32HAJMPLOOP70start:CPLC;恢复LEDMOV0H,CPOP32H;把sjmp $地址从堆栈中移除使中断返回进入主程序POP33HS

21、ETBP3.3;关掉led阵列MOVR7,#10HD31S:CPLP3.4DJNZR7,D31S;移位8次全关SETBTR1LOOP70:SETBEX0;允许外部0中断RETISJMP$;*;T1中断服务程序用于调整PWM;*TIME1:DJNZR4,YY6;先循环8次中断定时2sCJNER1,#0,YY0;判断R1的状态DECR0;亮度等级在递减MOVA,R0ANLA,#0FHCJNEA,#0FH,YY00;当低位从0减到F时将F转化为9MOVA,R0CLRCSUBBA,#06HMOVR0,A;得到正确的亮度等级 YY00:MOVA,R3CLRCSUBBA,#8CJNER0,#0,YY2;到

22、最暗后开始上升MOVR1,#1AJMPYY2 YY0:INCR0;亮度等级在递增MOVA,R0ANLA,#0FHCJNEA,#0AH,YY02;当低位从9加到A时将A转化为0MOVA,R0ADDA,#6MOVR0,A;得到正确的亮度等级 YY02:MOVA,R3CJNER0,#31H,YY01;到最亮后开始下降MOVR1,#0 YY01:ADDA,#8YY2:MOVR3,A;得到PWM的值POP40H;堆栈减2,使T1 2S中断返回后进入到ACALL AA断点处POP41HYY6:MOVTH1,#06HMOVTL1,#0C6HRETI;*;T2中断服务程序用于蜂鸣器;*TIME2:CLRTF2H;TF2H不能由硬件清零需通过软件清零DJNZR7,LOOP8;循环定时0.25秒*2CLRP3.1;关闭蜂鸣器CLRTR2;关闭T2定时器LOOP8:RETI; Peripheral specific initialization functions,; Called from the Init_Device labelPCA_Init: anl PCA0M

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论