您好,欢迎来到爱够旅游网。
搜索
您的当前位置:首页LED灯闪烁实验总结

LED灯闪烁实验总结

来源:爱够旅游网
课程名称:Zigbee技术及应用 实验项目:LED灯闪烁实验 指导教师: ________

专业班级: ___________ 姓名: ________ 学号: _______________ 成绩: _________

1. 实验目的

(1) 学习单片机10 口配置与驱动,实现指示灯LED1闪烁,频率为1Hz; (2) 通过模块化编程,养成良好编程习惯。

2. 实验设备

(1) CC253C核心板一块; (2) 传感器底板一个; (3) 仿真器一个; (4) 方口 USB线一根;

3. 实验原理

3.1硬件设计原理

本实验的原理如图1-1所示。其中,LED1和LED3都串联一个R273和R275限流电阻,然后连接到

CC2530勺P1 口的P1_1和P1_0管脚上。当P1_1为低电平时,LED1上有电流流过,LED1被点亮,反

之 熄灭。

33V LED1

T

_ ____________ _________________ gS P11—

LED3

------------------- ---------------------------- —

4T0R

图 1-1 LED 灯原理图

限流电阻R的计算:图中R273和R275限流电阻,其计算公式如下:

R= (U— UF)/ID

(1-1)

式中,U为电路供电电压,UF为LED正向压降,ID为LED的工作电流。对于普通LED发光二极管, 其正向压降:黄色为1.4V、红色为1.6V、蓝/白色为2.5V;点亮工作电流为3-20mA。

由图1-1可知,电路供电电压为U=3.3V,LED1选择为黄色发光二极管(压降是 1.4V),带入(1-1) 式可得R的取值范围是95-633Q,电阻只要在此范围内即可,一般选择了 470Q的常用电阻。 从图1-1可以看出,如果要让LED1发光,需要设置CC253C对应的I/O 口将LED电平拉低。本实验 我们只点亮LED1指示灯,所以只要设置LED1为低电平即可,所以只要我们知道LED1与CC2530哪个 管脚相连就可以进行编程。随着这个思路我们在原理图中找到 将P1_1管脚拉低LED1即被点亮。

LED1与CC2530芯片的P1_1管脚连接,

3.2 程序设计原理

( 1 )主程序分析

本实验的程序流程如图1-2所示,其重点IO 口的配置。如果以1Hz的频率点亮LED1闪烁,贝嚅要 配置P1_1为输出,然后在P1_1输出1Hz的脉冲信号。

开始

图1-2程序逻辑流程图

(2) 10端口配置

P1 口通过特殊功能寄存器 P1SEL ( P1 口功能选择寄存器)和P1DIR ( P1 口方向寄存器)进行配 置,其定义如下

P1SEL( P1功能选择寄存器,P0SEL同理): 位号码 7:0 名称 SELP1_[7:0] 复位 0x00 R/W R/W 描述 P1.7到P0.0功能选择 0: 通用1 / 0 1:外设功能

