使用定时器实现小灯闪烁 (单片机 LM3S811)

转载请注明出处:http://blog.csdn.net/icyfox_bupt/archive/2011/06/01/6460074.aspx

 

本来想把驱动库,原理图,内部原理都上传到百度文库的 ,结果被和谐了不让上传,需要的朋友留下邮箱,我会打包给你发过去的。这些文档确实很好用,对于函数的参数,内部的连线结构介绍的很清楚,真是编程必备呀!

 

上次我们讲了如何使用延时来做小灯闪烁的程序,相信大家都有所了解了,这次我们来看如何使用定时器实现小灯闪烁。

 

1、不使用中断的方法

 

     首先我们还是来看头文件,因为这次使用了定时器(timer),所以头文件要包含timer.h。

     选择闪烁的小灯,在此我们选择PC5小灯,将其使能,作为output。

     下一步是使能定时器的过程。有如下步骤:

          1、在系统中使能定时器。   函数:SysCtlPeripheralEnable()

          2、选择定时器的使用类型,函数:TimerConfigure(),  参数可以写 TIMER_CFG_32_BIT_PER (32位周期)/                                         TIMER_CFG_16_BIT_PAIR|TIMER_CFG_A_PERIODIC  (16位TIMER0A周期)  TIMER_CFG_A_CAP_COUNT(计数模式)等..

              (注:LM3S811一共有4个计数器TIMER0/1/2/3 ,默认使用减计数模式, 每个timer可以作为一个32位计数器使用,也可以作为两个16位计数器使用。具体使用方法请看技术文档)

          3、给定时器装载值:使用TimerLoadSet() 函数。

          4、使能定时器。

 

      剩下的思路很简单,让程序进入一个死循环。使用轮询检测定时器是否溢出,如果溢出则改变小灯的亮灭。因为系统的频率是一定的(在本程序中是6MHZ),所以通过改变定时器中装载的数值就可以控制小灯亮灭的时间。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
以下是基于Arduino平台实现的代码,具体实现方法可能因芯片型号、编程语言等不同而有所差异,仅供参考。 ``` // 引脚定义 const int LED_PIN[] = {2, 3, 4, 5, 6, 7, 8, 9}; // 定时器计数器 volatile int timer_counter = 0; // 定时器中断处理函数 void timer_isr() { timer_counter++; } // 初始化定时器 void init_timer() { cli(); // 关闭中断 // 设置定时器1为CTC模式,频率为1kHz TCCR1A = 0; TCCR1B = (1 << WGM12) | (1 << CS11) | (1 << CS10); OCR1A = 999; TIMSK1 = (1 << OCIE1A); sei(); // 开启中断 } // 点亮从右边第一个开始的单个LED灯 void light_from_right() { for (int i = 0; i < 8; i++) { digitalWrite(LED_PIN[i], LOW); } int index = (timer_counter / 100) % 8; digitalWrite(LED_PIN[index], HIGH); } // 闪烁8个LED灯4次 void blink_all() { for (int i = 0; i < 4; i++) { for (int j = 0; j < 8; j++) { digitalWrite(LED_PIN[j], HIGH); } delay(500); for (int j = 0; j < 8; j++) { digitalWrite(LED_PIN[j], LOW); } delay(500); } } // 点亮从左边第一个开始的单个LED灯 void light_from_left() { for (int i = 0; i < 8; i++) { digitalWrite(LED_PIN[i], LOW); } int index = 7 - (timer_counter / 100) % 8; digitalWrite(LED_PIN[index], HIGH); } void setup() { // 初始化引脚为输出模式,初始状态为LOW for (int i = 0; i < 8; i++) { pinMode(LED_PIN[i], OUTPUT); digitalWrite(LED_PIN[i], LOW); } init_timer(); // 初始化定时器 } void loop() { light_from_right(); // 单个灯从右边第一个开始依次向左轮流点亮 delay(10); blink_all(); // 8个LED灯闪烁四次 light_from_left(); // 单个灯从左边第一个开始依次向右轮流点亮 delay(10); } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值