您好,欢迎访问三七文档
实验名称综合实验-LED灯控制器成绩一、任务要求利用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是一个移位寄存器,可以通过一个数据输入端以及一个时钟信号输入端实现跑马灯的效果。三、资源分配基础部分:第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:用于扫描键盘四、流程图基础部分提高部分五、源代码(含文件头说明、语句行注释)/******************************************************************************实验名:LED灯控制器(基础部分)*******************************************************************************/$include(C8051F310.inc)ORG001BHLJMPTIME1ORG00BHLJMPTIME0ORG002BHLJMPTIME2ORG0000HLJMPMAINORG1000HMAIN:LCALLInit_Device;初始化配置LEDBITP0.0BEEPBITP3.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,A2LCALLVOICE;最亮蜂鸣器打开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,L3DECR0SJMPXIANL3:INCR0XIAN:PUSHACC;调整数码管显示模块MOVA,R0MOVCA,@A+DPTRMOVP1,APOPACCSJMPSTART;***************;蜂鸣器;***************VOICE:SETBBEEP;开蜂鸣SETBTR2;开定时器2RETTAB: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;保护判断位JCUPINCAMOVTH1,#0FCHMOVTL1,#018HCJNEA,#0FH,LMOVA,#0HL:MOVC,(20H).1RETITIME2:CLRTF2HDJNZR4,LOOP1;循环2次0.25*2=0.5sMOVR4,#02HCLRBEEP;关蜂鸣CLRTR2LOOP1:RETI;Peripheralspecificinitializationfunctions,;CalledfromtheInit_DevicelabelPCA_Init:anlPCA0MD,#0BFhmovPCA0MD,#000hretPort_IO_Init:movXBR1,#040hmovP1MDOUT,#0FFhretTimer_Init:movTMOD,#021hmovTL0,#0C6hmovTL1,#081hmovTH0,#06hmovTH1,#081hmovTMR2L,#0C6hmovTMR2H,#006hretInterrupts_Init:movIE,#0AAhret;Initializationfunctionfordevice,;CallInit_DevicefromyourmainprogramInit_Device:lcallPCA_InitlcallPort_IO_InitlcallTimer_InitlcallInterrupts_InitretEnd/********************************************************************************实验名:LED灯控制器(提高部分)*注意:系统时钟为内部振荡器8分频,T1,T0时钟为系统时钟12分频*******************************************************************************/$include(C8051F310.inc)ORG0000HLJMPMAINORG0003H;外部中断0入口LJMPKINTORG001BH;T1中断入口LJMPTIME1ORG002BH;T2中断入口LJMPTIME2ORG0100HMAIN:CLRP3.1;关蜂鸣器ACALLInit_Device;调用初始化配置MOVR0,#0;记录led等级MOVR1,#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,R3MOVPCA0CN,#040H;允许PCA计数器/定时器CJNER0,#0,CHMAXACALLVOICE;r0=0H,蜂鸣器响SETBP0.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,#0FFH;循环定时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,#4JCOK;判断第一个数是否小于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时,改为递增模式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用于产生时钟信号MOVA,#6P21S:LCALLD10MSDJNZACC,P21SDJNZR7,P20S;移位8次,led阵列依次熄灭SETBEX0;允许外部0中断LJMPGO;缓冲阶段结束,跳转回主程序;***************;键盘扫描模块;***************CHAXUN:MOV39H,#0FFHMOVR5,#0FFH
本文标题:LED灯控制器
链接地址:https://www.777doc.com/doc-3769980 .html