LED灯闪烁实验总结.docx

上传人:b****5 文档编号:7784414 上传时间:2023-01-26 格式:DOCX 页数:11 大小:50.42KB
下载 相关 举报
LED灯闪烁实验总结.docx_第1页
第1页 / 共11页
LED灯闪烁实验总结.docx_第2页
第2页 / 共11页
LED灯闪烁实验总结.docx_第3页
第3页 / 共11页
LED灯闪烁实验总结.docx_第4页
第4页 / 共11页
LED灯闪烁实验总结.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

LED灯闪烁实验总结.docx

《LED灯闪烁实验总结.docx》由会员分享,可在线阅读,更多相关《LED灯闪烁实验总结.docx(11页珍藏版)》请在冰豆网上搜索。

LED灯闪烁实验总结.docx

LED灯闪烁实验总结

指导教师:

课程名称:

Ziqbee技术及应用实验项目:

LED灯闪烁实验

专业班级:

姓名:

学号:

成绩:

1・实验目的

(1)学习单片机10口配置与驱动,实现指示灯LED1闪烁,频率为1Hz;

(2)通过模块化编程,养成良好编程习惯。

2.实验设备

(1)CC253C核心板一块;

(2)传感器底板一个;

(3)仿真器一个;

(4)方口USB线一根;

3.实验原理

3.1硬件设计原理

本实验的原理如图1」所示。

其中,LED1和LED3都串联一个R273和R275限流电阻,然后连接到

CC2530勺P1口的P11和P10管脚上。

当P11为低电平时,LED1±有电流流过,LED1被点亮,反之

熄灭。

33VLED1

T片

gS

LED3

4T0R

图LED灯原理图

限流电阻R的计算:

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

R二(U—UF)/ID(1-1)

式中,U为电路供电电压,UF为LED正向压降,ID为LED的工作电流。

对于普通LED发光二极管,

其正向压降:

黄色为1.4V、红色为1.6V、蓝/白色为2.5V;点亮工作电流为3-20mAo

由图可知,电路供电电压为U=3.3V,LED1选择为黄色发光二极管(压降是1.4V),带入

1)式可得R的取值范围是95-633Q,电阻只要在此范围内即可,一般选择了470Q的常用电阻。

从图可以看出,如果要让LED1发光,需要设置CC253C对应的I/O口将LED电平拉低。

本实验我们只点亮LED1指示灯,所以只要设置LED1为低电平即可,所以只要我们知道LED1与CC2530哪个管脚相连就可以进行编程。

随着这个思路我们在原理图中找到LED1与CC2530芯片的P1_1管脚连接,

将P1_1管脚拉低LED1即被点亮。

3.2程序设计原理

(1)主程序分析

本实验的程序流程如图所示,其重点I0口的配置。

如果以1Hz的频率点亮LED1闪烁,贝嚅要配置

P1_1为输出,然后在P1_1输出1Hz的脉冲信号。

开始

图1-2程序逻辑流程图

(2)10端口配置

P1口通过特殊功能寄存器P1SEL(P1口功能选择寄存器)和P1DIR(P1口方向寄存器)进行配

置,其定义如下

P1SEL(P1功能选择寄存器,P0SEL同理):

位号码

名称

复位

R/W

描述

7:

0

SELP1」7:

0]

0x00

R/W

P1.7到P0.0功能选择

0:

通用1/0

1:

外设功能

P1DIR(P1方向寄存器,P0DIR同理):

位号码

名称

复位

R/W

描述

7:

0

SELP1」7:

0]

0x00

R/W

P1.7至IJP1.0的I/O方向

0:

输入

1:

输出

特殊功能寄存器的配置方法:

通过位操作实现对特殊功能寄存器的配置。

【例如,如果需要对P1SEL

