单片机LED灯控制器报告.docx
《单片机LED灯控制器报告.docx》由会员分享,可在线阅读,更多相关《单片机LED灯控制器报告.docx(13页珍藏版)》请在冰点文库上搜索。
单片机LED灯控制器报告
实验名称LED灯控制器
指导教师
专业班级学号
联系
本人承诺:
本报告内容真实,无伪造数据,无抄袭他人成果。
本人完全了解学校相关规定,如若违反,愿意承担其后果。
签字:
年月日
一、任务要求
实验容:
利用C8051F310单片机设计一个LED灯控制器
实验要求:
1.LED灯外接于P0.0端。
2.LED灯分别按2Hz,1Hz和0.2Hz三种不同频率闪动,各持续10s。
3.在LED灯开始和停止闪烁时蜂鸣器分别鸣响1次。
4.利用单片机部定时器定时,要求采用中断方式。
二、设计思路
C8051F310单片机片上晶振频率为24.5MHz,采用8分频后为3.0625MHz,输入时钟信号为48个机器周期,T1定时器采用定时方式1。
2Hz,1Hz频率闪动均可以通过部定时器单次计时直接达到效果,而0.2Hz单次闪动时间过长,无法达到,故通过中断设置定时器技术的方式达到延长计时时间的效果。
三、资源分配
P0.0:
为LED灯控制端口,高电平触发。
P3.1:
为蜂鸣器控制端口,高电平触发。
P0.1:
为KINT键控制端口,下降沿触发。
R1、R2:
用于存放计时器计时数据,R1赋给TH1、R2赋给TL1。
R3:
0.2Hz下的中断程序部循环计数器
R7:
存放三种模式的循环次数。
R0:
在外部中断程序中赋值,用于判断采用何种模式。
PSW.1:
为标志位,用于等待定时器中断,中断执行完清零,并在中断处向下继续执行程序。
四、流程图
1、主程序流程图(含提高部分)
2、T_KINT中断部分
3、ITOP中断部分
4、IT1P部分
五、源代码(含文件头说明、语句行注释)
包含基础部分和提高部分
;------------------------------------
;-GeneratedInitializationFile--
;------------------------------------
$include(C8051F310.inc)
LEDBITP0.0;LED灯控制端口
BEEPBITP3.1;蜂鸣器控制端口
KINTBITP0.1;KINT按钮端口
ORG0000H
LJMPMAIN
ORG0003H;外部中断0入口
LJMPT_KINT
ORG000BH;定时器T0中断入口
LJMPIT0P
ORG001BH
LJMPIT1P
ORG1000H
MAIN:
LCALLInit_Device;设备初始化
MOVSP,#40H;置堆栈指针
MOVTMOD,#11H;定时器T0、T1均为工作方式1
MOVR0,#00H
CLRLED;关led灯
CLRBEEP;关蜂鸣器
CLRPSW.1;标志位1清零
CLRPSW.5;标志位2清零
SETBEX0;外部中断0允许
SETBIT0;下降沿触发
SETBEA;中断总允许
SETBET0;定时器T0中断源允许
SETBET1;定时器T1中断源允许
CHOO:
CJNER0,#02H,LOOP;选择模式
LJMPMODEL2;R0等于02H,跳转到1Hz
LOOP:
JCMODEL1;R0小于02H,跳转到2Hz
LJMPMODEL3;R0大于02H,跳转到0.2Hz
MODEL1:
MOVR1,#0C1H;设定2Hz闪烁方式定时器T0计数初值
MOVR2,#0B1H
MOVR7,#28H;置2Hz闪烁方式闪烁次数
ACALLL1;取定时器T0计数初值
SETBP3.1;蜂鸣器鸣响一次
SETBTR0;启动定时器T0
CLRP0.0;开LED灯
HERE1:
CJNER7,#00H,HERE1;等待中断
CLRTR0;2Hz闪烁方式结束,关闭定时器
MODEL2:
MOVR1,#83H;设定1Hz闪烁方式定时器T0计数初值
MOVR2,#63H
MOV7,#14H;置1Hz闪烁方式闪烁次数
ACALLL1;取定时器T0计数初值
SETBP3.1;蜂鸣器鸣响一次
SETBTR0;启动定时器T0
CLRP0.0;开LED灯
HERE2:
CJNER7,#00H,HERE2;等待中断
CLRTR0;1Hz闪烁方式结束,关闭定时器
MODEL3:
MOVR1,#0C1H;设定0.2Hz闪烁方式定时器T1计数初值
MOVR2,#0B1H
MOVR7,#28H;置0.2Hz闪烁方式闪烁次数
ACALLL3;取定时器T1计数初值
MOVR3,#00H;定时中断循环初值
SETBP3.1;关蜂鸣器
SETBTR1;启动定时器T1
CLRP0.0;关LED灯
HERE3:
CJNER7,#00H,HERE3;等待中断
CLRTR1;0.5Hz闪烁方式结束,关闭定时器
LJMPMODEL1;重新开始下一轮的闪烁
L1:
MOVA,R1;定时器0计数初值赋值子程序
MOVTH0,A
MOVA,R2
MOVTL0,A
RET
L3:
MOVA,R1;定时器1计数初值赋值子程序
MOVTH1,A
MOVA,R2
MOVTL1,A
RET
ORG1200H
IT0P:
DECR7;定时器T0中断服务程序
MOVA,R1;计数初值重新赋值
MOVTH0,A
MOVA,R2
MOVTL0,A
CLRP3.1;蜂鸣器停止鸣响
CPLP0.0;LED灯亮灭切换
RETI
ORG1400H
IT1P:
DECR7;定时器T1中断服务程序
MOVA,R1;计数初值重新赋值
MOVTH1,A
MOVA,R2
MOVTL1,A
INCR3;循环初值加1
MOVA,R3
ANLA,#0FH
CJNEA,#0AH,BACK
MOVR3,#00H
CLRP3.1
CPLP0.0
BACK:
RETI
T_KINT:
SETBPSW.1;标志位1置一,用于判断是否顺序执行三种模式
INCR0;R0加一,用于判断何种模式
CJNER0,#04H,K_RET
CLRPSW.1;R0到04H时清零标志位和R0
MOVR0,#00H
K_RET:
CLRTR1;关定时器1
POPSP
POPSP;出栈两次
MOVDPTR,#0036H
PUSHDPL;DPL压入栈顶
PUSHDPH;DPH压入栈顶
RETI
;Peripheralspecificinitializationfunctions,
;CalledfromtheInit_Devicelabel
PCA_Init:
anlPCA0MD,#0BFh
movPCA0MD,#000h
ret
Timer_Init:
movTMOD,#011h
movCKCON,#002h
ret
Port_IO_Init:
;P0.0-Unassigned,Open-Drain,Digital
;P0.1-Unassigned,Open-Drain,Digital
;P0.2-Unassigned,Open-Drain,Digital
;P0.3-Unassigned,Open-Drain,Digital
;P0.4-Unassigned,Open-Drain,Digital
;P0.5-Unassigned,Open-Drain,Digital
;P0.6-Unassigned,Open-Drain,Digital
;P0.7-Unassigned,Open-Drain,Digital
;P1.0-Unassigned,Open-Drain,Digital
;P1.1-Unassigned,Open-Drain,Digital
;P1.2-Unassigned,Open-Drain,Digital
;P1.3-Unassigned,Open-Drain,Digital
;P1.4-Unassigned,Open-Drain,Digital
;P1.5-Unassigned,Open-Drain,Digital
;P1.6-Unassigned,Open-Drain,Digital
;P1.7-Unassigned,Open-Drain,Digital
;P2.0-Unassigned,Open-Drain,Digital
;P2.1-Unassigned,Open-Drain,Digital
;P2.2-Unassigned,Open-Drain,Digital
;P2.3-Unassigned,Open-Drain,Digital
movXBR1,#040h
ret
Interrupts_Init:
movIE,#08Bh
ret
;Initializationfunctionfordevice,
;CallInit_Devicefromyourmainprogram
Init_Device:
lcallPCA_Init
lcallTimer_Init
lcallPort_IO_Init
lcallInterrupts_Init
ret
end
六、程序测试方法与结果
如预期,三种波形的频率都有显示,而且没有错误。
提高部分:
在C8051F310单片机开发板烧录代码:
不按KINT键时,LED灯以2Hz,1Hz和0.2Hz三种不同频率闪动,各持续10s,在开始、结束和切换模式时,蜂鸣器都响1s,
按一次,LED灯以2Hz闪烁10s后结束;按两次,LED灯以1Hz闪烁10s后结束;
按三次,LED灯以0.2Hz闪烁10s后结束;按四次,切换回顺序执行三种模式。
Ps:
运行过程中,偶尔会出现蜂鸣器响时间超过一秒。
不知道如何调整,但模式切换正常。
七、思考题
1.若想实现3种闪烁方式的持续时间在5s-20s围可调,且每种方式的持续时间各不相同,应如何设计程序?
答:
通过设置中断的循环次数来控制持续时间,所以只要改变循环次数,就能改变持续时间