当前位置:文档之家› 单片机实验报告——LED灯控制器

单片机实验报告——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:MOV C,PSW.5 ;PSW.5为标志位,进定时器中断后置一JNC LOOP3代替踏步程序等待中断,以便中断完后回到主程序继续向下执行。

为了减少代码长度,可以采用循环结构,循环主题中,将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.外部中断流程图五、源代码(含文件头说明、资源使用说明、语句行注释);*****************************************************************;Filename: LED灯闪烁.asm;Decription: LED LED灯分别按2Hz,1Hz和0.5Hz三种不同频率闪动,各持续10s。

; 在LED灯开始和停止闪烁时蜂鸣器分别鸣响1次。

按一次按钮,LED以; 2Hz 频率闪动;按第二次以1Hz频率闪动;按第二次以0.5Hz频率闪动;; 第四次时又顺序执行三种模式(可以在任何时候按按钮,不必等上一模; 式闪烁完);Designed by: gxy;Date: 2012.10.31;*****************************************************************$include (C8051F310.inc)LED BIT P0.0 ;LED灯控制端口BEEP BIT P3.1 ;蜂鸣器控制端口KINT BIT P0.1 ;KINT按钮端口ORG 0000H ;复位入口LJMP MAINORG 0003H ;外部中断0入口LJMP T_KINTORG 001BH ;定时器1入口LJMP TIME1MAIN: LCALL Init_Device ;初始化配置MOV R0,#00HCLR LED ;关led灯CLR BEEPCLR PSW.1 ;标志位1清零CLR PSW.5 ;标志位2清零SETB EA ;允许总中断SETB EX0 ;外部中断0允许SETB IT0 ;下降沿延触发MOV TMOD,#10H ;置T1为定时方式1SETB ET1 ;定时器T1允许中断;***************************************************************** ;外部中断返回处,选择模式;***************************************************************** CHOO: CJNE R0,#02H,LOOP ;选择模式LJMP CASE2 ;R0等于02H,跳转到模式2 LOOP: JC CASE1 ;R0小于02H,跳转到模式1 LJMP CASE3 ;R0大于02H,跳转到模式3;***************************************************************** ;模式1,2Hz闪烁10s;***************************************************************** CASE1:MOV R1,#0C1HMOV R2,#0B1HMOV R7,#28HLJMP START;***************************************************************** ; 模式2,1Hz闪烁10s;***************************************************************** CASE2:MOV R1,#83HMOV R2,#63HMOV R7,#14HLJMP START;*****************************************************************; 模式3,0.5Hz闪烁10s;*****************************************************************CASE3:MOV R1,#06HMOV R2,#0C6HMOV R7,#0AHLJMP START;*****************************************************************;闪烁控制程序;*****************************************************************START:LCALL VOICE ;蜂鸣1sMOV TH1,R1MOV TL1,R2MOV A,R7BACK: SETB TR1 ;开定时LOOP1:MOV C,PSW.5 ;等待中断,中断会置一标志位PSW.5 JNC LOOP1 ;中断结束,继续向下运行CLR PSW.5 ;清零标志位DJNZ R7,BACK ;循环,使闪烁达到10sMOV C,PSW.1JC THERE ; PSW.1为1则只执行一种模式跳转到THERE等待外;部中断CJNE A,#14H,LOOP2 ;顺序执行时,判断下一模式LJMP CASE3 ;A=14H则跳转到模式3LOOP2:JC THERELJMP CASE2 ;A<14H则跳转到模式2THERE:LCALL VOICE ;蜂鸣1sSJMP $ ;踏步,等待外部中断;*****************************************************************;蜂鸣器响1s;*****************************************************************VOICE:SETB BEEP ;开蜂鸣MOV TH1,#06HMOV TL1,#0C6HCLR PSW.5SETB TR1 ;开定时器1LOOP3:MOV C,PSW.5 ;等待中断JNC LOOP3CLR BEEP ;关蜂鸣RET;*****************************************************************;外部中断0;*****************************************************************T_KINT:SETB PSW.1 ;标志位1置一,用于判断是否顺序执行三种模式INC R0 ;R0加一,用于判断何种模式CJNE R0,#04H,K_RETCLR PSW.1 ;R0到04H时清零标志位和R0MOV R0,#00HK_RET: CLR TR1 ;关定时器1POP SPPOP SP ;出栈两次MOV DPTR,#0036H ;0036H为选择处地址PUSH DPL ;DPL压入栈顶PUSH DPH ;DPH压入栈顶RETI ;返回到知道位置;***************************************************************** ;定时器1中断;***************************************************************** TIME1: MOV TH1,R1MOV TL1,R2 ;重新置数SETB PSW.5 ;标志位置一CLR TR1 ;关定时CPL LED ;LED取反RETI;***************************************************************** ;初始化配置;***************************************************************** PCA_Init: ;关闭看门狗anl PCA0MD, #0BFhmov PCA0MD, #000hretTimer_Init: ;定时器1初始化配置mov TMOD, #010hmov CKCON, #002hretPort_IO_Init: ;端口初始化配置mov XBR1, #040hretInterrupts_Init: ;中断初始化配置mov IE, #009hretInit_Device:lcall PCA_Initlcall Timer_Initlcall Port_IO_Initlcall Interrupts_InitretEND六、程序测试方法与结果、软件性能分析1 、软件调试总体界面:2 、定时器1测试软件调试时利用标志位用LOOP1:MOV C,PSW.5JNC LOOP1语句,可以在中断返回后,在中断处继续向下执行代码硬件调试时,可以顺序以2Hz,1Hz和0.5Hz三种不同频率闪动,各持续10s,并且蜂鸣器鸣叫1s正常3、定时循环代码测试:例如执行模式1定时0.25s,要循环40次才能跳出开始时,R7为28H跳出循环时,R7为0所以,定时循环程序正常4、外部中断测试一次循环后R7为27H如图,软件调试时,进入中断程序执行到RETI后,DPTR被赋为0036H,pc在00ACH处再执行一步Pc在0036H处,返回到了指定位置。

相关主题