的第3位设置为1,则可用P1SEL|=0x08(二进制表示为:

00001000来实现;如果需要对P1SEL的第3

位设置为Q则可用P1SEL&=0xF7来实现。

(3)延时子程序设计

延时函数原型如下,在16MHz主时钟频率下,参数time的值表示延时了多少ms。

(本例使用的cc253(单片机上电默认使用内部RC振荡器产生系统主时钟,内部主时钟RC振荡器频率为16MHz)

voidDelay_m$unsignedinttime)

{

unsignedinti,j;

for(i=0;i

for(j=0;j<50Qj++);

}

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

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

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

下面我们结合图中的汇编指令详细分析一下延时时间的具体计算方法。

此处我们忽略入栈代码段的时间消耗。

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

地址00008A-00008FR4/R5(变量i)与R2/R3(参数time)进行减法运算,如果两次都没没有产生借位,即CY=0o则说明R4/R5累加到了time指定的次数,程序执行到“JNC0x0097*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-000089将R4/R5中保存的变量做自加1操作。

fOT(i

=0-

ittime;

I)ela7_n5*

UJUUbP

7D

ClJ

OD006F

80

19

ft\T(

7-

000071

ES

0D0C72

24

01

000074

F0

000075

E9

0JQQ76

34

0JO07SF?

Disassemlly

i++)

R4.#OxOO

11017RbJFUxOUSJMP3xOOSA3v&oa:

卄+);

MOVAPOADDA.#0x01MOVRO.AMOVA.E1韻兀i匚山”卩血。

MOVRl.A

EO

OOOC7B

94

F4

DD007B

E9

U0U07E

01

000090

40

EF

ior(i-0:

omn?

qnD007A

j

CLP匚

KOVb/O

SUBBAA0zF4ttOV

A,R1SUBBA.J1UEO1JCJxDO?

ltime;in)

000091

12

0054

LCALL

ledl_Imt.:

?

rel*v

for(i=0;ic

3A

・(J

-1

2

3

—4

-5

«

1-7

3B

-BRO

-BRI

rBR2

•ER3

•ER4

CRC

--0

1-ER7

-Ipse

f

LOV

1RS0-RSIkFOkACLCY

RO

R1

R2

R3

E4

R7SFGFPSPX

DPTH

•OxUC

■u

-0・D

・0

■&

・D

■0

-0

・0x00

■0

•D

=u=0

=0

-0

=0

=nxnr

=0

=0

=0

=0

=0

=u

=0

-0

・QicOQ=OsrQI=0KF4=OKOI=0x00=OzOO=OKOO=OKOO=UxCS

-OAOOED

7CDANZ=OKOO

PC=OKOOGE

Disasserrnly

X

Register

农to▼

-oAcoCodc巾

图「3延时函数汇编代码

由以上分析可知,地址000091-000095000071-00008段是C语言代码for(j=0;j<50Qj++)的汇编指

令。

每次循环,地址00091-00009段指令执行1次,地址000071-00008段指令执行500次。

查询80C51

汇编指令集得到一次for(j=0;j<50Qj++)循环CC253C需要执行(6+13*500)个指令周期。

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

假设所有指令都在一个机器周期内执行完成。

CC253C执行一次for(j=0;j<50Qj++)循环最少需要(6+13*500)个机器周期。

单片机一个机器周期等于一个时钟周期,CC253C-个时钟周期为1/16M,所以该次循环最少用时约400us

假设双字节指令需要的机器周期与标准8051相同。

CC2530执行一次for(j=0;jv50Qj++)循环最多需要6*12+9*500+3*12*500个机器周期。

同理该次循坏最多用时约1400us

由于TI没有开源CC2530对汇编的取址和译码操作。

所以这里我们不能明确CC253C指令每一个汇编指令的用时。

只能粗略估算。

上述代码中循环的500次是一个经验值,也可以借助示波器将1ms的延时次数计算出来。

4.实验步骤

步骤一:

编写LED灯闪烁程序,编译无误。

步骤二:

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

步骤三:

点击IAR软件中的DownloadandDebug按钮进行编译下载。

步骤四:

然后单击调试工具栏中的GO按钮。

步骤五:

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

5.实验部分参考代码

main函数文件:

*@fnmain

*@briefThemainfunction.

*@paramNone

*@returnNone

voidmain(void)

/*LED1初始化*/

Led1」nit();

while

(1)

{

/*开LED1*/

LED1_ON();

广延时约500ms7

Delay_ms(500);

/*关LED1*/

LED1_OFF();

广延时约500ms*/

Delay_ms(500);

lec头文件:

#ifndef_LED_H

#define_LED_H

#include

#defineLED1P1_1

广宏定义开LED1*/

#defineLED1_ON()LED1=0

广宏定义关LED1*/

#defineLED1_OFF()LED1=1

广函数声明部分*/

externvoidLed1_Init(void);

externvoidDelay(unsignedinttime);

#endif//_LED_H

Led灯控制文件:

消除了总线状态的浪费

因为一个指令周期与可能的内存存取是一致的,大多数单字节指令在一个时钟周期内执行。

除了速度提高之外,增强型8051内核还包括结构上的改善:

第二个数据指针

一个扩展的18源中断单元

8051内核的对象代码兼容业界标准的8051微控制器。

即对象代码使用8051内核上执行的业界标

准的8051编译器或汇编器编译,在功能上是等同的。

但是,因为8051内核使用了不同于许多其他

8051类型的一个指令时序,带有时序循环的已有代码可能需要修改。

而且,因为诸如定时器和串行端口的外设单元不同于其他8051内核,包含使用外设单元SFR的指令的代码不能正确运行。

闪存预取默认不是使能的,

但是提高了CPU高达33%的性能。

这一设置的代价是功率消耗略有增

 

加,但是因为这样更快,大多数情况下提高了能源消耗。

闪存预取可以在FCTL寄存器中使能。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1