搜索
您的当前位置:首页正文

单片机实验报告——LED灯控制器

来源:尚佳旅游分享网
《微机实验》报告

LED灯控制器

指导教师: 专业班级 : 姓名: 学号: 联系方式:

一、 任务要求

实验目的:加深对定时 / 计数器、中断、 IO 端口的理解,掌握定时 / 计数器、中断的应 用编程技术及中断程序的调试方法。

实验内容:利用 C8051F310 单片机设计一个 LED灯控制器 主要功能和技术指标要求: 1. LED 灯外接于 P0.0 端。

2. LED 灯分别按 2Hz,1Hz和 0.5Hz 三种不同频率闪动,各持续 3. 在 LED灯开始和停止闪烁时蜂鸣器分别鸣响

1 次。

10s。

4. 利用单片机内部定时器定时,要求采用中断方式。

提高要求:

使用按键( KINT)控制 LED灯闪烁模式的切换。

二、 设计思路

C8051F310单片机片上晶振为 24.5MHz, 采用 8 分频后为 3.0625MHz ,输入时钟信

号为 48 个机器周期, 所以 T1 定时器采用定时方式 1,单次定时最长可以达到的时间为 1.27s ,可以满足 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 赋值时同理。 这样,循环时只要把定时时间和循环次数赋给 效果。

蜂鸣器也采用 T1 定时方式 1,定时一秒。

R1、R2、R7即可,达到减少代码长度的

提高部分:

采用外部中断 0,下降沿触发。外部中断程序里置标志位

判断执行完一种模式后,是否跳出循环结束。

PSW.1和 R0,PSW.5用于

RO加

R0用于判断执行何种模式,每按一次后

一,第四次时就将 R0和 PSW.5清零, 这样程序就又回到了基础部分的循序执行。

因为中断程序执行完后, 会回到原来程序中断的地方, 继续向下执行而给程序运行带来 诸多不便。所以,查看了

RETI 语句的实现形式:将栈顶压入

PCH,POP后再将栈顶压入 PCL

,利用这个定义,只要将需要返回的地址压入 PCH和 PCL就能返回到指定地址。

三、 资源分配

P0.0: 为 LED灯控制端口,高电平触发。 P3.1 :为蜂鸣器控制端口,高电平触发。 P0.1 :为 KINT 键控制端口,下降沿触发。 R1、R2:用于存放计时器计时数据, R7 :存放三种模式的循环次数。

R0 :在外部中断程序中赋值,用于判断采用何种模式。

PSW.1 :为标志位,用于等待定时器中断,中断执行完清零,并在中断处向下继续执

行程序。

PSW.5 :为标志位,用于判断执行一种中断还是三种,在外部中断程序中改变。

R1赋给 TH1、R2 赋给 TL1。

四、 流程图

1. 主程序流程图(含提高部分) :

开 始

初 始 化

允 许 外 部 中 断 0, 下 降 沿 触 发 允 许 定 时 器 1中 断 , 定 时 方 式 1

Y

R0=02H

N

Y

R0>02H

N

CASE3

R1 R2 R7

06H 0C6H 0AH

R1 R2 R7

CASE1 0C1H 0B1H 28H

CASE2

R1 83H R2 63H R7 14H

蜂 鸣 1s

TH1 R1 TL1 R2 A R7

开 定 时 等 待 中 断

R7 R7-1

N

R7=0

Y

PSW.1=0

Y

A=14H

Y

跳 转到 case3

N N

N A>14H

跳 转到 case2

蜂 鸣 1s

Y

等 待 外 部 中 断

5.外部中断流程图

KINT 键按下

PSW.1 置 1

R0

R0+1

N R0=04H

关 定 时 Y PSW.1 清零 R0 清零

关定时器1

POP 出栈两次

DPTR 0036H

DPL 先压入栈顶 DPH 再压入栈顶

返回主程序

3.定时器中断流程图

定 时 器溢 出 触 发中 断

重 新 赋 值 T H1

R1

TL1

R2

标 志 位 PSW.1 置一

LED(P0.0) 取 反

返回 主 程 序

五、 源代码 (含文件头说明、资源使用说明、语句行注释)

