科协五分钟
简易定时器功能的实现
MSP430-G2553单片机
说明
该次推送主要说明如何利用MSP430_G2553单片机实现简易定时器功能。此次推送将以实现简易计时器为例说明MSP430单片机编程控制方法以及一点简易的硬件原理。(其中涉及的内容包括:CCS环境介绍,中断函数,串并转换,数码管显示)
MSP430-G2553MSP430_G2553是一款十六位,低功耗,具有精简指令集的单片机,这款单片机非常适合用于学习计算机硬件。一方面,编程控制这款单片机只需要简单的C语言指令,对于用户来说非常友好。另一方面,由于所有的寄存器都需要写代码来配置(对比图形化配置),所以在编程的过程中可以更深入地理解硬件系统。该推送中使用的MSP430单片机是学校“计算机硬件基础”课程中配套的MSP430_G2553实验板(在单片机的基础上增加了调试器,外部晶振以及数码管,蜂鸣器,按键等外设)。
CCSCode Composer Studio (CCS) 是一种集成开发环境(IDE),支持TI的微控制器和嵌入式处理器产品系列。它包含一整套用于开发和调试嵌入式应用的工具,其中包括用于优化的C/C++编译器、源码编译器、项目构建环境和调试器。直观的IDE提供了单个用户界面,可以清楚地显示开发流程的每个步骤。CCS对于实现此次说明的计时器起到的帮助主要包括:单步运行调试程序、实时查看各寄存器状态(并且可以不编程直接修改寄存器状态)、烧写程序。
编程思路将要实现的定时器的功能包括:每秒钟更新一次时间、按下按键1开始计时或者继续计时、按下按键2暂停计时并持续显示当时记录的时间、按下按键3将所计时间清零。当记录的时间超过四位数码管所能显示的最大数值时蜂鸣器响一次并重新开始计时。
要实现以上的功能,需要我们能够利用单片机数出1秒钟的时间,将时间显示在数码管上,响应按键以及启动蜂鸣器。
如何数出1秒单片机正常工作的时候需要有一个持续不断的时钟信号,该时钟信号即可以来自片内低频时钟也可以来自外部晶振。由于片内时钟源容易受到温度等环境因素的影响,所以实现计时器功能的时候需要使用外部32.768kHz晶振。有了一个相对稳定的时钟源,我们就可以通过数这个时钟信号的次数来获知时间段的长度了。在该次实验中,每数过32767个时钟信号,我们就可以认为过了1秒钟。考虑到利用CPU去数这个时钟信号比较占用资源,所以实际上是利用单片机上的定时器模块来实现这个功能的。
如何将时间显示在数码管上数码管上面的一位是由8个小LED构成的,其中7个用于构成数字,一个用于构成小数点。通过控制不同位置的LED的亮灭就可以实现数码管显示不同数字。利用这种方式,控制一个数码管需要8个引脚来输出高低电平,这次使用的四位数码管总共需要32个引脚。MSP430_G2553是没有这么多的引脚的,所以为了节省硬件资源,我们不能同时让数码管的四个位同时亮起,而是应该让他们分别亮起。由于人眼是由视觉暂留现象的,所以只要切换的速度足够快,我们的眼睛就会认为四个位是同时亮起的。
但是即使是这样,控制4位数码管也占用了8个引脚,这对于只有16个可用引脚的实验板来说还是一个不小的代价。那么有没有可能用更少的引脚来控制数码管呢?实际上也是可以的。只要将并行输出8位数据改成串行输出8位数据,就可以减少引脚的使用。这样只需要使用一个74HC595芯片就可以将单片机一个引脚输出的串行数据转换成并行数据发送给数码管。具体的实现方式是用单片机的一个引脚传输数据,一个引脚控制74HC595芯片接受数据(每接受到一个上升沿信号就接收一位数据并且将之前接收到的数据向下移一位),另一个引脚控制74HC595芯片发送数据(每接收到一个脉冲信号就将8位数据并行发送出去)。
如何响应按键并且控制蜂鸣器单片机的16个引脚均具有基本输入输出功能,响应按键实际上就是接收信号,而控制蜂鸣器实际上就是发送信号。配制好相应引脚的功能(功能选择,输入输出选择,上拉电阻使能,输出值)就可以实现上述功能。其中接收引脚开启了上拉电阻使能并且将输出值置为高电平后就可以在按键被按下时获得一个低电平信号,发送引脚输出低电平的时候蜂鸣器可以工作。
如何实时响应按键简单构思一下程序,我们可以发现,要判断哪个按键被按下,需要在main函数里面写一个循环来不断查询相应引脚是否接收到低电平信号。所以一点按下按键的那个瞬间如果程序并没有在执行那个查询,那么这个信号就可能不被响应。那么应该如何解决这个问题呢?解决的方法是将相应按键的程序放在中断程序中,并且将中断源设置为相应引脚的下降沿信号。这样,无论主程序执行到哪一步,只要硬件中检测到下降沿信号,中断程序就会被执行。这样也就实现了实时响应按键。
如何实现时间的进位在制作简易计时器时,我们使用的是四位数码管,其中前两位用于显示分钟,最大的是99分钟,后两位显示的是秒,最大的是59秒。在进位的时候涉及了10进制和60进制的进位。在实现这个进位的时候首先要明确我们是单独控制每个数码管的,而且对于分钟的个位,十位以及秒的个位对应的三个数码管,它们是按照0,1,2,3,4,5,6,7,8,9,0这样来循环的,而秒的十位是按照0,1,2,3,4,5,0这样来循环的。所以只需要判断当某一位达到最大的数字的时候(9或5),这一位恢复为最小的数字,同时它的后一位增加一。这样只需要4个if循环就可以实现进位。
写在最后理解了以上的编程思路,就可以相对容易得写出程序。如果上述说明有任何错误,还请大家批评指正。
排版|邢海潼
文字|邢海潼
审核|滕峻池
丁 荣