题目描述
采用定时器1的正计数/倒计数模式控制LED1灯以2秒为间隔闪烁。
代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55/********************************************************************************************* * 头文件 *********************************************************************************************/ #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; //开总中断 }
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29/********************************************************************************************* * 文件: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_*/
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41/********************************************************************************************* * 头文件 *********************************************************************************************/ #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; //设定总中断使能 }
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32/********************************************************************************************* * 宏条件编译 *********************************************************************************************/ #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_*/
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26/********************************************************************************************* * 头文件 *********************************************************************************************/ #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; //初始状态为关闭 }
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35/********************************************************************************************* * 头文件 *********************************************************************************************/ #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_*/
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82/********************************************************************************************* * 文件: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"); //汇编指令,空操作 } }
最后
以上就是失眠萝莉最近收集整理的关于CC2530小作业(2)定时器应用的全部内容,更多相关CC2530小作业(2)定时器应用内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复