CC2530小作业(2)定时器应用

题目描述

采用定时器1的正计数/倒计数模式控制LED1灯以2秒为间隔闪烁。

代码



/*********************************************************************************************
* 头文件
*********************************************************************************************/
#include <ioCC2530.h>
#include "delay.h"
#include "led.h"
#include "timer.h"

/*********************************************************************************************
* 定义
*********************************************************************************************/
u32 counter = 0;                                                //统计溢出次数

/*********************************************************************************************
* 名称:main()
* 功能:LED驱动实验逻辑代码
* 参数:无
* 返回:无
* 修改:
* 注释:
*********************************************************************************************/
void main(void)
{
  xtal_init();                                                  //CC2530时钟初始化
  led_init();                                                   //LED灯管脚初始化
  time1_init();                                                 //定时器1初始化
  
  while(1)}

/*********************************************************************************************
* 名称:
* 功能:中断服务子程序
* 参数:无
* 返回:无
* 修改:
* 注释:
*********************************************************************************************/
#pragma vector = T1_VECTOR      
__interrupt void T1_ISR(void)            
{       
  EA=0;                                                         //关总中断
  counter++;                                                    //统计进入中断的次数
  if(counter>100)                                               //初始化中定义10ms进一次中断,经过100次中断,10ms × 100 = 1S
  {
    counter=0;                                                  //统计的次数复位
    D1 = !D1;                                                   //改变D1的状态
  }
 // T1IF=0;                                                       //中断标志位清零
  EA=1;                                                         //开总中断
}
/*********************************************************************************************
* 文件:timer.h
* 作者:Meixin 2017.09.15
* 说明:定时器驱动代码头文件  
* 修改:
* 注释:
*********************************************************************************************/

/*********************************************************************************************
* 宏条件编译
*********************************************************************************************/
#ifndef __TIMER_H__
#define __TIMER_H__

/*********************************************************************************************
* 头文件
*********************************************************************************************/
#include <ioCC2530.h>

/*********************************************************************************************
* 内部原型函数
*********************************************************************************************/
void xtal_init(void);                                           //CC2530时钟初始化
void time1_init(void);                                          //定时器1初始化

#endif /*__TIMER_H_*/



/*********************************************************************************************
* 头文件
*********************************************************************************************/
#include "timer.h"

/*********************************************************************************************
* 名称:xtal_init()
* 功能:CC2530时钟初始化
* 参数:无
* 返回:无
* 修改:
* 注释:
*********************************************************************************************/
void xtal_init(void)
{
  CLKCONCMD &= ~0x40;                                           //选择32MHz的外部晶振
  while(CLKCONSTA & 0x40);                                      //晶体振荡器开启且稳定
  CLKCONCMD &= ~0x07;                                           //选择32MH系统时钟
  CLKCONCMD &= ~0x38;                                           //选择32MH定时器时钟
}

/*********************************************************************************************
* 名称:time1_init()
* 功能:定时器1初始化
* 参数:无
* 返回:无
* 修改:
* 注释:
*********************************************************************************************/
void time1_init(void)
{
  T1CTL |= 0x07;                                                //8分频,正计数倒计数模式
  T1CC0L = 0x40;                                                //定时器1通道 0捕获/比较值低位 
  T1CC0H = 0x9C;                                                //定时器1通道 0捕获/比较值高位   定义10ms进一次中断
  T1CCTL0|=0x44;
 // TIMIF|=0x40;
  T1IE = 1;                                                     //设定定时器1中断使能
  EA = 1;                                                       //设定总中断使能 
}


/*********************************************************************************************
* 宏条件编译
*********************************************************************************************/
#ifndef __LED_H__
#define __LED_H__

/*********************************************************************************************
* 头文件
*********************************************************************************************/
#include <ioCC2530.h>                                           //引入CC2530所对应的头文件(包含各SFR的定义)

/*********************************************************************************************
* 宏定义
*********************************************************************************************/
#define D1                      P1_1                            //宏定义D1灯控制引脚P1_1
#define D2                      P1_0                            //宏定义D2灯控制引脚P1_0

#define ON                      0                               //宏定义灯开状态控制为NO
#define OFF                     1                               //宏定义关闭状态控制为OFF

/*********************************************************************************************
* 函数声明
*********************************************************************************************/
void led_init(void);                                            //LED控制引脚初始化函数


#endif /*__LED_H_*/




