本帖最后由 毅如靳往 于 2011-8-17 21:12 编辑
在各种MCU中 定时器都占着很重要的一份额,很多情况下用定时器是不二的选择。
PS: 这里推荐下 从单片机初学者迈向单片机工程师 我打包在文件里了 大家可以看看 内容呢 回头再讨论 这里不表
- /*---------------------------------------------------------------------------------------------------------
- 定时器程序,led灯 1s一闪烁 并且伴随着蜂鸣器的响声
- ---------------------------------------------------------------------------------------------------*/
- //下面是标准函数 NUC的寄存器表述 啥的头文件 初学者飘过
- #include <stdio.h>
- #include "NUC1xx.h"
- #include "Driver\DrvGPIO.h"
- #include "Driver\DrvSYS.h"
- #include "Driver\DrvTIMER.h"
- //定时中断的函数 一共没几行 有C知识的都能看懂吧 其中GPA,3是LED灯 GPB10
- //是蜂鸣器 大家看看原理图就知道了
- void Timer0_Callback (void)
- {
- if(DrvGPIO_GetBit(E_GPA,3))
- {
- DrvGPIO_ClrBit(E_GPA,3);
- DrvGPIO_ClrBit(E_GPB,10);
- }
- else
- {
- DrvGPIO_SetBit(E_GPA,3);
- DrvGPIO_SetBit(E_GPB,10);
- }
- }
- //其实新唐的函数 很多从函数名称就能猜出来是干啥的 都不用查这个函数是干啥的
- //当然 平时我们自己写程序的时候也要主意标准化以及可读性 切记不要为了省事而
- //随便取个名字 以后再调试的时候会很惨的
- void Init_Timer0( void )
- {
- DrvTIMER_Init();
- /*定时器初始化函数*/
- DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC,0);
- /*TIMER0 时钟源选择:000 =外部12MHz 晶振 、001 =外部 32KHz 晶振 、010 = HCLK 、011 = 外部触发时钟 、1xx =内部 22MHz 振荡器 */
- DrvTIMER_Open(E_TMR0,1,E_PERIODIC_MODE);
- /*设定定时器 tick 周期并且启动定时器:定时器通道 TMR0 每秒1次 周期模式*/
- DrvTIMER_SetTimerEvent(E_TMR0,1,(TIMER_CALLBACK) Timer0_Callback,0);
- /* 隔1个tick执行事件,parameter3-事件处理函数指针,4-传递参数*/
- DrvTIMER_EnableInt(E_TMR0); //使能定时器中断
- DrvTIMER_Start(E_TMR0); //启动定时器
- }
- /******************************************************************************
- ** Function name: delay_loop
- ** Descriptions: 延时子程序
- ** input parameters: 无
- ** output parameters: 无
- ** Returned value: 无
- ******************************************************************************/
- void delay_loop(void)
- {
- uint32_t i,j;
- for(i=800;i>0;i--)
- for(j=500;j>0;j--);
- }
- /******************************************************************************
- ** Function name: main
- ** Descriptions: LED2跟随LED1的亮灭而灭亮测试程序
- ** 现 象:下载代码,运行程序,则LED1亮LED2灭 LED1灭LED2亮循环反复
- ** input parameters: 无
- ** output parameters: 无
- ** Returned value: 无
- ******************************************************************************/
- int main (void)
- {
- /* SYSCLK =>12Mhz*/
- UNLOCKREG();
- SYSCLK->WRCON.XTL12M_EN = 1;
- LOCKREG();
- Init_Timer0();
- DrvGPIO_Open( E_GPA, 2, E_IO_OUTPUT );
- /*和众多MCU一样 这个就是定义IO口的函数*/
- DrvGPIO_ClrBit( E_GPA, 2 );
- /*从函数名称中可以看出来 就是对IO的 CLREAN 清零
- 当然还有一个DrvGPIO_SetBit( E_GPA,2 )就是置位函数啦(set)*/
- DrvGPIO_Open( E_GPA, 3, E_IO_OUTPUT );
- DrvGPIO_Open( E_GPB, 10, E_IO_OUTPUT );
- DrvGPIO_ClrBit( E_GPB, 10 );
- /* 别说俺啰嗦,看这种帖子的都不是老鸟 菜鸟们需要各处注释
- GPA,2 GPA,3 这两个IO口是 控制LED灯的
- GAB,10 这个IO是控制蜂鸣器的
- 个人有个习惯 就是 在定义IO的时候把不同功能的IO 之间留有空行 以后好检查
- 当然个人有个人的编程习惯 俺就是说说俺的而已*/
- while(1);
- }
由于这是个 声光电 的实验 就不上图了昂
我们共同进步 毅如靳往 ceanking7@163.com
这里谢谢 网友 Swallow_0322 的建议 使代码更加美观~~~ 感激不尽啊 俺又进步了~~
|