采用定时器1的正计数/倒计数模式控制LED1灯以2秒为间隔闪烁。
/*********************************************************************************************
* 头文件
*********************************************************************************************/
#include
#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
/*********************************************************************************************
* 内部原型函数
*********************************************************************************************/
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 //引入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 //引入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"); //汇编指令,空操作
}
}