LED灯闪烁实验总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程名称:Zigbee技术及应用实验项目: LED灯闪烁实验指导教师:
专业班级:姓名:学号:成绩:
1.实验目的
(1)学习单片机IO口配置与驱动,实现指示灯LED1闪烁,频率为1Hz;
(2)通过模块化编程,养成良好编程习惯。
2.实验设备
(1)CC2530核心板一块;
(2)传感器底板一个;
(3)仿真器一个;
(4)方口USB线一根;
3.实验原理
3.1硬件设计原理
本实验的原理如图1-1所示。
其中,LED1和LED3都串联一个R273和R275限流电阻,然后连接到CC2530的P1口的P1_1和P1_0管脚上。
当P1_1为低电平时,LED1上有电流流过,LED1被点亮,反之熄灭。
图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-633Ω,电阻只要在此范围内即可,一般选择了470Ω的常用电阻。
从图1-1可以看出,如果要让LED1发光,需要设置CC2530对应的I/O口将LED电平拉低。
本实验我们只点亮LED1指示灯,所以只要设置LED1为低电平即可,所以只要我们知道LED1与CC2530哪个管脚相连就可以进行编程。
随着这个思路我们在原理图中找到LED1与CC2530芯片的P1_1管脚连接,将P1_1管脚拉低LED1即被点亮。
3.2程序设计原理
(1)主程序分析
本实验的程序流程如图1-2所示,其重点IO口的配置。
如果以1Hz的频率点亮LED1闪烁,则需要配置P1_1为输出,然后在P1_1输出1Hz的脉冲信号。
图1-2 程序逻辑流程图
(2)IO 端口配置
P1口通过特殊功能寄存器
P1SEL (P1口功能选择寄存器)和P1DIR (P1口方向寄存器)进行配置,其定义如下。
P1SEL (P1功能选择寄存器,P0SEL 同理):
P1DIR (P1方向寄存器,P0DIR 同理):
特殊功能寄存器的配置方法:通过位操作实现对特殊功能寄存器的配置。
【例如,如果需要对P1SEL 的第3位设置为1,则可用P1SEL |= 0x08 (二进制表示为:0000 1000 )来实现;如果需要对P1SEL 的第3位设置为0,则可用P1SEL &= 0xF7来实现。
】
(3)延时子程序设计
延时函数原型如下,在16M Hz主时钟频率下,参数time 的值表示延时了多少ms。
(本例使用的cc2530单片机上电默认使用内部RC振荡器产生系统主时钟,内部主时钟RC振荡器频率为16M Hz)void Delay_ms(unsigned int time)
{
unsigned int i,j;
for(i=0;i<time;i++)
for(j=0;j<500;j++);
}
以上C语言代码由IAR编译生成的汇编代码如图1-3所示。
结合C语言的延时函数和从汇编指令我们可以看到寄存器R0/R1保存变量j的值,R2/R3保存参数time的值,R4/R5保存变量i的值。
根据cc2530数据手册和用户指南上对8051内核的介绍,cc2530内核为兼容标准8051的单周期内核,大多数单字节指令在一个机器周期内都能执行完成。
下面我们结合图1-3中的汇编指令详细分析一下延时时间的具体计算方法。
此处我们忽略入栈代码段的时间消耗。
地址00006B-00006F:将参与比较计算的寄存器R4/R5清零,然后跳转至00008A执行。
地址00008A-00008F:R4/R5(变量i)与R2/R3(参数time)进行减法运算,如果两次都没没有产生借位,即CY=0。
则说明R4/R5累加到了time指定的次数,程序执行到“JNC 0x0097”PC指针将调转到地址000097跳出延时循环,否则循序向下执行。
地址000091-000095:对R0/R1清零,将PC指针跳转到地址000079执行。
地址00079-000080:清除借位寄存器值后将R0/R1与字面量500进行减法运算,然后判断借位寄存器CY的值,如果CY=0则循序执行地址000082处指令,否则PC指针跳转到地址000071处执行。
地址000071-000078:将R0/R1中保存的变量做自加1操作。
地址000082-000089:将R4/R5中保存的变量做自加1操作。
图1-3 延时函数汇编代码
由以上分析可知,地址000091-000095,000071-000080段是C语言代码for(j=0;j<500;j++)的汇编指令。
每次循环,地址00091-000095段指令执行1次,地址000071-000080段指令执行500次。
查询80C51汇编指令集得到一次for(j=0;j<500;j++)循环CC2530需要执行(6+13*500)个指令周期。
在上文中我们查询CC2530数据手册和用户手册得知CC2530处理大多数单字节指令只需要一个机
器周期。
假设所有指令都在一个机器周期内执行完成。
CC2530执行一次for(j=0;j<500;j++)循环最少需要(6+13*500)个机器周期。
单片机一个机器周期等于一个时钟周期,CC2530一个时钟周期为1/16M,所以该次循环最少用时约400us。
假设双字节指令需要的机器周期与标准8051相同。
CC2530执行一次for(j=0;j<500;j++)循环最多需要6*12+9*500+3*12*500个机器周期。
同理该次循环最多用时约1400us。
由于TI没有开源CC2530对汇编的取址和译码操作。
所以这里我们不能明确CC2530指令每一个汇编指令的用时。
只能粗略估算。
上述代码中循环的500次是一个经验值,也可以借助示波器将1ms的延时次数计算出来。
4.实验步骤
步骤一:编写LED灯闪烁程序,编译无误。
步骤二:将CC2530模块(CC2530核心板与传感器底板,以后简称CC2530模块)与仿真器连接,仿真器用USB连接线与电脑进行连接。
步骤三:点击IAR软件中的Download and Debug 按钮进行编译下载。
步骤四:然后单击调试工具栏中的GO 按钮。
步骤五:此时LED1指示灯闪烁,则成功;否则返回步骤一,直至调试成功。
5.实验部分参考代码
main函数文件:
led头文件:
Led灯控制文件:
#include <ioCC2530.h>
#include "led.h"
/******************************************************************
* @fn Led1_Init
* @brief LED1 initialization.
* @param None
* @return None
*********************************/
void Led1_Init(void)
{
/* 配置寄存器将P1_1配置成普通I/O口*/
P1SEL &=~0x02;
/* 配置寄存器将P1_1配置成输出模式*/
P1DIR |=0x02;
LED1 =1;
}
/******************************************************************
* @fn Delay_ms
* @brief This is a delay function.
* @param (in)time - Delay time
* @return None
*********************************/
void Delay_ms(unsigned int time)
{
unsigned int i,j;
for(i=0;i<time;i++)
for(j=0;j<500;j++);
}
6.实验结果
LED1指示灯闪烁一次,频率是1Hz。
7.附录:
时钟周期知识扩展
8051 CPU 简介
增强型8051 内核使用标准的8051 指令集。
因为以下原因指令执行比标准的8051 更快: 每个指令周期是一个时钟,而标准的8051 每个指令周期是12 个时钟。
●消除了总线状态的浪费。
因为一个指令周期与可能的内存存取是一致的,大多数单字节指令在一个时钟周期内执行。
除了速度提高之外,增强型8051 内核还包括结构上的改善:
●第二个数据指针
●一个扩展的18 源中断单元
8051 内核的对象代码兼容业界标准的8051 微控制器。
即对象代码使用8051 内核上执行的业界标准的8051编译器或汇编器编译,在功能上是等同的。
但是,因为8051 内核使用了不同于许多其他8051 类型的一个指令时序,带有时序循环的已有代码可能需要修改。
而且,因为诸如定时器和串行端口的外设单元不同于其他8051内核,包含使用外设单元SFR 的指令的代码不能正确运行。
闪存预取默认不是使能的,但是提高了CPU 高达33%的性能。
这一设置的代价是功率消耗略有增加,但是因为这样更快,大多数情况下提高了能源消耗。
闪存预取可以在FCTL 寄存器中使能。