本帖最后由 毅如靳往 于 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 的建议 使代码更加美观~~~ 感激不尽啊 俺又进步了~~ |