;***************************************************************** ;Filename: LED 灯闪烁 .asm ;Decription: LED LED ; ; 2Hz

灯分别按 2Hz,1Hz和 0.5Hz 三种不同频率闪动,各持续

10s。

在 LED灯开始和停止闪烁时蜂鸣器分别鸣响 1 次。按一次按钮, LED以

频率闪动; 按第二次以 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 MAIN ORG 0003H ; 外部中断 0 入口

LJMP T_KINT ORG 001BH ; 定时器 1 入口

LJMP TIME1

MAIN: LCALL Init_Device ;

初始化配置

MOV R0,#00H CLR LED ;

关 led 灯

CLR BEEP CLR PSW.1 ; 标志位 1 清零 CLR PSW.5 ; 标志位 2 清零 SETB EA

; 允许总中断

SETB EX0 ; 外部中断 0 允许 SETB IT0 ; 下降沿延触发 MOV TMOD,#10H ; 置 T1 为定时方式 1 SETB ET1

; 定时器 T1 允许中断

;***************************************************************** ; 外部中断返回处,选择模式

;***************************************************************** CHOO: CJNE R0,#02H,LOOP ; 选择模式

LJMP CASE2 ;R0 等于 02H,跳转到模式 LOOP: JC CASE1

;R0 小于 02H,跳转到模式 LJMP CASE3

;R0

大于 02H,跳转到模式;***************************************************************** ; 模式 1,2Hz闪烁 10s

;***************************************************************** CASE1:MOV R1,#0C1H

MOV R2,#0B1H MOV R7,#28H LJMP START

;***************************************************************** ; 模式 2,1Hz 闪烁 10s

;***************************************************************** CASE2:MOV R1,#83H

MOV R2,#63H MOV R7,#14H LJMP START

;***************************************************************** ; 模式 3,0.5Hz 闪烁 10s

;***************************************************************** CASE3:MOV R1,#06H

MOV R2,#0C6H

2 1 3

MOV R7,#0AH LJMP START

;***************************************************************** ; 闪烁控制程序

;***************************************************************** START:LCALL VOICE

MOV TH1,R1 MOV TL1,R2 MOV A,R7 BACK: SETB TR1 LOOP1:MOV C,PSW.5

JNC LOOP1 CLR PSW.5 DJNZ R7,BACK

; ; ; ; ;

开定时

等待中断,中断会置一标志位 中断结束,继续向下运行 清零标志位

循环,使闪烁达到 10s

PSW.5

;

蜂鸣 1s

MOV C,PSW.1 JC THERE

; PSW.1

为 1 则只执行一种模式跳转到 ; 部中断

CJNE A,#14H,LOOP2 LJMP CASE3 LOOP2:JC THERE

LJMP CASE2

;A<14H

则跳转到模式 2

;

顺序执行时,判断下一模式

则跳转到模式 3

THERE等待外

;A=14H

THERE:LCALL VOICE

SJMP $

;

; 蜂鸣 1s

踏步,等待外部中断

;***************************************************************** ; 蜂鸣器响 1s

;***************************************************************** VOICE:SETB BEEP

;

开蜂鸣

MOV TH1,#06H MOV TL1,#0C6H CLR PSW.5 SETB TR1 LOOP3:MOV C,PSW.5

JNC LOOP3 CLR BEEP RET

;***************************************************************** ; 外部中断 0

;***************************************************************** T_KINT:SETB PSW.1

INC R0

;R0

;

标志位 1 置一,用于判断是否顺序执行三种模式 加一,用于判断何种模式

; 关蜂鸣

;

;

开定时器 1 等待中断

CJNE R0,#04H,K_RET CLR PSW.1 MOV R0,#00H K_RET: CLR TR1

POP SP POP SP

;

;0036H ;DPL ;DPH ;

出栈两次

为选择处地址 压入栈顶 压入栈顶 返回到知道位置

;

关定时器 1

;R0

到 04H时清零标志位和 R0

MOV DPTR,#0036H PUSH DPL PUSH DPH RETI

;***************************************************************** ; 定时器 1 中断

;***************************************************************** TIME1: MOV TH1,R1

MOV TL1,R2 SETB PSW.5 CLR TR1