P1DIR( P1方向寄存器,P0DIR同理): 位号码 7:0 名称 复位 R/W R/W 描述 P1.7到P1.0的I/O 方向 0:输入 1:输出 SELP1_[7:0] 0x00 特殊功能寄存器的配置方法:通过位操作实现对特殊功能寄存器的配置。【例如,如果需要对P1SEL 的第3位设置为1,则可用P1SEL |= 0x08 (二进制表示为:0000 1000来实现;如果需要对P1SEL的第3 位设置为0,则可用P1SEL &= 0xF7来实现。】

(3)延时子程序设计

延时函数原型如下,在16M Hz主时钟频率下,参数time的值表示延时了多少ms。(本例使用的 cc253(单片机上电默认使用内部RC振荡器产生系统主时钟,内部主时钟 RC振荡器频率为16M Hz)

void Delay_m$ un sig nedint time) {

unsigned int i, j; for(i=0; ifor(j= 0; j<50Q j++);

}

以上C语言代码由IAR编译生成的汇编代码如图1-3所示。

结合C语言的延时函数和从汇编指令我们可以看到寄存器 R0/R1保存变量j的值,R2/R3保存参数 time的值,R4/R5保存变量啲值。

根据cc253(数据手册和用户指南上对8051内核的介绍,cc253(内核为兼容标准8051的单周期内核, 大多数单字节指令在一个机器周期内都能执行完成。

下面我们结合图1-3中的汇编指令详细分析一下延时时间的具体计算方法。此处我们忽略入栈代码 段的时间消耗。

地址00006B-00006F将参与比较计算的寄存器 R4/R5清零,然后跳转至00008A执行。

地址00008A-00008F R4/R5(变量i)与R2/R3(参数time)进行减法运算,如果两次都没没有产生借位, 即CY=0。则说明R4/R5累加到了 time指定的次数,程序执行到“ JNC 0x0097' PC指针将调转

到地址 00009拠出延时循环,否则循序向下执行。

地址000091-000095对R0/R1清零,将PC指针跳转到地址000079执行

地址00079-000080清除借位寄存器值后将R0/R1与字面量500进行减法运算,然后判断借位寄存 器CY的值,如果CY=0则循序执行地址000082处指令,否则PC指针跳转到地址00007处执行

地址000071-000078将R0/R1中保存的变量做自加1操作。

地址000082-0000将R4/R5中保存的变量做自加1操作。

Disasserrnly 农to DisassemUy

X Register ▼ -o^coCodc 节 3A

- OxUC

■ U

f OT(i = 0- it time; i++) R4.#OxOO -(J

© I)ela7_n5' 7D OU

OD006F 80 19

7 - ft\\T(

000071 ES 0 ; 0D0C72 24 01 000074 F0 000075 E9 0JQQ76 34

-1

2 3 —4 -5

«

1- 7

- 0 - D

- 0

UJUUbP

11017 Rb.JFUxOU SJMP 3xOOSA

3<&oa:卄+);

MOV A PO

ADD A.#0x01

卩血。。

■ & ・D ■ 0 ・ 0

- 0x00

MOV RO. A

MOV A.El 韻兀i匚山”MOV R1.A

j3B

-BR0 -BRI BR2

■ 0

・ D = U

omn?q □D007A CLP 匚 E0 KOV b”RO OOOC7B 94 F4

SUBB A^0zF4 ttOV

DD007B E9 A,R1 SUBB A. JfUEOl JC U0U07E 叭 01 JxDO?l time; in) 000090 40 EF

f or(i = 0; i c 003082 EC MOV ODOOB3 24 01 ADD A^OxOl

MOV Q?0C35 FC R4 , A MOV 葺茁 000036 ED

ADDC ji,fasoo 000037 34 ao

MOV RS, A 000063 FD

time; UM-] :i or ( i = 0

CLR C3

M07 03008B EC

0D0C3C 9A 3U3B 0D0D8D ED MOT

SUBB 03008E 3B

JH匚 j<500; 03000F 50 O

for(j=Q; j*)

03Q091 78 00 : R0 ^0x00

Sl.tfOxOQ QUO79 00 MOV

030095 80 E2 MOV

。咒

0JO07S F? i or(j- 0;

-ER3 -ER4

CRC

-- 0

1

= 0 = 0

- 0

- ER7 二IPSE 「「

F

=0 U

L OV =0 l RS0 =0

=o -RSI

=u k FO

=0 k AC

-0 L CY

-QicOQ RO

=OsrQl R1

=0KF4 R2

=OKOI R3

E4 =0x00

=OzOO

= 0 = nxnr =0

000091

030C9'7 □ 2 ac 39

L=dl_ .丄让

na in

SJMP

LJMP ?BKET_FF

12 00

LCALL ledl_Imt . :?rel*v 图1-3延时函数汇编代码

R7

=UxCS SF

= GFP

= SPX

DPTH -O^OOED 7CDANZ =OKOO

=OKOOGE PC

=OKOO =OKOO

由以上分析可知,地址000091-000095 000071-00008段是C语言代码for(j=0; j<50Q j++)的汇编 指令。每次循环,地址00091-00009段指令执行1次,地址000071-00008段指令执行500次。查询80C51 汇编指令集得到一次for(j=0; j<50Q j++)循环CC253C需要执行(6+13*500)个指令周期。

在上文中我们查询CC253C数据手册和用户手册得知CC2530处理大多数单字节指令只需要一个机

器周期。

假设所有指令都在一个机器周期内执行完成。 CC253C执行一次for(j = 0; j<50Q j++)循环最少需 要(6+13*500)个机器周期。单片机一个机器周期等于一个时钟周期,CC253C一个时钟周期为1/16M, 所以该次循环最少用时约400us

假设双字节指令需要的机器周期与标准 8051相同。CC2530执行一次for(j=0; j<50Q j++)循环最 多需要6*12+9*500+3*12*500个机器周期。同理该次循环最多用时约 1400us

由于TI没有开源CC2530对汇编的取址和译码操作。所以这里我们不能明确CC253C指令每一个汇编 指令的用时。只能粗略估算。上述代码中循环的500次是一个经验值,也可以借助示波器将1ms的延时 次数计算出来。

4. 实验步骤

步骤一:编写LED灯闪烁程序,编译无误。

步骤二:将CC2530莫块(CC2530核心板与传感器底板,以后简称 CC2530莫块)与仿真器连接, 仿真器用USE连接线与电脑进行连接。

步骤三:点击IAR软件中的Download and Debug按钮进行编译下载。 步骤四:然后单击调试工具栏中的GO按钮。

步骤五:此时LED1指示灯闪烁,贝U成功;否则返回步骤一,直至调试成功。

5. 实验部分参考代码

main函数文件:

t***************************************************************** * @fn mai n * @brief The main fun cti on. * @param None * @return None ********************************

void mai n(void) {

/* LED1 初始化 */ Led1」n it (); while(1) {

/* 开 LED1 */ LED1_ON (); /*延时约500ms */ Delay_ms (500); /* 关 LED1 */ LED1_OFF (); /*延时约500ms */ Delay_ms (500); } }

lec头文件:

#ifndef __LED_H #defi ne __LED_H #i nclude #defi ne LED1 P1_1 /*宏定义开LED1 */

#defi ne LED1_ON() LED1 = 0 /*宏定义关LED1 */

#defi ne LED1_OFF() LED1 = 1 /*函数声明部分 */

extern void Led1_ In it (void);

exter n void Delay(u nsig ned int time); #en dif

// __LED_H

Led灯控制文件:

#i nclude #i nclude \"led.h\" /****************************************************************** * @fn * @brief * @param Led1」nit LED1 in itializati on. None * @return None *********************************/ void Led1」ni t (void) { /* 配置寄存器将 P1_1配置成普通I/O 口 */ P1SEL &=〜0x02; /* 配置寄存器将 P1_1配置成输出模式 0x02; 1; */ P1DIR |= LED1 = } /****************************************************************** * @fn * @param Delay_ms (in )time - Delay time * @brief This is a delay fun cti on. * @return None *********************************/ void Delay_ms(u nsig ned int time) { un sig ned int i, j; for (i = 0; iLED1指示灯闪烁一次,频率是1Hz

7. 附录:

时钟周期知识扩展

8051 CPU 简介

增强型8051内核使用标准的8051指令集。因为以下原因指令执行比标准的

8051更快:

每个指令周期是一个时钟,而标准的 8051每个指令周期是12个时钟

消除了总线状态的浪费

因为一个指令周期与可能的内存存取是一致的,大多数单字节指令在一个时钟周期内执行。除了 速度提高之外,增强型 8051 内核还包括结构上的改善:

第二个数据指针

一个扩展的 18 源中断单元

8051 内核的对象代码兼容业界标准的 8051 微控制器。 即对象代码使用 8051 内核上执行的业 界标准的 8051编译器或汇编器编译,在功能上是等同的。但是,因为 8051 内核使用了不同于许多 其他 8051 类型的一个指令时序,带有时序循环的已有代码可能需要修改。而且,因为诸如定时器和 串行端口的外设单元不同于其他 8051内核,包含使用外设单元 SFR 的指令的代码不能正确运行。

闪存预取默认不是使能的, 但是提高了 CPU 高达 33%的性能。 这一设置的代价是功率消耗略有 增加,但是因为这样更快,大多数情况下提高了能源消耗。闪存预取可以在 FCTL 寄存器中使能。

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

Copyright © 2019- igbc.cn 版权所有 湘ICP备2023023988号-5

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务