单片机实验报告LED灯控制器.docx
《单片机实验报告LED灯控制器.docx》由会员分享,可在线阅读,更多相关《单片机实验报告LED灯控制器.docx(17页珍藏版)》请在冰豆网上搜索。
单片机实验报告LED灯控制器
《微机实验》报告
LED灯控制器
指导教师:
专业班级:
姓名:
学号:
联系方式:
一、任务要求
实验目的:
加深对定时/计数器、中断、IO端口的理解,掌握定时/计数器、中断的应用编程技术及中断程序的调试方法。
实验内容:
利用C8051F310单片机设计一个LED灯控制器
主要功能与技术指标要求:
1、LED灯外接于P0、0端。
2、LED灯分别按2Hz,1Hz与0、5Hz三种不同频率闪动,各持续10s。
3、在LED灯开始与停止闪烁时蜂鸣器分别鸣响1次。
4、利用单片机内部定时器定时,要求采用中断方式。
提高要求:
使用按键(KINT)控制LED灯闪烁模式的切换。
二、设计思路
C8051F310单片机片上晶振为24、5MHz,采用8分频后为3、0625MHz,输入时钟信号为48个机器周期,所以T1定时器采用定时方式1,单次定时最长可以达到的时间为1、027s,可以满足0、5Hz就是的定时要求。
基础部分:
给TMOD赋值10H,即选用T1定时器采用定时方式1,三种频率对应的半周期时间为0、25s、0、5s、1s。
计算得需给TH1与TL1为C1H、B1H;83H、63H;06H、C6H。
要使闪烁持续10s,三种模式需要各循环40、20、10次。
用LOOP3:
MOVC,PSW、5;PSW、5为标志位,进定时器中断后置一
JNCLOOP3
代替踏步程序等待中断,以便中断完后回到主程序继续向下执行。
为了减少代码长度,可以采用循环结构,循环主题中,将R1、R2分别赋给TH1、TL1,R7为循环次数(用DJNZ语句实现);定时中断里,重新给TH1、TL1赋值时同理。
这样,循环时只要把定时时间与循环次数赋给R1、R2、R7即可,达到减少代码长度的效果。
蜂鸣器也采用T1定时方式1,定时一秒。
提高部分:
采用外部中断0,下降沿触发。
外部中断程序里置标志位PSW、1与R0,PSW、5用于判断执行完一种模式后,就是否跳出循环结束。
R0用于判断执行何种模式,每按一次后RO加一,第四次时就将R0与PSW、5清零,这样程序就又回到了基础部分的循序执行。
因为中断程序执行完后,会回到原来程序中断的地方,继续向下执行而给程序运行带来诸多不便。
所以,查瞧了RETI语句的实现形式:
将栈顶压入PCH,POP后再将栈顶压入PCL
利用这个定义,只要将需要返回的地址压入PCH与PCL就能返回到指定地址。
三、资源分配
P0、0:
为LED灯控制端口,高电平触发。
P3、1:
为蜂鸣器控制端口,高电平触发。
P0、1:
为KINT键控制端口,下降沿触发。
R1、R2:
用于存放计时器计时数据,R1赋给TH1、R2赋给TL1。
R7:
存放三种模式的循环次数。
R0:
在外部中断程序中赋值,用于判断采用何种模式。
PSW、1:
为标志位,用于等待定时器中断,中断执行完清零,并在中断处向下继续执行程序。
PSW、5:
为标志位,用于判断执行一种中断还就是三种,在外部中断程序中改变。
四、流程图
1、主程序流程图(含提高部分):
2、外部中断流程图
3、定时器中断流程图
五、源代码(含文件头说明、资源使用说明、语句行注释)
;*****************************************************************
;:
LED灯闪烁、asm
;Decription:
LEDLED灯分别按2Hz,1Hz与0、5Hz三种不同频率闪动,各持续10s。
;在LED灯开始与停止闪烁时蜂鸣器分别鸣响1次。
按一次按钮,LED以
;2Hz频率闪动;按第二次以1Hz频率闪动;按第二次以0、5Hz频率闪动;
;第四次时又顺序执行三种模式(可以在任何时候按按钮,不必等上一模
;式闪烁完)
;Designedby:
gxy
;Date:
2012、10、31
;*****************************************************************
$include(C8051F310、inc)
LEDBITP0、0;LED灯控制端口
BEEPBITP3、1;蜂鸣器控制端口
KINTBITP0、1;KINT按钮端口
ORG0000H;复位入口
LJMPMAIN
ORG0003H;外部中断0入口
LJMPT_KINT
ORG001BH;定时器1入口
LJMPTIME1
MAIN:
LCALLInit_Device;初始化配置
MOVR0,#00H
CLRLED;关led灯
CLRBEEP
CLRPSW、1;标志位1清零
CLRPSW、5;标志位2清零
SETBEA;允许总中断
SETBEX0;外部中断0允许
SETBIT0;下降沿延触发
MOVTMOD,#10H;置T1为定时方式1
SETBET1;定时器T1允许中断
;*****************************************************************
;外部中断返回处,选择模式
;*****************************************************************
CHOO:
CJNER0,#02H,LOOP;选择模式
LJMPCASE2;R0等于02H,跳转到模式2
LOOP:
JCCASE1;R0小于02H,跳转到模式1
LJMPCASE3;R0大于02H,跳转到模式3
;*****************************************************************
;模式1,2Hz闪烁10s
;*****************************************************************
CASE1:
MOVR1,#0C1H
MOVR2,#0B1H
MOVR7,#28H
LJMPSTART
;*****************************************************************
;模式2,1Hz闪烁10s
;*****************************************************************
CASE2:
MOVR1,#83H
MOVR2,#63H
MOVR7,#14H
LJMPSTART
;*****************************************************************
;模式3,0、5Hz闪烁10s
;*****************************************************************
CASE3:
MOVR1,#06H
MOVR2,#0C6H
MOVR7,#0AH
LJMPSTART
;*****************************************************************
;闪烁控制程序
;*****************************************************************
START:
LCALLVOICE;蜂鸣1s
MOVTH1,R1
MOVTL1,R2
MOVA,R7
BACK:
SETBTR1;开定时
LOOP1:
MOVC,PSW、5;等待中断,中断会置一标志位PSW、5
JNCLOOP1;中断结束,继续向下运行
CLRPSW、5;清零标志位
DJNZR7,BACK;循环,使闪烁达到10s
MOVC,PSW、1
JCTHERE;PSW、1为1则只执行一种模式跳转到THERE等待外
;部中断
CJNEA,#14H,LOOP2;顺序执行时,判断下一模式
LJMPCASE3;A=14H则跳转到模式3
LOOP2:
JCTHERE
LJMPCASE2;A<14H则跳转到模式2
THERE:
LCALLVOICE;蜂鸣1s
SJMP$;踏步,等待外部中断
;*****************************************************************
;蜂鸣器响1s
;*****************************************************************
VOICE:
SETBBEEP;开蜂鸣
MOVTH1,#06H
MOVTL1,#0C6H
CLRPSW、5
SETBTR1;开定时器1
LOOP3:
MOVC,PSW、5;等待中断
JNCLOOP3
CLRBEEP;关蜂鸣
RET
;*****************************************************************
;外部中断0
;*****************************************************************
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;0036H为选择处地址
PUSHDPL;DPL压入栈顶
PUSHDPH;DPH压入栈顶
RETI;返回到知道位置
;*****************************************************************
;定时器1中断
;*****************************************************************
TIME1:
MOVTH1,R1
MOVTL1,R2;重新置数
SETBPSW、5;标志位置一
CLRTR1;关定时
CPLLED;LED取反
RETI
;*****************************************************************
;初始化配置
;*****************************************************************
PCA_Init:
;关闭瞧门狗
anlPCA0MD,#0BFh
movPCA0MD,#000h
ret
Timer_Init:
;定时器1初始化配置
movTMOD,#010h
movCKCON,#002h
ret
Port_IO_Init:
;端口初始化配置
movXBR1,#040h
ret
Interrupts_Init:
;中断初始化配置
movIE,#009h
ret
Init_Device:
lcallPCA_Init
lcallTimer_Init
lcallPort_IO_Init
lcallInterrupts_Init
ret
END
六、程序测试方法与结果、软件性能分析
1、软件调试总体界面:
2、定时器1测试
软件调试时
利用标志位用LOOP1:
MOVC,PSW、5
JNCLOOP1
语句,可以在中断返回后,在中断处继续向下执行代码
硬件调试时,可以顺序以2Hz,1Hz与0、5Hz三种不同频率闪动,各持续10s,并且蜂鸣器鸣叫1s正常
3、定时循环代码测试:
例如执行模式1定时0、25s,要循环40次才能跳出
一次循环后R7为27H
开始时,R7为28H
跳出循环时,R7为0
所以,定时循环程序正常
4、外部中断测试
如图,软件调试时,进入中断程序执行到RETI后,DPTR被赋为0036H,pc在00ACH处
再执行一步
Pc在0036H处,返回到了指定位置。
所以,这说明不管程序运行到了哪里,只要按下KINT键,就会返回到指定位置,选择下一种模式运行。
ProgramSize:
data=8、0xdata=0code=219
代码利用合理空行与注释,不仅在视觉上美化了,而且让各个子段程序的功能一目了然,方便调试与检错
硬件调试时,在C8051F310单片机开发板上跑代码:
不按KINT键时,LED灯以2Hz,1Hz与0、5Hz三种不同频率闪动,各持续10s,在开始、结束与切换模式时,蜂鸣器都响1s,
按下一次时,LED灯以2Hz闪烁10s后结束;
按下两次时,LED灯以1Hz闪烁10s后结束;
按下三次时,LED灯以0、5Hz闪烁10s后结束;
当按下第四次时,又切换回顺序执行三种模式,
在上述过程,蜂鸣器君鸣叫正常。
综上:
此次程序,运行正常,很好的完成了要求的基础部分与提高部分
七、思考题
、若想实现3种闪耀方式的持续时间在5s-20s范围内可调,且每种方式的持续时间各不相同,应如何设计程序?
答:
三种闪烁方式利用定时器执行,定时时间为0、25s、0、5s、1s
通过循环次数来控制持续时间,所以只要改变循环次数,就能改变持续时间(初始持续时间可设为10s)
可以利用矩阵键盘来实现,通过键值扫描程序来判断按下了什么键,再通过键值处理来执行按键的功能
可以设置‘+’键、‘-’键、与输入键
按下‘+’键,寄存器如R5加一;按下‘-’键,寄存器如R5减一
再按输入键后,模式1循环次数加4*R5;模式1循环次数加2*R5;模式1循环次数加1*R5,再执行程序来达到改变持续时间的功能。
八、实验小结
通过本实验,我们一方面熟悉了C8051F310单片机开发板的结构、芯片间的连接方法,同时也掌握了简单的配置方法;另一方面,我们又加深对定时/计数器、中断、IO端口的理解,通过编写代码,我们也掌握了定时/计数器、中断的应用编程技术。
程序写完后,调试就是一定会出现很多问题,在软件调试时,我们一定要掌握利用断点来单步调试的方法,这样比较容易找出错误,而且节约大量时间,在代码量较多时,效果尤为明显。
写代码时,一定要合理布局,及时写上注释,这样也避免写下面程序时出现错误,同时也方便调试时查错。