; ; ;

重新置数 标志位置一 关定时

CPL LED RETI

;LED 取反

;***************************************************************** ; 初始化配置

;***************************************************************** PCA_Init:

;

anl PCA0MD, #0BFh mov PCA0MD, #000h ret

Timer_Init: ; mov TMOD, #010h

mov CKCON, #002h

ret

Port_IO_Init: ; mov XBR1, #040h

ret

Interrupts_Init: ; mov IE, #009h ret Init_Device: lcall PCA_Init lcall Timer_Init lcall Port_IO_Init lcall Interrupts_Init ret

END

关闭看门狗

定时器 1 初始化配置端口初始化配置

中断初始化配置

六、 程序测试方法与结果、软件性能分析

1 、软件调试总体界面:

2 、定时器 1 测试

软件调试时

利用标志位用 LOOP1:MOV C,PSW.5

JNC LOOP1

语句,可以在中断返回后,在中断处继续向下执行代码 硬件调试时,可以顺序以 且蜂鸣器鸣叫 1s 正常 3、定时循环代码测试:

例如执行模式 1 定时 0.25s ,要循环 40 次才能跳出 开始时, R7为 28H

一次循环后 R7为 27H

2Hz,1Hz 和 0.5Hz 三种不同频率闪动,各持续

10s,并

跳出循环时, R7为 0

所以,定时循环程序正常

4、外部中断测试

如图,软件调试时,进入中断程序执行到 再执行一步

RETI 后, DPTR被赋为 0036H,pc 在 00ACH处

Pc 在 0036H处,返回到了指定位置。所以,这说明不管程序运行到了哪里,只要按下 KINT

键,就会返回到指定位置,选择下一种模式运行。

Program Size: data=8.0 xdata=0 code=219

代码利用合理空行和注释, 不仅在视觉上美化了, 而且让各个子段程序的功能一目了然, 方

便调试和检错

硬件调试时,在 C8051F310单片机开发板上跑代码:

不按 KINT 键时, LED灯以 2Hz,1Hz 和 0.5Hz 三种不同频率闪动,各持续 10s,在开始、结

束和切换模式时,蜂鸣器都响

1s,

按下一次时, LED灯以 2Hz 闪烁 10s 后结束; 按下两次时, LED灯以 1Hz 闪烁 10s 后结束; 按下三次时, LED灯以 0.5Hz 闪烁 10s 后结束; 当按下第四次时,又切换回顺序执行三种模式, 在上述过程,蜂鸣器君鸣叫正常。

综上:此次程序,运行正常,很好的完成了要求的基础部分和提高部分

七、 思考题

5s-20s 范围内可调, 且每种方式的持续时间各不

. 若想实现 3 种闪耀方式的持续时间在

相同,应如何设计程序?

答: 三种闪烁方式利用定时器执行,定时时间为 0.25s 、0.5s 、1s

通过循环次数来控制持续时间,所以只要改变循环次数,就能改变持续时间(初始持 续时间可设为 10s)

可以利用矩阵键盘来实现,通过键值扫描程序来判断按下了什么键,再通过键值 处理来执行按键的功能

可以设置 ‘+’键、‘- ’键、和输入键

按下‘ +’键,寄存器如 R5加一;按下‘ - ’键,寄存器如 R5减一

再按输入键后,模式 1 循环次数加 4* R5;模式 1 循环次数加 2* R5;模式 1 循环 次数加 1* R5 ,再执行程序来达到改变持续时间的功能。

八、 实验小结

通过本实验, 我们一方面熟悉了 C8051F310 单片机开发板的结构、 芯片间的连接方法, 同时也掌握了简单的配置方法;另一方面,我们又加深对定时 解,通过编写代码,我们也掌握了定时

/ 计数器、中断、 IO 端口的理

/ 计数器、中断的应用编程技术。

程序写完后,调试是一定会出现很多问题,在软件调试时,我们一定要掌握利用断点 来单步调试的方法, 这样比较容易找出错误, 而且节约大量时间, 在代码量较多时,效果尤 为明显。

写代码时,一定要合理布局,及时写上注释,这样也避免写下面程序时出现错误,同 时也方便调试时查错。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top