LED灯闪烁实验总结

上传人:lis****211 文档编号:132787282 上传时间:2022-08-09 格式:DOCX 页数:9 大小:61.80KB
返回 下载 相关 举报
LED灯闪烁实验总结_第1页
第1页 / 共9页
LED灯闪烁实验总结_第2页
第2页 / 共9页
LED灯闪烁实验总结_第3页
第3页 / 共9页
点击查看更多>>
资源描述
课程名称:Zigbee技术及应用实验项目:LED灯闪烁实验指导教师:专业班级:姓名:学号:成绩:1. 实验目的(1)学习单片机IO口配置与驱动,实现指示灯LED1闪烁,频率为1 Hz;(2)通过模块化编程,养成良好编程习惯。2. 实验设备(1)CC2530核心板一块;(2)传感器底板一个;(3)仿真器一个;(4)方口U SB线一根;3. 实验原理3.1 硬件设计原理本实验的原理如图1 -1所示。其中,LED1和LED3都串联一个R273和R275限流电阻,然后连接到CC2530的P1口的P1_1和P1_0管脚上。当P1_1为低电平时,LED1上有电流流过,LED1被点亮,反之LED1熄灭。严! pi LED3K-17 OR.47OR图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发光,需要设置CC2530对应的I/O口将LED电平拉低。本实验 我们只点亮LED1指示灯,所以只要设置LED1为低电平即可,所以只要我们知道LED1与CC2530哪个 管脚相连就可以进行编程。随着这个思路我们在原理图中找到LED1与CC2530芯片的P1_1管脚连接, 将P1_1管脚拉低LED1即被点亮。3.2 程序设计原理(1)主程序分析本实验的程序流程如图1-2所示,其重点IO 口的配置。如果以1 Hz的频率点亮LED1闪烁,则需要 配置P1_1为输出,然后在P1_1输出1Hz的脉冲信号。开始图 1-2 程序逻辑流程图2)IO 端口配置P1 口通过特殊功能寄存器 P1SEL(P1 口功能选择寄存器)和 P1DIR(P1 口方向寄存器)进行配 置,其定义如下。P1SEL (P1功能选择寄存器,POSEL同理):位号码名称复位R/W描述7:0SELP1_7:00x00R/WP1.7到P0.0功能选择0:通用I / O1:外设功能P1DIR (P1方向寄存器,PODIR同理):位号码名称复位R/W描述7:0SELP1_7:00x00R/WP1.7到P1.0的I/O方向0:输入1:输出特殊功能寄存器的配置方法:通过位操作实现对特殊功能寄存器的配置【例如,如果需要对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 +)以上c语言代码由IAR编译生成的汇编代码如图1-3所示。结合C语言的延时函数和从汇编指令我们可以看到寄存器R0/R1保存变量j的值,R2/R3保存参数 time的值,R4/R5保存变量啲值。根据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操作。DisassemblyXjio toLogjcaCode3EDisassemblyzorfl = 0 :i time2+1|_|*DeLa7 ns:00006B7C00MOVR4,#OkOOUJUUbD7DLUM3REOkOO03006F8019SJjiFx08A or (Z-C;:C00;jii);DDDD71ESMOVi.R000007224CliDDA.OkOI000074F8MO7?0. A000075E9M07U J u u 7 bLU他儿Aukuu000078F?MOVRl. AOT(Z-C;j500; jll);DDDD79C2CLRC000071E8M0700007BF45UBB00007DE9M07工mi0D0U7E94015UBBAOkOIODOOSO40EFJCDxD0?lf or (i = 0;i tims111)mnns?FC00008324ClADD40x01000085FCMO7A000086EDMO700008734ooADDCAOzOOODOOC?FDMOV5. Af OT(L = 0;i t i mei+)mnnfiA十00008BECMO700008C3UBB00008DED仙帚曲03008E9B5U3BODOO0F5006JNCDxD097OT(: =;j500;j-k+);0J009178COMO7RO.#OkOO0000937 9COM07R1,#OkOO00009580E2BJAPDkD07900003702OO 39LJMF?BRET_FFLedlitmin OJOOSa120 LCALLLedl_Init: :?工edapLED1RegisterdA=UkLUU=u1=02 00 - 04=05=06=07=0B=OkCOEK0=0BRI=0Utt 2=uER 3=0ER4=0Basic Registers一 ERE0L ER 70=1PRVnrn_ F0_ U0一 ov0一 KS00-ESI0一 BUu一 AC0EI25 0RlOhOI1220hF4R3nxriR4OkCOREOkCOREOkCOR7OkCO5EUK(JbSEP5FXDETB= OxOOSD7CBANK - OkCOPC= 0h0O6BCY= 0RO 0x00图1-3 延时函数汇编代码由以上分析可知,地址000091-000095, 000071-000080段是C语言代码for(j=0; j500;汁+)的汇编指令。每次循环,地址00091-000095段指令执行1次,地址000071-000080段指令执行500次。查询80C51汇编指令集得到一次for(j=0; j500;汁+)循环CC2530需要执行(6+13*500)个指令周期在上文中我们查询CC2530数据手册和用户手册得知CC2530处理大多数单字节指令只需要一个机器周期假设所有指令都在一个机器周期内执行完成。CC2530执行一次for(j=0; j500;汁+)循环最少需 要(6+13*500)个机器周期。单片机一个机器周期等于一个时钟周期,CC2530一个时钟周期为1/16M, 所以该次循环最少用时约400us。假设双字节指令需要的机器周期与标准8051相同。CC2530执行一次for(j=0; j500;汁+)循环最 多需要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. 实验部分参考代码mai n函数文件:* fnmain* brief The main function.* param None* return Nonevoid main(void)/* LED1初始化*/Led1_Init();while(l)/* 开 LED1 */LED1_ON();/*延时约500ms*/Delay_ms (500);/* 关 LED1 */ LED1_OFF();/*延时约500ms */Delay_ms (500);led头文件:#ifndef _LED_H#define _LED_H#include #define LED1 P1_1/*宏定义开ledi */#define LED1_ON() LEDI = 0/*宏定义关LEDI */#define LED1_OFF() LEDI = 1/*函数声明部分*/extern void Led1_Init(void);extern void Delay (unsigned int time);#endif / _LED_HLed灯控制文件:#include ioCC2530.h#include led.h* fn* brief* param* returnvoid Led1_Init(void)/*配置寄存器将P1_1配置成普通I/O 口 */P1SEL &= 0x02;/*配置寄存器将P1_1配置成输出模式*/P1DIR |=0x02;LED1 =1;Led1_InitLED1 initialization.NoneNoneDelay_msThis is a delay function.(in)time - Delay timeNone* fn* brief* param* returnvoid Delay_ms (unsigned int time) unsigned int i, j;for(i=0; itime;+)for(j=0; jV5OO;汁 +);6. 实验结果LED1指示灯闪烁一次,频率是1Hz。7. 附录:时钟周期知识扩展8051 CPU 简介增强型 8051 内核使用标准的 8051 指令集。因为以下原因指令执行比标准的 8051 更快每个指令周期是一个时钟,而标准的 8051 每个指令周期是 12 个时钟。消除了总线状态的浪费。因为一个指令周期与可能的内存存取是一致的,大多数单字节指令在一个时钟周期内执行。除了 速度提高之外,增强型 8051 内核还包括结构上的改善: 第二个数据指针 一个扩展的 18 源中断单元8051 内核的对象代码兼容业界标准的 8051 微控制器。 即对象代码使用 8051 内核上执行的业 界标准的 8051 编译器或汇编器编译,在功能上是等同的。但是,因为 8051 内核使用了不同于许多 其他 8051 类型的一个指令时序,带有时序循环的已有代码可能需要修改。而且,因为诸如定时器和 串行端口的外设单元不同于其他 8051内核,包含使用外设单元 SFR 的指令的代码不能正确运行。闪存预取默认不是使能的,但是提高了 CPU 高达 33%的性能。这一设置的代价是功率消耗略有 增加,但是因为这样更快,大多数情况下提高了能源消耗。闪存预取可以在 FCTL 寄存器中使能。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 机械制造 > 机械制造


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!