/*********************************************************************************************
* 头文件
*********************************************************************************************/
#include "led.h"

/*********************************************************************************************
* 名称:led_init()
* 功能:LED控制引脚初始化
* 参数:无
* 返回:无
* 修改:
* 注释:
*********************************************************************************************/
void led_init(void)
{
  P1SEL &= ~0x03;                                               //配置控制管脚(p1.0, p1.1)为通用IO模式
  P1DIR |= 0x03;                                                //配置控制管脚(p1.0, p1.1)为输出模式
  
  D1 = OFF;                                                     //初始状态为关闭
  D2 = OFF;                                                     //初始状态为关闭
}
  



/*********************************************************************************************
* 头文件
*********************************************************************************************/
#include <ioCC2530.h>                                           //引入CC2530所对应的头文件(包含各SFR的定义)

/*********************************************************************************************
* 宏条件编译
*********************************************************************************************/
#ifndef __DELAY_H__
#define __DELAY_H__

/*********************************************************************************************
* 申明定义无符号数据类型
*********************************************************************************************/
typedef unsigned char           u8;                             //将unsigned char 声明定义为 u8        
typedef unsigned short          u16;                            //将unsigned short 声明定义为 u16 
typedef unsigned long           u32;                            //将unsigned int 声明定义为 u32

/*********************************************************************************************
* 宏定义
*********************************************************************************************/
#define CLKSPD                  (CLKCONCMD & 0x07)              //宏定义系统时钟分频系数

/*********************************************************************************************
* 内部原型函数
*********************************************************************************************/
void delay_s(u16 times);                                        //硬件延时函数秒
void delay_ms(u16 times);                                       //硬件延时函数毫秒
void delay_us(u16 times);                                       //硬件延时函数微秒
void hal_wait(u8 wait);                                         //硬件毫秒延时函数

#endif /*__DELAY_H_*/
/*********************************************************************************************
* 文件:delay.c
* 作者:Meixin 2017.09.27
* 说明:延时驱动代码
* 修改:liutong  20171027 修改了秒延时函数的名称,优化了注释
* 注释:
*********************************************************************************************/

/*********************************************************************************************
* 头文件
*********************************************************************************************/
#include "delay.h"

/*********************************************************************************************
* 名称:hal_wait(u8 wait)
* 功能:硬件毫秒延时函数
* 参数:wait——延时时间(wait < 255)
* 返回:无
* 修改:
* 注释:CC2530系统固件库系统的精确毫秒延时函数,由TI官方提供
*********************************************************************************************/
void hal_wait(u8 wait)
{
  unsigned long largeWait;                                      //定义硬件计数临时参数
  
  if(wait == 0) return;                                         //如果延时参数为0,则跳出                        
  largeWait = ((u16) (wait << 7));                              //将数据扩大64倍
  largeWait += 114*wait;                                        //将延时数据扩大114倍并求和      
  
  largeWait = (largeWait >> CLKSPD);                            //根据系统时钟频率对延时进行放缩
  while(largeWait --);                                          //等待延时自减完成
}

/*********************************************************************************************
* 名称:delay_s()
* 功能:在延时毫秒的基础上延时秒
* 参数:times——延时时间
* 返回:无
* 修改:
* 注释:延时为990,用于抵消while函数的指令周期
*********************************************************************************************/
void delay_s(u16 times)
{
  while(times --){
    delay_ms(990);                                              //延时1S
  }
}

/*********************************************************************************************
* 名称:delay_ms()
* 功能:再硬件延时上延时大于255的毫秒延时
* 参数:times——延时时间
* 返回:无
* 修改:
* 注释:
*********************************************************************************************/
void delay_ms(u16 times)
{
  u16 i,j;                                                      //定于临时参数
  i = times / 250;                                              //获取要延时时长的250ms倍数部分
  j = times % 250;                                              //获取要延时时长的250ms余数部分
  while(i --) hal_wait(250);                                    //延时250毫秒
  hal_wait(j);                                                  //延时剩余部分        
}

/*********************************************************************************************
* 名称:delay_us()
* 功能:估算的微秒延时函数
* 参数:times——延时时间
* 返回:无
* 修改:
* 注释:
*********************************************************************************************/
void delay_us(u16 times)
{
  while (times--){
    asm("NOP");                                                 //汇编指令,空操作
    asm("NOP");                                                 //汇编指令,空操作
    asm("NOP");                                                 //汇编指令,空操作
  }
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值