找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11901|回复: 0
打印 上一主题 下一主题
收起左侧

CC2530的GPIO输出控制教程-Led闪烁、流水灯程序分析

[复制链接]
跳转到指定楼层
楼主
1.实验目的
2.GPIO输出控制实验-Led闪烁、流水灯

1) 通过实验掌握 CC2530 芯片 GPIO 的配置方法
2) 掌握 Led 驱动电路及开关 Led 的原理
3) 操作 IO 口控制 3 盏 LED 灯的全亮和全灭、闪烁、流水灯
2.实验设备
             硬件:PC 机              一台 EB2530(底板、核心板、仿真器、USB线)   一套
             软件:2000/XP/win7 系统,IAR 8.10 集成开发环境
3.实验相关电路图

由于发光二级管单向导电特性,即只有在正向电压(二极管的正极接正,负极接负)下才 能导通发光。P1.0 引脚接发光二极管(D1)的负极,所以 P1.0 引脚输出低电平 D1 亮,P1.0 引脚输出亮电平 D1 熄灭,P1.1 和 P1.4 原理相同。

4.实验相关寄存器 操作P1.0我们需要掌握相关寄存器的作用和配置方法。如下表所示(更详细的介绍请参考 “EB2530\相关资料与软件\cc2530-datasheet.pdf,英文不好的可参考CC2530中文数据手 册完全版.pdf,翻译有250页并非官方中文,有个别地方有错,请以英文为主哦”):


寄存器
作用
描述
P1 (0x90)
端口 1
端口 1。通用 I / O 端口。可以从 SFR 位寻址。


P1SEL(0xF4)


端口 1 功能选择
P1.7 到 P0.0 功能选择
0: 通用 I / O
1: 外设功能


P1DIR(0xFE)


端口 1 方向
P1.7 到 P1.0 的 I/O 方向
0: 输入
1: 输出

P1INP(0xF6)

端口 1 输入模式
P1.7 到 P1.2 的 I/O 输入模式。由于 P1.0 和 P1.1 没有
上拉/下拉功能, P1INP 暂时不需要配置

0: 上拉/下拉(见 P2INP (0xF7)–端口 2 输入模式)

1: 三态 按照表格寄存器的内容,对P1.0、P1.1、P1.4进行配置,当IO口输出低电平时Led被点亮。


所以配置如下:

P1SEL &=~0x13; //配置P1.0、P1.1、P1.4为通用IO口 P1DIR |= 0x13; //配置P1.0、P1.1、P1.4为输出
由于CC2530寄存器初始化时默认值为(详细说明请参考CC2530数据手册(中文).pdf): P1SEL = 0x00;P1DIR = 0x00; P1INP = 0x00;
所以 IO 口配置可简化为:P1DIR |= 0x13; //配置 P1.0、P1.1、P1.4 为输出
5.源码分析

6.实验步骤 连接硬件如下(后面的实验将省略硬件连接与编译了,别重复讲了,只讲不同的实验):


如果编译有错误,请参考最后一页图片说明。没有错误请继续
下载调试程序,再点运行,即可看到“3 盏 LED 灯的全亮



和全灭、闪烁、流水灯”,由于 P1.4 与仿真器共用,必须拔掉仿真器的插头才能看到 LED3

的变化。单击调试按键后程序已经下载到芯片中并保存,断电也不会掉失的,此时可以停 止调试并断开仿真器的排线,通过底板 USB 供电再看看效果吧。


cc2530源程序如下:
  1. /****************************************************************************
  2. * 文 件 名: main.c
  3. * 作    者: Andy
  4. * 修    订: 2017-11-2
  5. * 版    本: 1.0
  6. * 描    述: 操作IO口控制3盏LED灯的全亮和全灭、闪烁、流水灯
  7. ****************************************************************************/
  8. #include <ioCC2530.h>

  9. typedef unsigned char uchar;
  10. typedef unsigned int  uint;

  11. #define LED1 P1_0       //定义P1.0口为LED1控制端
  12. #define LED2 P1_1       //定义P1.1口为LED2控制端
  13. #define LED3 P1_4       //定义P1.4口为LED3控制端


  14. /****************************************************************************
  15. * 名    称: DelayMS()
  16. * 功    能: 以毫秒为单位延时,系统时钟不配置时默认为16M(用示波器测量相当精确)
  17. * 入口参数: msec 延时参数,值越大,延时越久
  18. * 出口参数: 无
  19. ****************************************************************************/
  20. void DelayMS(uint msec)
  21. {
  22.     uint i,j;
  23.    
  24.     for (i=0; i<msec; i++)
  25.         for (j=0; j<535; j++);
  26. }

  27. /****************************************************************************
  28. * 名    称: LedOnOrOff()
  29. * 功    能: 点亮或熄灭所有LED灯   
  30. * 入口参数: mode为0时LED灯亮  mode为1时LED灯灭
  31. * 出口参数: 无
  32. ****************************************************************************/
  33. void LedOnOrOff(uchar mode)
  34. {
  35.     LED1 = mode;
  36.     LED2 = mode;
  37.     LED3 = mode; //由于P1.4与仿真器共用,必须拔掉仿真器的插头才能看到LED3的变化
  38. }

  39. /****************************************************************************
  40. * 名    称: InitLed()
  41. * 功    能: 设置LED灯相应的IO口
  42. * 入口参数: 无
  43. * 出口参数: 无
  44. ****************************************************************************/
  45. void InitLed(void)
  46. {
  47.     P1DIR |= 0x13;      //P1.0、P1.1、P1.4定义为输出
  48.     LedOnOrOff(1);      //使所有LED灯默认为熄灭状态
  49. }

  50. /****************************************************************************
  51. * 程序入口函数
  52. ****************************************************************************/
  53. void main(void)
  54. {
  55.     uchar i;
  56.    
  57.     InitLed();               //设置LED灯相关IO口
  58.    
  59.     while(1)                 //死循环
  60.     {  
  61.         LED1 = !LED1;         //流水灯,初始化时LED为熄灭执行后则点亮
  62.         DelayMS(200);         
  63.         LED2 = !LED2;         
  64.         DelayMS(200);            
  65.         LED3 = !LED3;        
  66.         DelayMS(200);     
  67.         
  68.         for (i=0; i<2; i++)  //所有灯闪烁2次
  69.         {
  70.            LedOnOrOff(1);    //关闭所有LED灯
  71.            DelayMS(200);
  72.            LedOnOrOff(0);    //打开所有LED灯
  73.            DelayMS(200);
  74.         }
  75.         
  76.         LedOnOrOff(1);       //使所有LED灯熄灭状态
  77.         DelayMS(500);

  78. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码



所有资料51hei提供下载:
2.Led闪烁_流水灯.rar (330.03 KB, 下载次数: 11)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表