您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 单片机实验报告——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.主程序流程图(含提高部分):开始初始化允许外部中断0,下降沿触发允许定时器1中断,定时方式1R0=02HR002HR10C1HR20B1HR728HR183HR263HR714HR106HR20C6HR70AHYNNYCASE1CASE2CASE3蜂鸣1sTH1R1TL1R2AR7开定时等待中断R7R7-1R7=0NYPSW.1=0A=14HA14H蜂鸣1s等待外部中断YNNNYY跳转到case2跳转到case32.外部中断流程图KINT键按下PSW.1置1R0R0+1R0=04HPSW.1清零R0清零关定时器1POP出栈两次DPTR0036HDPL先压入栈顶DPH再压入栈顶返回主程序NY3.定时器中断流程图定时器溢出触发中断重新赋值TH1R1TL1R2标志位PSW.1置一关定时LED(P0.0)取反返回主程序五、源代码(含文件头说明、资源使用说明、语句行注释);*****************************************************************;Filename: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;复位入口LJMPMAINORG0003H;外部中断0入口LJMPT_KINTORG001BH;定时器1入口LJMPTIME1MAIN:LCALLInit_Device;初始化配置MOVR0,#00HCLRLED;关led灯CLRBEEPCLRPSW.1;标志位1清零CLRPSW.5;标志位2清零SETBEA;允许总中断SETBEX0;外部中断0允许SETBIT0;下降沿延触发MOVTMOD,#10H;置T1为定时方式1SETBET1;定时器T1允许中断;*****************************************************************;外部中断返回处,选择模式;*****************************************************************CHOO:CJNER0,#02H,LOOP;选择模式LJMPCASE2;R0等于02H,跳转到模式2LOOP:JCCASE1;R0小于02H,跳转到模式1LJMPCASE3;R0大于02H,跳转到模式3;*****************************************************************;模式1,2Hz闪烁10s;*****************************************************************CASE1:MOVR1,#0C1HMOVR2,#0B1HMOVR7,#28HLJMPSTART;*****************************************************************;模式2,1Hz闪烁10s;*****************************************************************CASE2:MOVR1,#83HMOVR2,#63HMOVR7,#14HLJMPSTART;*****************************************************************;模式3,0.5Hz闪烁10s;*****************************************************************CASE3:MOVR1,#06HMOVR2,#0C6HMOVR7,#0AHLJMPSTART;*****************************************************************;闪烁控制程序;*****************************************************************START:LCALLVOICE;蜂鸣1sMOVTH1,R1MOVTL1,R2MOVA,R7BACK:SETBTR1;开定时LOOP1:MOVC,PSW.5;等待中断,中断会置一标志位PSW.5JNCLOOP1;中断结束,继续向下运行CLRPSW.5;清零标志位DJNZR7,BACK;循环,使闪烁达到10sMOVC,PSW.1JCTHERE;PSW.1为1则只执行一种模式跳转到THERE等待外;部中断CJNEA,#14H,LOOP2;顺序执行时,判断下一模式LJMPCASE3;A=14H则跳转到模式3LOOP2:JCTHERELJMPCASE2;A14H则跳转到模式2THERE:LCALLVOICE;蜂鸣1sSJMP$;踏步,等待外部中断;*****************************************************************;蜂鸣器响1s;*****************************************************************VOICE:SETBBEEP;开蜂鸣MOVTH1,#06HMOVTL1,#0C6HCLRPSW.5SETBTR1;开定时器1LOOP3:MOVC,PSW.5;等待中断JNCLOOP3CLRBEEP;关蜂鸣RET;*****************************************************************;外部中断0;*****************************************************************T_KINT:SETBPSW.1;标志位1置一,用于判断是否顺序执行三种模式INCR0;R0加一,用于判断何种模式CJNER0,#04H,K_RETCLRPSW.1;R0到04H时清零标志位和R0MOVR0,#00HK_RET:CLRTR1;关定时器1POPSPPOPSP;出栈两次MOVDPTR,#0036H;0036H为选择处地址PUSHDPL;DPL压入栈顶PUSHDPH;DPH压入栈顶RETI;返回到知道位置;*****************************************************************;定时器1中断;*****************************************************************TIME1:MOVTH1,R1MOVTL1,R2;重新置数SETBPSW.5;标志位置一CLRTR1;关定时CPLLED;LED取反RETI;*****************************************************************;初始化配置;*****************************************************************PCA_Init:;关闭看门狗anlPCA0MD,#0BFhmovPCA0MD,#000hretTimer_Init:;定时器1初始化配置movTMOD,#010hmovCKCON,#002hretPort_IO_Init:;端口初始化配置movXBR1,#040hretInterrupts_Init:;中断初始化配置movIE,#009hretInit_Device:lcallPCA_InitlcallTimer_InitlcallPort_IO_InitlcallInterrupts_InitretEND六、程序测试方法与结果、软件性能分析1、软件调试总体界面:2、定时器1测试软件调试时利用标志位用LOOP1:MOVC,PSW.5JNCLOOP1语句,可以在中断返回后,在中断处继续向下执行代码硬件调试时,可以顺序以2Hz,1Hz和0.5Hz三种不同频率闪动,各持续10s,并且蜂鸣器鸣叫1s正常3、定时循环代码测试:例如执行模式1定时0.25s,要循环40次才能跳出开始时,R7为28H一次循环后R7为27H跳出循环时,R7为0所以,定时循环程序正常4、外部中断测试如
本文标题:单片机实验报告——LED灯控制器
链接地址:https://www.777doc.com/doc-5146683 .html