您的当前位置:首页正文

基于msp430单片机的时钟设计

来源:个人技术集锦


毕业设计说明书

基于MSP430单片机的时钟设计

专业

电气工程及其自动化

学生姓名 班学

级 号

指导教师 完成日期

本科生毕业设计说明书(2011)

基于MSP430单片机的时钟设计 摘 要:MSP430 系列是一个16位的、具有精简指令集的、超低功耗的混合型单片

机。说明书介绍了以MSP430F149单片机为核心的时钟系统的设计。在硬件电路方面,采用SPX1117低压差稳压器为单片机提供电源,它将5V电压转化为3.3V提供给单片机;用4*4矩阵键盘进行输入;在时间的显示上采用了两种方法显示,即LED数码显示和LCD液晶显示;除此以外,在电路板上还留有供扩展电路应用的引脚接口。在软件设计方面,完成了键盘扫描程序、显示模块程序以及系统主程序的设计。

由于采用MSP430为核心,它的超低功耗的特点使得整个系统的功耗非常的低,一个普通的钮扣电池可使用长达10年之久。另外,由于片内具有丰富的外围电路,加之电路板上留有供扩展电路应用的引脚接口,还可以对其增加一些功能,比如整点报时、温度显示等。

关键词:MSP430;时钟设计;矩阵键盘;LCD

本科生毕业设计说明书(2011)

The Design of Clock Based on MCU430

Abstract: The series of MSP430 is a 16 bit, with RISC, ultra-low power mixed MCU.

The Brochure introduces the design of clock system with the core of MSP430F149 MCU. In hardware electric circuit aspect, I adopt SPX11117 low press Manos tat to provide electrical source for MCU. It translates 5V press into 3.3V then provides it to MCU. And it use 4*4 matrix keyboard to input. And in the display of time aspect, I use two ways of showing: LED and LCD. Otherwise, I remain some cite way for extending the use of electro-circuit. In the design of software, I finish the scan process of keyboard, the programmer of display module, and the design of the main process of the system.

Chosen MSP430 which is overtake low consume as it is core, so the cost of the whole system is very low, a button batteries can be used for ten years. In addition, because a lot of circuits are in it, and because there are some cite ways remained for extending the use of electro-circuit, we can still add some functions to it, such as give the correct time when it is the full time, the display of temperature and so on. Key words: MSP430;Clock design;Matrix keyboard;LCD

基于MSP430单片机的时钟设计

目 录

1 概 述 ......................................................... 1 2 课题研究背景与意义 .............................................. 3 2.1 课题研究背景 .................................................. 3 2.2 课题研究意义 .................................................. 3 3 MSP430F149介绍 .................................................. 4 3.1 MSP430F149芯片特点 ........................................... 4 3.2 MSP430F149芯片引脚 ........................................... 5 3.3 MSP430F149芯片处理单元 ....................................... 8 3.4 MSP430F149芯片运行模式 ....................................... 8 3.5 MSP430F149芯片I/O端口 ....................................... 9 3.6 MSP430F149芯片时钟系统 ...................................... 10 3.7 MSP430F149芯片存储器结构和地址空间 .......................... 10 4 系统硬件电路设计 ............................................... 12 4.1 系统方案论证与选择 ........................................... 12 4.2系统总体设计 ................................................. 13 4.3 电源稳压电路 ................................................. 14 4.4 LED数码显示电路 ............................................. 14 4.4.1 LED数码管的结构与工作原理 ................................. 14 4.4.2 LED显示器的显示方式及驱动方式 ............................. 15 4.5 LCD液晶显示接口电路 ......................................... 16 4.6 键盘输入电路 ................................................. 19 4.7 JATG接口基本原理 ............................................ 20 4.7.1 边界扫描技术 ............................................... 20 4.7.2 TAP控制器 ................................................. 21 5 MSP430集成开发调试环境 ........................................ 22 5.1 关于IAR Embedded Workbench .................................. 22 5.2 IAR Embedded Workbench的基本操作 ............................ 23 5.3 IAR C430编译器 .............................................. 24 6 系统软件设计 ................................................... 28 6.1 LED数码管显示器模块 ......................................... 30 6.2 LCD液晶显示器模块 ........................................... 31 6.3 矩阵键盘模块驱动 ............................................. 32 7 结 束 语 ....................................................... 35 参考文献 ......................................................... 36 致 谢 .......................................................... 37 附 录 .......................................................... 38 附录1 程序清单 .................................................. 38 附录2 系统原理图 ................................................ 50 附录3 系统PCB图 ................................................ 51 附录4 元器件清单 ................................................ 52

本科生毕业设计说明书(2011)

基于MSP430单片机的时钟设计 1 概 述

时钟,自从它发明的那天起,就成为人类的朋友,但随着时间的推移,科学技术的不断发展,人们对时间计量的精度要求越来越高,应用越来越广。现今,高精度的计时工具大多数都使用了石英晶体振荡器。由于电子钟、石英表、石英钟都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调校。数字式电子钟用集成电路计时,译码代替机械式传动,用LED显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时、分、秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。

时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。在一个单片机应用系统中,时钟有两方面的含义:一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间,它通常有两种实现方法:一是用软件实现,即用单片机内部的可编程定时/计数器来实现,但误差很大,主要用在对时间精度要求不高的场合;二是用专门的时钟芯片实现,在对时间精度要求很高的情况下,通常采用这种方法,典型的时钟芯片有:DS1302,DS12887,X1203等都可以满足高精度的要求。

目前单片机应用于各个领域,其应用于仪器仪表中显得更为优越。基于单片机控制的电子时钟具有计时准确、功耗低等优点。

美国德州仪器公司(TI)推出的MSP430系列超低功耗16位混合信号处理器(Mixed Signal Processor)。集多种领先技术于一体,以16位RISC处理器、超低功耗、高性能模拟技术及丰富的片内外设、JTAG仿真调试定义了新一代单片机的概念,给人以耳目一新的感觉。加之TI优良的服务,充分体现了世界级著名IC厂商的势力和综合优势。

TI公司从1996年推出MSP430系列开始到2000年初,推出了33X、32X、31X等几个系列。MSP430的33X、32X、31X等系列具有LCD驱动模块,对提高系统的集成度较有利。每一系列有ROM型(C)、OTP型(P)和EPROM型(E)等芯片。EPROM型的价格昂贵,运行环境温度范围窄,主要用于样机开发。这也表明了这几个系列的开发模式,即用户可以用EPROM型开发样机,用OTP型进行小批量生产,而ROM型适应大批量产品的生产。

随着FLASH技术的迅速发展,TI公司也将这一技术引入MSP430系列单片机中。2000年推出了F11X/11X1系列,这个系列采用20脚封装,内存容量、片上功能和I/O引脚数比较少,价格也比较低廉。在2000年7月推出了带ADC或硬件乘法器的F13X/F14X系列。在2001年7月到2002年又相继推出了带LCD控制器的F41X、F43X、F44X。

- 1 -

基于MSP430单片机的时钟设计

TI在2003到2004年期间推出了F15X和F16X系列产品。在这一新的系列中,有了两个方面的发展:一是增加了RAM的容量,如F1611的RAM容量增加到了10KB,这样就可以引入实时操作系统(RTOS)或简单文件系统等;二是从外围模块来说,增加了DMA、DAC12和SVS等模块。

另外,TI在2004年下半年推出了MSP430X21X系列,该系列是对MSP430X1XX片内外设的进一步精简,价格低廉,适合做一些简单的应用。

MSP430系列单片机不仅可以应用于许多传统的单片机应用领域,如仪器仪表、自动控制以及消费品领域,更适合用于一些电池供电的低功耗产品,如能量表、手持式设备、智能传感器等,以及需要较高运算性能的智能仪器设备。

此次设计就是用MSP430F149单片机设计数字时钟,在硬件电路方面,采用SPX1117低压差稳压器为单片机提供电源,它将5V电压转化为3.3V提供给单片机;用4*4矩阵键盘进行输入;在时间的显示上介绍了两种方法显示,即LED数码显示和LCD液晶显示;除此以外,在电路板上还留有供扩展电路应用的引脚接口。在软件设计方面,完成了键盘扫描程序、显示模块程序以及系统主程序的设计。通过此次设计,可以了解MSP430F149的内部结构,理解其工作原理,同时可以掌握一般电子系统的调试方法。

- 2 -

本科生毕业设计说明书(2011)

2 课题研究背景与意义

单片机的应用在后PC时代得到了前所未有的发展,但对处理器的综合性能要求也越来越高。综观单片机的发展,以应用需求为目标,市场越来越细化,充分突出以“单片”解决问题,而不像多年前以MCS51/96等处理器为中心,外扩各种接口构成各种应用系统。单片机系统作为嵌入式系统的一部分,主要集中在中、低端应用领域(嵌入式高端应用主要由DSP、ARM、MIPS等高性能处理器构成),在这些应用中,目前也出现了一些新的需求,主要体现在以下几个方面:

a.以电池供电的应用越来越多,而且由于产品体积的限制,很多是用纽扣电池供电,要求系统功耗尽可能低,如手持式仪表、玩具等。

b.随着应用的复杂,对处理器的功能和性能要求不断提高。既要外设丰富、功能灵活,又要有一定的运算能力,能做一些实时算法,而不仅仅做一些简单的控制。

c.产品更新速度快,开发时间短,希望开发工具简单、廉价、功能完善。特别是仿真工具要有延续性,能适应多种MCU,以免重复,增加开发费用。

d.产品性能稳定,可靠性高,既能加密保护,又能方便升级。 2.1 课题研究背景

目前单片机应用于各个领域,其应用于仪器仪表中显得更为优越。以单片机制成的电子时钟具有计时准确、功耗低的优点,从而得到了许多领域的广泛应用。单片机正处在微控制器的全面发展阶段,各公司的产品在尽量兼容的同时,向高速、强运算能力、寻址范围大以及小型廉价方面发展。单片机的发展推动了应用系统的发展,应用系统的发展又反过来对单片机提出了更高要求,从而促进单片机的发展。单片机正向着功能更强、速度更快、功耗更低、辐射更小的方向发展。随着集成度的不断提高,把众多的外围功能器件集成在片内已经具备了充分的条件,这也是单片机以后发展的重要趋势。除了一般必须具有的ROM、RAM、定时器/计数器、中断系统外,随着单片机档次的提高,以适应检测、控制功能更高的要求,片内集成的器件通常还有电源监控与复位电路、WDT、A/D转换器、DMA控制器、中断控制器、锁相器、频率合成器、字符发生器、声音发生器、CRT控制器、译码驱动器等。 2.2 课题研究意义

数字钟是采用数字电路实现对时、分、秒进行数字显示的计时装置,广泛用于个人家庭、车站、码头、办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能,诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备,甚至各种定时电器的自动启用等,所有这些都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。

通过对此次的时钟电路的设计,一方面可以巩固已经学习过的专业知识,比如

- 3 -

基于MSP430单片机的时钟设计

Protel99 SE的使用等;另一方面可以了解并掌握一些新的知识,比如此次所用的核心芯片MSP430单片机以及LCD液晶显示器等。通过这次毕业设计,可以将我的综合能力提升很多,学习很多东西,为以后的学习生活打下坚实的基础。

3 MSP430F149介绍

MSP430系列是一个16位的、具有精简指令集的、超低功耗的混合型单片机,具有强大的综合优势。

在运算能力方面,MSP430系列单片机是一个16位的单片机,采用了精简指令集(RISC)结构,具有丰富的寻址方式(7种源操作数寻址、4种目的操作数寻址)、简洁的27条内核指令以及大量的模拟指令;大量的寄存器以及片内数据存储器都可参加多种运算;还有高效的查表处理指令;有较高的处理速度,在 8MHz 晶体驱动下指令周期为125ns 。这些特点保证了可编制出高效率的源程序。

在运算速度方面,MSP430系列单片机能在 8MHz 晶体的驱动下,实现125ns 的指令周期。16位的数据宽度、125ns 的指令周期以及多功能的硬件乘法器(能实现乘加)相配合,能实现数字信号处理的某些算法(如FFT等)。

MSP430系列单片机的中断源较多,并且可以任意嵌套,使用时灵活方便。当系统处于省电的备用状态时,用中断请求将它唤醒只用6µs。

超低功耗MSP430单片机之所以有超低的功耗,是因为其在降低芯片的电源电压及灵活而可控的运行时钟方面都有其独到之处。由于系统运行时打开的功能模块不同,即采用不同的工作模式,芯片的功耗有着显著的不同。在系统中共计有一种活动模式(AM)和五种低功耗模式(LPM0~LPM4)。在等待方式下,耗电为 0.7µA ,在节电方式下,最低可达 0.1µA 。

另外,MSP430系列单片机的各成员都集成了较丰富的片内外设。MSP430系列单片机的这些片内外设为系统的单片解决方案提供了极大的方便。

MSP430F149是MSP430X14X系列的一种,、两个16位定时器、一个14路的12位的模数转换器、一个看门狗、6路P口、两路USART通信端口、一个比较器、一个DCO内部振荡器和两个外部时钟,支持8M的时钟。 3.1 MSP430F149芯片特点

a.低电源电压范围:1.8~3.6V。 b.超低功耗:

2.5µA @ 4KHz,2.2V; 280µA @ 1MHz,2.2V。 c.5种节电方式:

等待方式 1.6µA;

RAM保持的节电方式 0.1µA。 d.从等待方式唤醒时间小于6µA。 e.16位RISC结构,125ns指令周期。 f.基本时钟模块配置:

- 4 -

本科生毕业设计说明书(2011)

高速晶体(最高8MHz);低速晶体(32768Hz);DCO。 g.配合外部器件可构成单斜边A/D转换器。 h.12位200Ksps的A/D转换器,自带采样保持。 i.内部温度传感器。

j.具有3个捕获/比较寄存器的16位定时器Timer_A,Timer_B。 k.两通道串行通信接口可用于异步或同步(UART/SPI)模式。 l.6个8位并行端口,且2个8位端口有中断能力。 m.硬件乘法器。

n.多达60KB FLASH ROM和2KB RAM。 o.串行在线系统编程。 p.保密熔丝的程序代码保护。 3.2 MSP430F149芯片引脚

MSP430F149芯片共有64个引脚,其中有48个为I/O引脚,具体说明如表3-1所示。

表3-1 MSP430F149芯片引脚说明表

引 脚 名 称 P1.0/TACLK P1.1/TA0 P1.2/TA1 P1.3/TA2 P1.4/SMCLK P1.5/TAO P1.6/TA1 P1.7/TA2 P2.0/ACLK P2.1/TAINCLK P2.2/CAOUT/TA0 P2.3/CA0/TA1 P2.4/CA1/TA2 P2.5/Rosc 序 号 12 13 14 15 16 17 18 19 20 21 22 23 24 25 I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O 通用数字I/O引脚/Timer_A,TACLK时钟信号输入 通用数字I/O引脚/Timer_A,捕获:CCI0A输入, 比较:OUT0输出 通用数字I/O引脚/Timer_A,捕获:CCI1A输入, 比较:OUT1输出 通用数字I/O引脚/Timer_A,捕获:CCI2A输入, 比较:OUT2输出 通用数字I/O引脚/SMCLK信号输出 通用数字I/O引脚/Timer_A,比较:OUT0输出 通用数字I/O引脚/Timer_A,比较:OUT1输出 通用数字I/O引脚/Timer_A,比较:OUT2输出 通用数字I/O引脚/ACLK输出端 通用数字I/O引脚/Timer_A,INCLK时钟信号 通用数字I/O引脚/Timer_A,捕获:CCI0B输入, 比较:OUT0输出 通用数字I/O引脚/Timer_A,捕获:CCI0B输入, 比较:OUT0输出 通用数字I/O引脚/Timer_A,比较:OUT2输出 通用数字I/O引脚/外接一电阻用以确定DCO的工作频率 - 5 -

说 明 基于MSP430单片机的时钟设计

续表3-1:

引 脚 名 称 P2.6/ADC12CLK P2.7/TA0 P3.0/STE0 P3.1/SIMO0 P3.2/SOMI0 P3.3/UCLK0 P3.4/UTXD0 P3.5/URXD0 P3.6/UTXD1 P3.7/URXD1 P4.0/TB0 P4.1/TB1 P4.2/TB2 P4.3/TB3 P4.4/TB4 P4.5/TB5 P4.6/TB6 P4.7/TBCLK P5.0/STE1

- 6 -

序 号 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O 说 明 通用数字I/O引脚/12位A/D转换器的转换时钟 通用数字I/O引脚/Timer_A,比较:OUT0输出 通用数字I/O引脚/从属传输使能:USART0/SPI模式 通用数字I/O引脚/ USART0/SPI模式的从输入或主输出 通用数字I/O引脚/ USART0/SPI模式的从输出或主输入 通用数字I/O引脚/外部时钟输入—USART0/UART或SPI模式,时钟输出——USART0/SPI模式 通用数字I/O引脚/发送数据输出——USART0/UART模式 通用数字I/O引脚/接收数据输入——USART0/UART模式 通用数字I/O引脚/发送数据输出——USART1/UART模式 通用数字I/O引脚/接收数据输入——USART1/UART模式 通用数字I/O引脚/捕获I/P或PWM输出口——定时器B_7CCR0 通用数字I/O引脚/捕获I/P或PWM输出口——定时器B_7CCR1 通用数字I/O引脚/捕获I/P或PWM输出口——定时器B_7CCR2 通用数字I/O引脚/捕获I/P或PWM输出口——定时器B_7CCR3 通用数字I/O引脚/捕获I/P或PWM输出口——定时器B_7CCR4 通用数字I/O引脚/捕获I/P或PWM输出口——定时器B_7CCR5 通用数字I/O引脚/捕获I/P或PWM输出口——定时器B_7CCR6 通用数字I/O引脚/定时器B_3的输入时钟TBCLK 通用数字I/O引脚/从机发送使能——USART1/SPI模式 本科生毕业设计说明书(2011)

续表3-1:

引 脚 名 称 P5.1/SIMO1 P5.2/SOMI1 P5.3/UCLK1 序 号 45 46 47 I/O I/O I/O I/O 通用数字I/O引脚/USART1的从输入、主输出或SPI模式 通用数字I/O引脚/USART1的从输出、主输入或SPI模式 通用数字通用I/O引脚/外部时钟输入——USART1/UART或SPI模式,时钟输出——USART1/SPI模式 P5.4/MCLK P5.5/SMCLK P5.6/ACLK P5.7/TBOUTH P6.0/A0 P6.1/A1 P6.2/A2 P6.3/A3 P6.4/A4 P6.5/A5 P6.6/A6 P6.7/A7 RST/NMI TCK TMS TDI TDO/TDI VeREF+ VREF+ VREF-/ VeREF- XIN XOUT/TCLK 48 49 50 51 59 60 61 2 3 4 5 6 58 57 56 55 54 10 7 11 8 9 I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I I I I I/O I/O O O I I/O 通用数字I/O引脚/主系统时钟MCLK输出 通用数字I/O引脚/子系统时钟SMCLK输出 通用数字I/O引脚/辅助时钟ACLK输出 通用数字I/O引脚/切换所有的PWM数字输出口为高阻抗定时器B_3 TB0~TB2 通用数字I/O引脚/12位A/D转换器模拟输入通道0 通用数字I/O引脚/12位A/D转换器模拟输入通道1 通用数字I/O引脚/12位A/D转换器模拟输入通道2 通用数字I/O引脚/12位A/D转换器模拟输入通道3 通用数字I/O引脚/12位A/D转换器模拟输入通道4 通用数字I/O引脚/12位A/D转换器模拟输入通道5 通用数字I/O引脚/12位A/D转换器模拟输入通道6 通用数字I/O引脚/12位A/D转换器模拟输入通道7 复位输入/不可屏蔽中断输入口,或自动加载程序启动(FLASH版本器件有此功能) 测试时钟,TCK是用于器件测试与自动加载程序启动的时钟输入接口(FLASH版本器件有此功能) 测试方式选择,器件编程与测试的输入口 测试数据输入口,器件的保护熔丝被连接到TDI 测试数据输出口/编程数据输入口 送到模数转换器ADC12的外部基准电压 模数转换器ADC12的内部基准电压的正输入端 模数转换器ADC12的内部基准电压或外部加的基准电压负端 晶体震荡器XT1的输入口 晶体震荡器XT1的输出口或测试时钟的输入口 说 明 - 7 -

基于MSP430单片机的时钟设计

续表3-1:

引 脚 名 称 XT2IN XT2OUT AVcc AVss DVcc DVss 序 号 53 52 64 62 1 63 I/O I O 晶体震荡器XT2的输入口,只能接标准晶体 晶体震荡器XT2的输出口 模拟电源的正输入端,送到模数转换器ADC12的模拟部分 模拟电源的负输入端,送到模数转换器ADC12的模拟部分 数字电源的正输入端 数字电源的负输入端 说 明 3.3 MSP430F149芯片处理单元

处理单元基于一种一致的正交设计的CPU和指令集,这种设计结构形成了一种

对应用开发高度透明,并以编程简单著称的类RISC体系。除了程序流指令以外的所有操作,都是作为寄存器操作连同7种源寻址方式和4种目的操作数寻址方式来执行的。

MSP430F149芯片CPU有16个寄存器提供精简指令执行时间。存储器到寄存器操作执行时间被减少到处理器频率的一个周期,4个寄存器被保留,专门用作程序计数器、堆栈计数器、状态寄存器和常数发生器。其余的寄存器可用作通用寄存器。外设利用一个数据地址和控制总线连接到CPU,并能容易利用内存处理指令操作。 3.4 MSP430F149芯片运行模式

MSP430F149具有一种活动模式和五种软件可选的低功耗运行模式。一个中断事件可以将芯片从五种低功耗模式中的任何一种唤醒为请求服务并在从中断程序返回时恢复低功耗模式。

下列六种运行模式由软件配置: a.活动模式AM

-所有时钟活动 b.低功耗模式0(LPM0) -CPU关闭

ACLK和SMCLK保持活动,MCLK关闭 c.低功耗模式1(LPM1) -CPU关闭

ACLK和SMCLK保持活动,MCLK关闭

如果DCO在活动模式中没有使用,DCO的直流发生器将关闭 d.低功耗模式2(LPM2)

- 8 -

本科生毕业设计说明书(2011)

-CPU关闭;ACLK保持活动 MCLK、FLL+,DCOCLK关闭 DCO的直流发生器保持活动 e.低功耗模式3(LPM3)

-CPU关闭;ACLK保持活动 MCLK、FLL+,DCOCLK关闭 f.低功耗模式4(LPM4)

-CPU关闭;ACLK关闭

MCLK、FLL+、DCOCLK关闭

DCO的直流发生器关闭;晶体振荡器停止 3.5 MSP430F149芯片I/O端口

MSP430F149有6个8位的I/O端口P1~P6,端口P1和P2用7个控制寄存器,端口P3、P4、P5、P6仅使用4个寄存器,为应用提供数字输入/输出的最大灵活性: a.所有单个I/O口可独立编程;

b.任何输入输出和中断条件的组合都是可能的;

c.端口P1和P2的所有8位对外部事件的中断处理完全实现。

端口P1和P2具有输入/输出、中断和外部模块功能,端口P3、P4、P5和P6没有中断能力,其余功能和P1、P2相同。以Px代表端口,介绍所有的7个寄存器。 a. PxDIR (输入/输出方向寄存器)

相互独立的8位分别定义了8个引脚的输入/输出方向。使用输入/输出功能时,应该先定义端口的方向,输入/输出才能满足设计者的要求。作为输入时,只能读;作为输出时,可读可写。

0 :输入模式;1 :输出模式。 b. PxIN (输入寄存器)

输入寄存器是只读寄存器,用户不能对它写入,只能通过读取该寄存器内容知道I/O端口的输入信号,此时引脚的方向必须选定为输入。

c. PxOUT (输出寄存器)

该寄存器为I/O端口的输出缓冲寄存器,在读取时输出缓存的内容与引脚方向定义无关。改变方向寄存器的内容,输出缓存的内容不受影响。 d. PxIFG (中断标志寄存器)

该寄存器有8个标志位,标志相应引脚是否有待处理中断的信息,即相应引脚是否有中断请求。

0 :没有中断请求;1 :有中断请求。 e. PxIES (中断触发沿选择寄存器)

如果允许Px口的某个引脚中断,还需要定义该引脚的中断触发方式。该寄存器的8位分别对应Px口的8个引脚。

0 :上升沿使相应标志置位;1 :下降沿使相应标志置位。

- 9 -

基于MSP430单片机的时钟设计

f. PxIE (中断使能寄存器)

Px口的每一个引脚都有一位用以控制该引脚是否允许中断。 0 :禁止中断;1 :允许中断。 g. PxSEL (功能选择寄存器)

各端口具有其他片内外设功能,为了减少引脚,将这些功能与芯片外的联系通过复用Px引脚的方式来实现。PxSEL用来选择引脚的I/O端口功能与外围模块功能。

P3、P4、P5和P6端口只有输入/输出方向寄存器(PxDIR)、输入寄存器(PxIN)、输出寄存器(PxOUT)和功能选择寄存器(PxSEL)。

0 :选择引脚为I/O端口;1 :选择引脚为外围模块功能。 3.6 MSP430F149芯片时钟系统

MSP430F149芯片内基础时钟模块有3个时钟输入源: a.LFXT1CLK 低频时钟源 b.XT2CLK 高频时钟源

c.DCOCLK 数字控制RC振荡器

LFXT1振荡器默认工作在低频模式,即32768Hz,XT2振荡器为标准的8MHz晶体振荡器。

基础时钟模块可提供3种时钟信号:主系统时钟(MCLK)、子系统时钟(SMCLK)和辅助时钟(ACLK)。

主系统时钟(MCLK):MCLK可由软件选择来自LFXT1CLK、XT2CLK、DCOCLK三者之一,然后经1、2、4、8分频得到。MCLK主要用于CPU和系统。

子系统时钟(SMCLK):可由软件选择来自LFXT1CLK和DCOCLK,或者XT2CLK和DCOCLK(由具体器件决定),然后经1、2、4、8分频得到。SMCLK主要用于高速外围模块。

辅助时钟(ACLK):ACLK是LFXT1CLK信号经1、2、4、8分频后得到的。ACLK可由软件选作各个外围模块的时钟信号,一般用于低速外设。

系统使用不同的时钟信号,用户通过程序可以选择低频或高频,这样可以根据实际需要来选择合适的系统时钟频率,这3种不同频率的时钟输出给不同的模块,从而更合理地利用系统的电源,实现整个系统的超低功耗,这一点对于电池供电的系统来讲至关重要。

3.7 MSP430F149芯片存储器结构和地址空间

MSP430系列单片机存储器采用的是统一结构、物理上完全分离的存储区域如ROM/FLASH、RAM、外围模块、特殊功能寄存器SFR等,被安排在同一地址空间,这样就可以使用一组地址、数据总线、相同的指令对它们进行字节或字形式访问。MSP430系列单片机存储器的这种组织方式和CPU采用精简指令相互协调,对外围模块的访问不需要单独的指令,该结构为软件的开发和调试提供便利。

现以64KB的存储空间为例说明MSP430的存储器使用情况,如图3-1所示。

- 10 -

本科生毕业设计说明书(2011)

0FFFFH 中断向量表 0FFE0H 0FFDFH 程序存储器 跳转控制表 数据表等 引导存储器(ROM) 数据存储器 0200H 01FFH 0100H 0FFH 010H 0FH 00H 图3-1 MSP430存储空间分配

16位外围模块 8位外围模块 特殊功能寄存器

MSP430不同系列器件的存储空间分布有很多相同之处:

a)中断向量被安排在相同的空间:OFFEO~OFFFFH。 b)8位、16位外围模块占用相同范围的存储器地址。 c)特殊功能寄存器占用相同范围的存储器地址。 d)数据存储器都从0200H处开始。

e)程序存储器的最高地址都是0FFFFH。

但是由于器件所属型号的不同,存储空间的分布也存在一些差异:程序存储器容量不一样,所以起始地址也不一样;仅FLASH型有信息存储器和引导存储器,而且不同器件它们的地址不同;数据存储器的末地址不一样,中断向量和8位、16位外围模块的内容不同等。

MSP430的数据存储器是最灵活的地址空间,位于存储器地址空间的0200H单元以上,这些存储器一般用于堆栈和变量,如存放经常变化的数据。堆栈是具有先进后出特殊操作的一段数据存储单元,可以在子程序调用、中断处理或者函数调用过程中保存程序指针、参数、寄存器等。

程序存储器FLASH是0FFFFH以下的一定数量的存储空间,可存放系统程序或者应用程序及常数,可以避免断电等意外情况而造成存储的信息丢失。程序代码必须有地址寻址。程序代码包括:中断向量区、用户程序代码和系统引导程序。

MSP430系列单片机内所有外围模块都可以用软件访问和控制,外围模块相关的控制寄存器和状态寄存器都被安排在0000H~01FFH范围的RAM中,MSP430可以像访问普通RAM单元一样对这些寄存器进行操作。

- 11 -

基于MSP430单片机的时钟设计

4 系统硬件电路设计

4.1 系统方案论证与选择

方案一:采用EDA设计,整个数字钟电路由振荡脉冲发生器、计数电路、显示译码/ 驱动器和七段显示器组成,如图4-1所示:

图4-1 数字时钟系统框图

振荡脉冲发生器 计数电路 显示译码驱动电路 七段显示器 振荡脉冲发生器用来产生秒脉冲。计数电路由秒个位计数器、秒十位计数器、分个位计数器、分十位计数器、时个位计数器、时十位计数器组成。计数器的功能是每来一个脉冲计一个数。显示译码/ 驱动器采用74LS47 共阳极显示译码器。显示器采用共阳极七段显示器。

方案二:采用数字电路进行设计。 如图4-2所示,整个系统是由主体电路、扩展电路、振荡器、分频器等几部分组成,主体电路完成时间的显示和调时的功能,扩展电路中留有接口供扩展电路使用。

该系统的工作原理是:振荡器产生的稳定的高频脉冲信号,作为数字钟的时间基准,再经分频器输出标准秒脉冲。秒计数器计满60后向分计数器进位,分计数器计满60后向小时计数器进位,小时计数器按“12翻1”规律计数。计数器的输出经译码器送显示器。计时出现误差时可以用校时电路进行校时、校分、校秒。扩展电路必须在主体电路正常运行的情况下才能进行功能扩展。

计数器部分采用74LS90进行计数,而译码部分采用74LS48七段译码驱动器驱动数码显示器。用数字电路设计的电路的特点是软件部分比较简单,但是其硬件电路比较复杂。

时显示器 时译码器 时计数器 分显示器 分译码器 分计数器 秒显示器 秒译码器 秒计数器 触摸整点报时 主体电路 校时电路 扩展电路 定时功能 仿电台报时 报整点时数 振荡器 分频器 图4-2 数字时钟系统框图

- 12 -

本科生毕业设计说明书(2011)

方案三:利用单片机设计。采用MSP430F149作为整个电路的核心部件,应用4*4的矩阵键盘作为输入,外接LCD或LED进行显示,同时还连接一些扩展电路以便增加时钟功能。用单片机为核心的系统其硬件电路非常简单,计数、调时、译码显示等全部都由软件控制实现,准确性较高。

经过比较选择决定采用方案三,MSP430系列单片机具有强大的处理功能,而且其超低功耗的特点非常适合电池供电的仪表仪器。以单片机为核心的系统处理能力强、误差小,而且采用键盘输入更为方便,容易操作。 4.2系统总体设计

如图4-3所示,整个时钟电路由MSP430F149单片机、4*4矩阵键盘、显示电路、扩展功能电路、电源和晶振等几部分组成。

其中MSP430F149单片机是整个系统的核心部件。4*4的矩阵键盘作为系统的输入,有调时、复位等功能;显示电路部分采用LCD液晶显示器和LED数码管显示器同时进行显示;扩展电路是为系统预留的部分,在这部分可以进行一些功能的添加,如闹铃、温度显示等功能。单片机外接两个晶体振荡器:低速晶体振荡器LFXT1和高速晶体振荡器XT2。低速晶体振荡器为32KHZ,晶振只需经过XIN和XOUT两个引脚相连,不需要其他外部器件,所有保证系统工作稳定的元件和移向电容都集成在芯片中。LFXT1振荡器在发生有效PUC信号后开始工作,依次有效PUC信号可以将SR寄存器中的OscOff位复位,即允许XT1工作。如果LFXT1CLK信号没有用作SMCLK或MCLK信号,可以用软件将OscOff位置位以禁止LFXT1工作。高速晶体振荡器为8MHZ的标准晶体振荡器,经过XT2IN和XT2OUT两个引脚相连。它产生时钟信号XT2CLK,它的工作特性与LFXT1振荡器工作在高频模式时相似。如果XT2CLK信号没有用做MCLK和SMCLK时钟信号,可以用控制位XT2OFF关闭XT2。

电源电路 MSP430F149 芯片 扩展功能 电路 显示 电路 晶振 4*4矩阵键盘 图4-3 系统整体框图

- 13 -

基于MSP430单片机的时钟设计

4.3 电源稳压电路

电源通过稳压器接入单片机,稳压器选用SPX1117低压差稳压器。

SPX1117低压差稳压器为一个低功耗正向电压调节器,具有0.8A的稳定输出电流,可以用在一些高效率,小封装的低功耗设计中。这款器件非常适合便携式电脑及电池供电的应用。SPX1117有很低的静态电流,在满负载时其低压差仅为1.1V。当输出电流减少时,静态电流随负载变化,并提高效率。SPX1117可调节,可以选择1.5V、1.8V、2.5V、2.85V、3.0V、3.3V及5V的输出电压。SPX1117提供多种3引脚封装:SOT-223,TO-252,TO-220及TO-263。一个10µF的输出电容可有效地保证稳定性,然而在大多数应用中,仅需要一个更小的2.2µF的电容。SPX1117具有以下一些特性:

a.0.8A稳定输出电流 b.1A稳定峰值电流

c.3端可调节(电压可选:1.5V、1.8V、2.5V、2.85V、3.0V、3.3V及5V) d.低静态电流

e.0.8A时低压差为1.1V

f.0.1%线性调整率/0.2%负载调整率 g.2.2µF陶瓷电容即可以保持稳定 h.过流及温度保护 i.多封装

因为MSP430F149的工作电压范围为1.8~3.6V。所以在此次设计中,SPX1117的作用是将5V的电源转化为3.3V的电压输给单片机。为了滤除电压转换时的内部及外部干扰,在输入和输出电压的接口处都通过一个极性电容连接电源地。 4.4 LED数码显示电路

4.4.1 LED数码管的结构与工作原理

在单片机应用系统中,显示器可以反映系统的工作状态和运行结果。比较常用的显示器是由8只发光二极管LED构成的八位数码显示器。如图4-4所示。

其中,a~g用于构成7笔字形,h用于构成小数点。这种显示器有共阴极和共阳极两种。共阴极LED显示器的发光二极管的阴极连接在一起,通常将公共阴极接地,当某个发光二极管的阳极为高电平时,发光二极管点亮,相应的段被显示。同样,共阳极LED显示器的发光二极管的阳极连接在一起,通常将公共阳极接正电压,当某个发光二极管的阴极接低电平时,发光二极管被点亮,相应的段位被显示。

- 14 -

本科生毕业设计说明书(2011)

图4-4 LED数码管

4.4.2 LED显示器的显示方式及驱动方式

在单片机应用系统中,常使用N个LED数码管构成的LED显示器。N位LED显示器有N根位选线和8×N根字选线。根据显示方式的不同,位选线和字选线的连接方式不同,字选线控制字符的选择,位选线控制显示字符的亮、暗。

LED显示器有静态显示和动态显示两种方式。 a. LED静态显示方式

在静态显示方式下,每位的字选线(a~h)与一个8位端口相连。只要在该位的字选线上出现字形码,就显示出相应的字符。由于每一位数码管由一个单独的8位端口控制字选码,故在同一时间里每一位所显示的字符可以各不相同。

使用静态显示方式的优点在于软件处理比较容易,缺点是占用I/O口线太多,在实际应用中不是经常使用这种显示方式。 b. LED动态显示方式

在一组显示器中所含数码管个数较多时,为了简化电路,降低成本,一般采用动态显示方式。这种显示方式是将所有数码管的各字段电极对应地并联在一起,由一个8位端口控制,这个端口送出的信号用来控制显示的字形,称为段或字选码。而每个数码管的共阴极或共阳极极点分别由另一个端口的相位I/O口线控制,这个端口送出的信号用来选择第几位数码管工作,称为位码。

本次设计的显示器需要8个数码管,由于所有位的字选码均由同一个端口送出,因此在每一个瞬间,8位LED只可能显示相同的字形,要想显示不同的字形,必须采用动态扫描方式。动态显示只需要2个8位端口,其中P4通过74HC244连接到显示器控制位选,P5连接a~h控制字选。

动态扫描的工作过程为:由P4向各个位轮流输出扫描信号,使每一瞬间只有一个数码管被选通(共阴极低电平选通,共阳极高电平选通),然后由P5送入该位所要显示的字形码,点亮该位字形段显示的字形。这样,在P5送出的码段和P4送出的位段的配合控制下,就可以使各个数码管轮流点亮显示各自的字形。虽然数码管显示器的几位是被依次被点亮的,但只要每位点亮时间超过1ms,隔一段时间使之再显示一遍,如此重复扫描,只要扫描时间足够快,由于人的视觉惰性,人眼看不出闪烁。

LED不同位显示的时间间隔可以通过定时中断完成。如对8位LED显示器,扫描

- 15 -

基于MSP430单片机的时钟设计

显示频率为50Hz,假若显示一位保持1ms时间,则显示完成所有8位之后,只需8ms,于是另外12msCPU可以处理其他工作。上述保持1ms的时间应根据实际情况而定,不能太小,因为发光二极管从导通到发光有一定的延时,导通时间太小,发光太弱人眼无法看清;但也不能太大,因为毕竟要受限制于临界闪烁频率,而且次时间越长,占用CPU时间也越多。另外,显示位增多,也将占用大量的CPU时间,因此动态显示实质是以牺牲CPU时间换取元件和能耗的减少。

前面只是对显示器进行原理上的阐述,没有涉及LED的驱动问题,其实这是一个非常重要的问题。如果驱动器的驱动能力差,显示器亮度就低,而驱动器长期在超负荷下运行则很容易损坏,因此,对LED的驱动就显得非常重要。

显示分为静态显示和动态显示两种方式,由于这两种显示方式有本质的不同,因此在选择LED驱动器时,一定要分清显示方式。

如果是静态显示,则LED驱动器的选择较为简单,只要驱动器的驱动能力与显示器工作电流相匹配即可。而且只需要考虑段的驱动,因为共阳极接+5V,而共阴极接地,所以位的驱动无需考虑。

动态显示则不同,由于一位数据的显示是由段选和位选信号共同配合完成的,因此,必须同时考虑段和位的驱动能力,而且段的驱动能力决定位的驱动能力。

段的驱动能力是由显示器的亮度决定的,通过发光二极管的电流越大,其亮度也越高。对于静态显示器,当某位点亮时,此位中点亮的段通过恒定的电流,而对于动态显示器,此电流却是以一定脉冲方式出现的,其峰值电流不能真实地反映二极管的发光亮度,而必须以与脉冲占空比有关的平均值电流来考虑。

理论分析表明,同样的驱动器,当驱动静态显示器时,其亮度为驱动动态显示器的n倍,n近似为显示位数。所以要使动态显示器达到静态显示器的亮度,必须将驱动器的驱动能力提高n倍。

段的驱动能力确定之后,位的驱动能力也随之确定。当然必须考虑极端的情况,即位中各段均点亮,则位的驱动电流为各段驱动电流之和,此电流应为峰值。

在课题电路的设计中,采用的是74HC244对数码管显示器进行驱动,因为MSP430的功耗很低,所以它的输出电流很低,无法驱动数码管显示,所以需要通过74HC244对数码管进行驱动,使其可以正常工作。74HC244芯片内部共有两个四位三态缓冲器,使用时可分别以1G和2G作为它们的选通工作信号。当1G和2G都为低电平时,输出端Y和输入端A状态相同;当1G和2G都为高电平时,输出呈高阻态。 4.5 LCD液晶显示接口电路

液晶显示器的原理是利用液晶的物理特性,通电时导通,排列变得有顺序,使光线容易通过;不通电时排列混乱,阻止光线通过。光线通过和不通过的组合就可以在屏幕上显示出图像来。通俗地说,液晶显示器就是两块玻璃中间夹了一层(或多层)液晶材料,液晶材料在信号控制下改变自己的透光状态,于是就能在玻璃面板前看到图像了。由于液晶是通过环境光来显示信息的,液晶本身不主动发光,所以液晶功耗很低,更加适用单片机低功耗应用系统。另外,液晶只能低频交流电压驱动,

- 16 -

本科生毕业设计说明书(2011)

直流电压将损坏液晶。

液晶的种类有多种,常见的有段式液晶、字符式液晶、图形式液晶等。本设计使用的是TC1602字符型液晶显示器。字符型液晶显示模块是一类专门用于显示字母、数字、符号等的点阵型液晶显示模块。字符型液晶显示模块是在一块双面印刷线路板上,它的一面用导电橡胶将电路与液晶显示器件连接,另一面装配所需要的驱动器和控制器以及驱动所需的分压电路。

TC1602采用标准的16脚接口,如图4-5所示。 第1脚:VSS为地电源。 第2脚:VDD接5V正电源。

第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。

第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器,接MSP430F149的P3.0脚。

第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据,接单片机的P3.1脚。

第6脚:EN端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令,接单片机的P3.2脚。

第7~14脚:D0~D7为8位双向数据线,接单片机的P2口。

+5VLCD12345678910111213141516GND+5VRSR/WEND0D1D2D3D4D5D6D7+5VGNDR1610K CON16

图4-5 TC1602液晶显示器

1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是

- 17 -

基于MSP430单片机的时钟设计

01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。1602液晶模块内部的控制器共有11条控制指令。它的读写操作、屏幕和光标的操作都是通过指令编程来实现的(说明:1为高电平、0为低电平)。

RS、RW和EN三个读/写使能端口控制着LCD的读/写状态,它们的接口时序如下图所示,图4-6为写状态时序,图4-7为读状态时序。

图4-6 写状态时序图

图4-7 读状态时序图

另外,TC1602液晶显示器的一些工作范围如下: a.逻辑工作电压(Vdd):+4.5 ~ +5.5V

b.LCD 驱动电压(Vdd-V0):+4.5 ~ +13.0V c.工作温度(Ta):0 ~ 60°C(常温)/-20 ~ 75°C(宽温) d.保存温度(Tstg):-55~125°C e.工作电流:2.0mAmax

为了区分正常显示时间和调整时间的不同,在调时时显示“SET TIME”,在正常显示时间时显示“NOW TIME”用以区分。用液晶显示器和数码管显示器同时显示时

- 18 -

本科生毕业设计说明书(2011)

间,并在液晶显示器的第一行显示“NOW TIME”或“SET TIME”,第二行显示时间。 4.6 键盘输入电路

键盘是计算机系统中最常用的人机对话输入部分。在单片机应用系统中,为了控制系统的工作状态以及向系统输入数据,一般均设有按键或键盘。例如复位用的复位键,功能转换的命令键和数据输入的数字键等。

键盘一般分为编码键盘和非编码键盘两种。

编码键盘本身除了按键之外,还包括产生键码的硬件电路。只要按一下某一个键,就能产生这个键的代码,这种键盘使用比较方便,需要编写的键盘输入程序也比较简单。不过由于使用的硬件较复杂,在单片机应用系统中使用的不多。 非编码键盘是由若干个按键组合的开关矩阵,按键的作用只是简单地实现接点的接通和断开。非编码键盘必须有一套相应的程序与之配合,才能产生出相应的键码。由于非编码键盘硬件上十分简单,目前在单片机应用系统中使用比较普遍。

单键键盘每一个按键开关占一位I/O口线,在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口就可以构成4*4=16个按键,比直接将端口线用于键盘多出了一倍容量,而且线数越多,区别越明显。比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。

如图4-8所示,矩阵式结构的键盘显然要复杂一些,识别也要复杂一些。其中key0~key3接单片机的P1.0~P1.3做输入线,key4~key7接单片机的P1.4~P1.7做输入线。行线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键被按下。行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法。

VCCK1K2K3K4R9R10R11R121K1K1K1KK5K6K7K8K9K10K11K12Key3Key2Key1Key0Key4Key5Key6Key7K13K14K15K16 图4-8 矩阵键盘示意图

- 19 -

基于MSP430单片机的时钟设计

在检测是否有键按下时,先使4条列线输出低电平,然后读取4条行线的状态,如果全部为高电平则表示没有任何键被按下;如果有任一键被按下,由于行线是弱上拉至Vcc,则行线上读到的将是一个非全“1”的值。上述只是说明了如何判定如何有键被按下,但不能判定具体是哪一个键。上面提到的按键识别方法是这样的:首先看输入的行线,假设4条列线都输出低电平,4条行线都是弱上拉至Vcc的,在没有任何按键按下时输入都为“1”。但当与某一条行线相连的4个按键中的任何一个被按下时,这条行线将输入低电平。即,当某条行线输入低电平时,必定是连接在这条行线上的某个按键被按下了。这样就将16个按键按行线分成了4组,已经能够区分出这4条行线间的区别了。接着要解决的是区分同一条行线上的4个连接在不同列线上的按键。方法是以均匀的时间间隔(比如10毫秒)在4条列线上分别扫描输出“0”信号,也就是说在第一个10毫秒内在P1.4上输出低电平,其他的列线上输出高电平;接着在第二个10毫秒内在P1.5上输出低电平,其他列线输出高电平,如此循环输出。如果4条列线没有输出低电平,则尽管键被按下,仍然不能从行线读到“0”。利用这一原理,分时扫描在不同列线上的输出的低电平,则当在某一条行线上读取到“0”时,就可以唯一地确定是与哪一条列线相连的按键被按下了。

比如说图4-2中的按键7被按下,如果P1.6没有输出低电平,则尽管按键被按下,仍然不能从P1.2口线读到“0”,但由于4条列线上扫描输出低电平,只要按下超过40毫秒的时间,必定能等到P1.6输出低电平。即,如果在P1.6输出低电平的这10毫秒内在P1.2上读取到低电平,则必定是与这两条I/O口线相连的这个按键被按下了,也就找到了被按下的按键的确切位置。 4.7 JATG接口基本原理

随着嵌入式技术的发展,在一些高端的掌上设备中,都使用了Flash芯片,但对于研发人员来说,在开发阶段需要大量的程序调试,就意味着要对Flash进行擦除和改写的工作,因此,如何对 Flash进行在线编程是问题的关键所在,通过JTAG对Flash进行的在线编程是一种重要的方法。JTAG(Joint Test Action Group)是1985年制定的检测PCB和IC芯片的一个标准,1990年被修改后成为IEEE的一个标准,即IEEE1149.1-1990。通过这个标准,可对具有JTAG口芯片的硬件电路进行边界扫描和故障检测。在IEEE 1149.1标准里面,寄存器被分为两大类:数据寄存器(DR-Data Register)和指令寄存器(IR-Instruction Register)。边界扫描链属于数据寄存器中很重要的一种。边界扫描链用来实现对芯片的输入输出的观察和控制。而指令寄存器用来实现对数据寄存器的控制,例如:在芯片提供的所有边界扫描链中,选择一条指定的边界扫描链作为当前的目标扫描链,并作为访问对象。 4.7.1 边界扫描技术

在JTAG调试当中,边界扫描(Boundary-Scan)是一个很重要的概念。边界扫描技术的基本思想是在靠近芯片的输入输出管脚上增加一个移位寄存器单元。寄存器的每一个单元分配给IC芯片的相应引脚,每一个独立的单元称为BSC(Boundary-Scan Cell)边界扫描单元。这个串联的BSC在IC内部构成JTAG回路,所有的

- 20 -

本科生毕业设计说明书(2011)

BSR(Boundary-Scan Register)边界扫描寄存器通过JTAG测试激活,当芯片处于调试状态的时候,这些边界扫描寄存器可以将芯片和外围的输入输出隔离开来。通过这些边界扫描寄存器单元,可以实现对芯片输入输出信号的观察和控制。对于芯片的输入管脚,可以通过与之相连的边界扫描寄存器单元把信号(数据)加载倒该管脚中去;对于芯片的输出管脚,也可以通过与之相连的边界扫描寄存器“捕获”(CAPTURE)该管脚上的输出信号。在正常的运行状态下,这些边界扫描寄存器对芯片来说是透明的,所以正常的运行不会受到任何影响,这样边界扫描寄存器提供了一个便捷的方式用以观测和控制所需要调试的芯片。另外,芯片输入/输出管脚上的边界扫描(移位)寄存器单元可以相互连接起来,在芯片的周围形成一个边界扫描链(Boundary-Scan Chain)。一般的芯片都会提供几条独立的边界扫描链,用来实现完整的测试功能。边界扫描链可以串行的输入和输出,通过相应的时钟信号和控制信号,就可以方便的观察和控制处在调试状态下的芯片。 4.7.2 TAP控制器

JTAG内部有一个状态机,称为TAP控制器。TAP是一个通用的端口,通过TAP可以访问芯片提供的所有数据寄存器(DR)和指令寄存器(IR)。对整个TAP的控制是通过TAP 控制器来完成的。TAP总共包括5个信号接口TCK、TMS、TDI、TDO和RST :其中4个是输入信号接口和另外1个是输出信号接口。一般,我们见到的开发板上都有一个JTAG接口,该JTAG接口的主要信号接口就是这5个,如图4-9所示。

JP1 TDO/TDI TDI TMS TCK GND RST 1 3 5 7 9 11 13 JATG 2 4 6 8 10 12 14 VCC

图4-9 JTAG接口示意图

下面,介绍这5个接口信号及其作用。

a. TCK (Test Clock Input) :

TCK为TAP的操作提供了一个独立的、基本的时钟信号,TAP的所有操作都是通过这个时钟信号来驱动的。TCK在IEEE 1149.1标准里是强制要求的。

b. TMS (Test Mode Selection Input) :

TMS信号用来控制TAP状态机的转换。通过TMS信号,可以控制TAP在不同的状态间相互转换。TMS信号在TCK的上升沿有效。TMS在IEEE 1149.1标准里是强制要求的。

c. TDI (Test Data Input) : TDI是数据输入的接口。所有要输入到特定寄存器的数据都是通过TDI接口一位

- 21 -

基于MSP430单片机的时钟设计

一位串行输入的(由TCK驱动)。TDI在IEEE 1149.1标准里是强制要求的。

d. TDO (Test Data Output) : TDO是数据输出的接口。所有要从特定的寄存器中输出的数据都是通过TDO接口一位一位串行输出的(由TCK驱动)。TDO在IEEE 1149.1标准里是强制要求的。

e. RST (Test Reset Input) :

RST可以用来对TAP控制器进行复位(初始化)。不过这个信号接口在IEEE 1149.1标准里是可选的,并不是强制要求的。因为通过TMS也可以对TAP控制器进行复位(初始化)。

通过TAP接口,对数据寄存器进行访问的一般过程如下: a.通过指令寄存器,选定一个需要访问的数据寄存器; b.把选定的数据寄存器连接到TDI和TDO之间;

c.由TCK驱动,通过TDI,把需要的数据输入到选定的数据寄存器当中去;同时把选定的数据寄存器中的数据通过TDO读出来。

通过TCK、TMS的设置,可将JTAG设置为接收指令或数据状态。JTAG常用指令如下:

SAMPLE/PRELOAD——用此指令采样BSC内容或将数据写入BSC单元;

EXTEST——当执行此指令时,BSC的内容通过引脚送到其连接的相应芯片的引脚,我们就是通过这种指令实现在线写Flash的;

BYPASS——此指令将一个一位寄存器轩于BSC的移位回路中,即仅有一个一位寄存器处于TDI和TDO之间。

在PCB电路设计好后,即可用程序先将对JTAG的控制指令,通过TDI送入JTAG控制器的指令寄存器中。再通过TDI将要写Flash的地址、数据及控制线信号入BSR中,并将数据锁存到BSC中,用EXTEST指令通过BSC将写入Flash。

5 MSP430集成开发调试环境

5.1 关于IAR Embedded Workbench

IRA嵌入式工作平台Embedded Workbench为开发不同的MSP430目标处理器项目提供了强有力的开发环境,并为每一种目标处理器提供工具选择。IAR Embedded Workbench提供一个嵌入式开发的完整集成环境。一整套的嵌入式开发环境,包括编辑、编译、连接、调试软件,主要支持8到16位处理器。集成的编译器主要产品特征:高效PROMable代码、完全标准C兼容、内建对应芯片的程序速度和大小优化器、目标特性扩充、版本控制和扩展工具支持良好便捷的中断处理和模拟、瓶颈性能分析、高效浮点支持、内存模式选择、工程中相对路径支持。

IAR Embedded Workbench有如下一些特点:

IAR Embedded Workbench 可以生成节省空间并且稳定可靠的可执行代码。 经过反复实验证明,IAR Systems 的C/C++编译器可以生成高效可靠的可执行代码,并且应用程序规模越大,效果明显。与其他的工具开发厂商相比,系统同时

- 22 -

本科生毕业设计说明书(2011)

使用全局和针对具体芯片的优化技术。连接器提供的全局类型检测和范围检测对于生成目标的代码的质量是至关重要。

IAR Systems 一贯使用精简的优化技术--基于最新技术架构的,针对AVR 的IAR Embedded Workbench各新版,生成的代码的尺寸比旧版缩小了10%,远远小于其他同类编译器生成的代码尺寸。IAR Embedded Workbench 生成的可以执行代码可以运行于更小尺寸、更低成本的微处理器之上,从而降低产品的开发成本。

IAR Embedded Workbench 是一套完整的集成开发工具集合,包括从代码编辑器、工程建立到C/C++编译器、连接器和调试器的各类开发工具,它紧密结合了Atmel ICE 2000 和Atmel JTAG ICE,使用户在开发和调试过程中,仅仅使用一种开发环境。

用户在开发过程中会有各种不同的需求,例如:用户可能需要开发适用于不同目标系统硬件的应用程序版本,也可能希望将正在调试的子程序包含到已经开发好的早期版本中,但并不希望包含最终代码;适用于不同目标系统硬件的用户应用程序版本常常具有共同的源程序文件,用户希望维护这些源程序文件中的一个,便能对应用程序的每一个版本自动进行修改;应用程序的不同版本之间可能存在相互差异的源程序文件,如应用中依赖于硬件特性的有关文档,这些文件需要分别进行维护,以适应每一个目标系统的版本。IAR Embedded Workbench的项目管理模式可以满足上述需求,允许设计者以树状体系结构组织项目,从而可以清晰表现文件之间的隶属关系。

在开发简单项目的应用中,用户对于某种目标硬件可能创建Debug(调试)和Release(发行)两个目标版本。这两个目标版本共同包含项目核心源程序文件的公共组,每一个目标版本还包含一个单独的组,用来存放专用于该目标版本的源程序文件。在开发较为复杂的项目时,IAR Embedded Workbench通过帮助用户组织项目结构使开发时间最短,通过汇编和编译最小的源文件组(它们是文件被修改之后完全更新目标代码所必需的)优化开发周期。 5.2 IAR Embedded Workbench的基本操作

IAR Embedded Workbench是一个方便快捷的集成开发环境,通过相应的环境设置,用户可以高效地对项目进行建立、编辑、编译、连接和调试。

和其他的调试软件一样,程序通过了编辑、编译、连接之后就进入了调试阶段。IAR C-SPY调试器完全内嵌于Workbench集成环境之中,是一个功能很强的交互式调试器,可以帮助用户查找出一些逻辑设计错误。在C-SPY的管理下,用户可以单步执行程序,也可以在程序中设置断点;可以显示和修改指定内存单元和区域的内容;可以显示和修改寄存器的内容等,这样就便于寻找程序中的错误。在发现错误后,还需要重复上述的编辑、编译、连接和运行等过程,直至程序运行正确。

在C-SPY中,用户可以根据需求选择不同的Driver,C-SPY有3种工作方式: a. Flash Emulation Tool——硬件仿真调试。 b. Simulator——软件模拟调试。

c. ROM-Monitor——调试主机与目标系统经RS-232接口联机,调试程序暂存于

- 23 -

基于MSP430单片机的时钟设计

RAM中。

硬件仿真方式是在目标硬件系统的真实环境中进行调试,除了验证程序,还可以检验目标系统的硬件设计性能。主机将代码通过JTAG仿真器下载到目标系统的Flash中运行。

选择软件模拟方式调试时,目标系统的运行是在调试主机上以软件模拟实现的,用户可以利用软件模拟调试在目标硬件系统产生之前验证程序的设计思想和逻辑结构。由于C-SPY软件模拟调试完全使用软件模拟目标处理器,不需要硬件,因此,对于许多应用来说这是一种高效而廉价的调试方法。

IAR C-SPY模拟调试器提供了如下功能: a)精确模拟指令的执行。 b)程序的分析。 c)中断的模拟。

d)立即断点设置和程序恢复运行。 e)外围设备的模拟(使用C-SPY的宏系统)。

f)在软件模拟调试时基本操作与硬件仿真基本相同。

由于软件模拟程序的运行与真实硬件无关,中断的触发不能从硬件上实现,如端口P1、P2的边沿触发中断、定时器中断、串口数据传输中断等,因此,为了验证程序的功能可以通过编写相应的宏定义文件(扩展名为.mac)协助调试。

除了普通断点,C-SPY软件模拟调试器可以设置立即断点使程序暂停运行。当处理器要从某一位置读取数据或刚写回数据时,允许C-SPY宏函数调用,动作完成后指令将继续执行。

对于像串口和定时器之类的设备,这种断点在模拟存储器映射时是很有用的。当处理器读取一个存储器器映射区域时,一个C-SPY宏函数可以插入并提供一个适当的数值。相反地,当处理器要写入一个数据到一个存储器映射区域时,一个C-SPY宏函数可以根据所写数值完成适当的功能。 5.3 IAR C430编译器

IAR C430编译器除提供C语言的标准特性,还增加了许多为利用MSP430专用工具而设计的扩展功能。编译器与MSP430 IAR系统汇编一起提供,与它集成在一起,共享连接器和库管理工具。

A. IAR C430编译器的特性: 语言工具:

a.与ANSI规格一致。

b.可用于嵌入式系统的标准函数库,具有可选用的源(代码)。 c.IEEE兼容的浮点算法。

d.对MSP430特殊功能的有力扩展,包括高效的I/O。

- 24 -

本科生毕业设计说明书(2011)

e.用户代码与汇编子程序连接。 f.长识别符,多达255个有效字符。 g.多达32000个外部符号。 性能:

a.快速编译。

b.避免暂时文件或覆盖的基本存储器的设计。 c.编译时严格的模块接口类型检查。 d.程序源的Lint-like检查。 代码产生:

a.可选择的代码速度或大小的最佳化。

b.综合输出选项,包括可重定位的二进制、ASM、ASM+、XREF等。 c.易于理解的出错和警告信息。 d.与C-SPY高级调试器兼容。 目标支持:

a.灵活的变量分配。

b.不需要汇编语言的中断函数。

c.使用处理器专用扩展的保持可移植性的#Pragma伪指令。 B. IAR C430区别于标准C的地方:

IAR C430在数据类型上有以下一些方面区别与标准C,具有特殊性。 a)外围模块变量

外围模块变量(Sfrb)也称作特殊功能寄存器变量,直接位于内部RAM单元。Sfrb范围为0X00至0XFF,Sfrw范围为0X100至0X1FFH,外围模块变量使符号名与此范围的字节或者字相联系。该地址处寄存器可以符号化被寻址,但没有分配存储器空间。

例如:P1的中断触发沿选择寄存器的地址为24H,P1的方向选择寄存器的地址为22H,ADC12的控制寄存器的地址为01A2H。可以使用如下外围模块变量定义:

Sfrb P1IES=0X24H Sfrb P1DIR=0X22H Sfrw ADC12CTL1=0X01A2H

经过定义,以后可以直接通过对应的符号访问这些寄存器。 P1DIR=0X01H ; P1.0输出 b)指针变量

IAR C430的指针变量包括代码指针和数据指针,都可以指向0000H~0FFFFH范围的存储空间。

c)枚举类型

用enum关键字,可以使声明的每一个变量具有适合它的值所需的最短正数类型,包括char、short、int或long。

d)浮点类型

- 25 -

基于MSP430单片机的时钟设计

在标准IEEE格式中,浮点使用4字节数来表示。低于最小极限值的浮点数被看作零而溢出给不定的结果。

浮点运算符(+、-、*、/)的精度近似为7位十进制数。对于IAR C430来说,float、double和long double数据类型没有什么区别。

e)位域

表达式中的位域具有与基本类型相同的数据类型(signed、unsigned char、short、int或者long)。具有基本类型char、short和long的位域是对ANSIC整数位域的扩充。位域变量的封装在从LSB位置开始的特定类型元素中。

C.IAR C430头文件:

用户程序通过头文件访问库定义,头文件使用#include伪指令与之相结合。为了避免浪费编译时间,定义被划分到许多不同的头部定义,每一个文件覆盖特定的函数区域,用户可以根据使用的内容选择不同的头文件。

IAR调试环境提供了MSP430各系列的标准头文件,定义了系列中包含的寄存器的物理地址。在程序中可以直接使用寄存器名或者寄存器中位的名称,这样就避免使用实际的物理地址,使程序设计简洁、高效。

例如:

#include Void main(void) {

WDTCTL=WDTPW + WDTHOLD; //停止看门狗定时器 P1DIR |= 0X01; //P1.0输出 For (;;) {

Unsigned int I;

P1OUT ˆ=0x01; //取反P1.0 i=50000; //延时 do (i--); while(i!=0);

} }

其中#include 为文件包含语句,使用文件包含语句后,msp430x14x系列的寄存器资源就可以用名称访问。如看门狗控制寄存器WDTCTL、端口P1方向选择寄存器P1DIR、控制位WDTPW和WDTHOLD等。开发流程如图5-1所示。

- 26 -

本科生毕业设计说明书(2011)

开 始 编辑C语言源文件 编译C语言源文件 连接目标文件 (包含调试选项) 错误 C-SPY调试 正确 编译文件 连接目标文件 (不包含调试选项) 生成程序代码,加载到PROM

图5-1 开发流程图

- 27 -

基于MSP430单片机的时钟设计

6 系统软件设计

开 始 启动P1口中断 初试化 是否有键按下 进入LPM0低功耗模式 延时 等待中断 (a) 执行按键扫描程序 是 否 判断键值 执行相应程序 启动看门狗定时器 中断返回 产生10毫秒定时中断 (c) 中断返回 (b) 图6-1 系统流程图

整个系统的程序流程图如图6-1所示。整个系统的基本工作过程为:系统通电之后将会对单片机、键盘、LCD等进行初始化,然后进入LPM0低功耗模式等待中断。中断主要有两个:一个是由看门狗定时器产生的10毫秒的定时中断,提供基准时钟;另一个就是P1口的按键扫描中断,判断是否有键按下以及判断键值并执行相应的程序。

在整个系统软件设计中,程序设计包括主程序、键盘程序和显示电路程序。键盘扫描法是一种常用的识别法,在这种方法中,只要CPU空闲,就调用键盘扫描程序,查询键盘并给予处理,CPU的利用率比较高,所以在键盘程序设计中采用的就是扫描法。显示部分用的是液晶显示器TC1602,每一行可以显示16个字符,可显示两行。TC1602内部存有英文字母和十进制数的ASCII码,当单片机向其输入频率时,TC1602可根据输入的数值调用其内部的ASCII码,并在液晶屏和数码管上显示。

在软件部分的设计中用到了看门狗定时器(WDT),它是MSP430系列单片机中常

- 28 -

本科生毕业设计说明书(2011)

用的一种部件。在工业现场,往往会由于供电电源、空间电磁干扰或其他原因引起强烈的干扰噪声。这些干扰作用于数字器件,极易使其产生误动作,引起MSP430发生“程序跑飞”事故。若不进行有效处理,程序就不能回到正常工作状态,从而失去应有的控制功能。看门狗定时器正是为了解决这类问题而产生的,尤其是在具有循环结构的程序任务中更为有效。在正常操作期间,一次WDT定时时间到,将产生一次器件复位。如果通过编制程序使WDT定时时间稍大于程序执行一遍所用的时间,并且程序执行过程中都有对看门狗定时器清零的指令,使计数器重新计数,则程序正常进行,就会在WDT定时时间到达之前对WDT清零,不会产生WDT溢出,如果由于干扰使程序跑飞,则不会在WDT定时时间到达之前执行WDT清零指令,WDT就会溢出,从而产生系统复位,CPU需要重新运行用户程序,这样程序就可以又恢复正常运行状态。MSP430看门狗除了具有上述系统检测的特定用途之外,还可以作为内部定时器来使用,当选择的时间到达以后,和其他定时器一样产生一个定时中断。本次设计的程序中与看门狗有关的一部分如下:

#pragma vector=WDT_VECTOR

__interrupt void watchdog_timer (void) {

seconds = __bcd_add_short (seconds, 0x01); if (seconds == 0x60) {

seconds = 0;

minutes = __bcd_add_short (minutes, 0x01); if (minutes == 0x60 ) {

minutes = 0;

hours = __bcd_add_short (hours, 0x01); if (hours == 0x13 ) {

hours = 0x01; } } }

display_time (); }

#pragma vector=TIMERA0_VECTOR __interrupt void ta1_isr(void) {

- 29 -

基于MSP430单片机的时钟设计

IE1 &= ~WDTIE; disp_led (); CCR0+=60000; IE1 |= WDTIE; }

程序中__bcd_add_short()为MSP430单片机自带的一个BCD码的转换函数,它的作用是将两个16进制的数相加,并将值返回。例如:两个16进制的数0x09和0x01相加后的值应为0x0a,但是经__bcd_add_short()函数后返回的值为0x10。 6.1 LED数码管显示器模块

在这个模块中是采用数码管显示时、分、秒,数码管采用共阳极的接法,由74HC244进行驱动。LED的显示代码(0~9)如下:

0——7BH 1——12H 2——4FH 3——7FH 4——36H 5——3DH 6——7DH 7——1BH 8——7FH 9——3FH 数码管部分显示时间的程序为:

void disp_led (void) {

unsigned char i=0; unsigned char temp=0x80; for (i=0; i<5;i++); {

P4DIR=0xFF; P5DIR=0xFF; P4OUT=temp; temp=temp>>1;

P5OUT=seg [disp_BCD[i]]; LCD_delay (500); } }

其中LCD_delay()函数是一个延时函数,因为在显示部分和按键部分都要遇到延时的问题,所以将其作为公共函数供调用,这个函数是这样定义的:

void LCD_delay (unsigned int i) { }

for (; i>0; i--);

- 30 -

本科生毕业设计说明书(2011)

6.2 LCD液晶显示器模块

在这个模块中在“LCD_1602.H”中定义了一些公共函数,作为显示驱动函数,内容如下:

#ifndef __LCD_1602_test_h #define __LCD_1602_test_h #include \"msp430x14x.h\"

#define SET_LCD_1602_EN P3OUT |= 0x04 //pin 2 #define CLR_LCD_1602_EN P3OUT &= ~0x04 #define SET_LCD_1602_RS P3OUT |= 0x01 //pin 0 #define CLR_LCD_1602_RS P3OUT &= ~0x01

#define SET_LCD_1602_RW P3OUT |= 0x02 //pin 1 #define CLR_LCD_1602_RW P3OUT &= ~0x02 #define LCD_I0 P2OUT

void LCD_delay (unsigned int i);

void LCD_en_command (unsigned char command); void LCD_en_dat (unsigned char temp); void LCD_init (void);

void LCD_set_xy (unsigned char x, unsigned char y);

void LCD_write_char (unsigned x, unsigned char y, unsigned char dat); void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);

#endif

头文件中对LCD的3个控制性引脚RS、RW和EN的状态进行了定义,以便使它们在不同的状态时选择不同的工作方式,完成不同的功能。例如#define SET_LCD_1602_RS P3OUT |= 0x01,这一句的作用就是将LCD的RS端置1,这个时候LCD的D0~D7口与数据寄存器进行通信,而#define CLR_LCD_1602_RS P3OUT &= ~0x01这一句就是将RS端置0,使D0~D7口与指令寄存器进行通信。

在上面还定义了一些功能函数,有起延时功能的LCD_delay(unsigned int i)控制功能的LCD_en_command(unsigned char command)、数据功能的LCD_en_dat(unsigned char temp);复位功能的LCD_init(void)以及写字符串的LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)等功能函数。其中都用到了上面对RS、RW和EN状态定义的语句。RS、RW和EN端口的接口时序见图4-6和图4-7。

TC1602字符型液晶显示器共分两行显示,每行显示16个字符,字符进行显示时要先对其坐标进行定义。将横坐标设为X,其范围为0~15。竖坐标设为Y,其范围为0~1。第一行的DDRAM(显示数据寄存器)的地址范围为80H~BFH,但是能显示出

- 31 -

基于MSP430单片机的时钟设计

来的只有80H~8FH,剩下的作为存储器使用。第二行的DDRAM(显示数据寄存器)的地址范围为C0H~FFH,同第一行一样,可以显示的只有C0H~CFH的内容。坐标定义这一部分的程序如下:

void LCD_set_xy (unsigned char x, unsigned char y)

{

unsigned char address;

if (y == 0) address = 0x80 + x;

else

address = 0xc0 + x; LCD_en_command(address); }

LCD液晶显示器的其他程序在附录1中列出。 6.3 矩阵键盘模块驱动

开 始 键值初始化 送列扫描值 Y P1.0=0? N P1.1=0? N P1.2=0? N P1.3=0? N Y Y Y 返回键值 调整列扫描值 图 6-2 矩阵键盘按键识别过程

键盘模块接的是MSP430F149的P1口。MSP430F149的P1口具有中断功能,因此为了更少的占用系统资源,我们采用中断的方式编写键盘的程序。矩阵式键盘的按键识别过程如图6-2所示。

- 32 -

本科生毕业设计说明书(2011)

在这一部分的设计中,主要有判断是否有按键按下、按键的扫描、按键的识别和按键的初始化等几部分程序。当CPU有空闲时就会执行按键扫描程序,并判断是否有键被按下,示例程序如下:

unsigned char key (void)

{

unsigned char x=0xff; P1DIR=0XF0;

P1OUT=0XE0; //扫描第一行 if ((P1IN&0X0F) ==0X0E) x=12; else

if((P1IN&0X0F)==0X0D) x=9; else

if ((P1IN&0X0F)==0x0B) x=5; else

if ((P1IN&0X0F)==0x07) x=1; else {

P1OUT=0XD0; //扫描第二行 if ((P1IN&0X0F)==0X0E) x=13; else

if ((P1IN&0X0F)==0X0D) x=0; else

if((P1IN&0X0F)==0x0B) x=6; else

if((P1IN&0X0F)==0x07) x=2; else ¨¨¨

当有按键被按下时就会执行按键识别程序,判断是哪一个按键被按下,完成什

- 33 -

基于MSP430单片机的时钟设计

么样的功能,如下:

#pragma vector=PORT1_VECTOR __interrupt void port1key (void) {

if (keyj()!=0X0f)

{ LCD_delay(300) ; //消抖动 if (keyj ()!=0X0f) {

i=key ();

if ((i>=0)&& (i<=9)) { IE1 &=~WDTIE; switch(j) { case 0 :

if(i<=1){BCD[j]=i; j++;} break; case 1:

if (BCD[0]==0){BCD[j]=i; j++;} else if(i<=2){BCD[j]=i; j++;} break;

¨¨¨

在这一部分中有一个按键消抖的功能,是为了防止按键抖动产生的错误识别。LCD_delay(300),这一句就是一个延时功能的语句,就是延时一段时间后再判断是否按键仍被按下,以此完成消抖的功能。

按键部分完成的程序见附录1。

- 34 -

本科生毕业设计说明书(2011)

7 结 束 语

在这次毕业设计中,我将所学的知识加以综合,不但巩固了以往所学的知识,而且很好的了解和掌握了一些新的知识,特别是熟悉了MSP430系列单片机的原理知识和基本的应用,而且对于液晶显示器的操作时序有了进一步的了解,相信这对日后的学习工作会有很大的帮助。

整个系统以MSP430单片机为控制电路,采用数码管和液晶屏同时显示时间,能够手动调节时间。系统硬件电路主要包括数据选择、译码显示、按键输入等电路。系统软件部分运用C语言编制单片机程序,主要包括主程序、动态扫描显示子程序和按键扫描子程序等。

通过本次毕业设计,我对于电气工程专业领域内相关知识有了进一步的理解,巩固了电子线路CAD软件的使用,掌握了一般电子系统的调试方法以及运用C语言编制单片机程序,并且自己实践动手方面的能力得到了进一步的加强。但是,也同时让我看到了自己在专业知识方面的差距。因而,在以后的工作学习中我将会加强自己能力的培养以弥补自己的缺陷。

- 35 -

基于MSP430单片机的时钟设计

参考文献

[1] 沈建华,杨艳琴,翟骁曙. MSP430系列16位超低功耗单片机原理与应用[M].北京:清华

大学出版社,2004.

[2] 沈建华,杨艳琴,翟骁曙. MSP430系列16位超低功耗单片机实践与系统设计[M].北京:

清华大学出版社,2004.

[3] 康华光. 模拟电子技术基础[M].北京:高等教育出版社,2006. [4] 阎石. 数字电子技术基础[M]. 北京:高等教育出版社,2006.

[5] 马忠梅. 单片机的C语言应用程序设计[M]. 北京:北京航空航天大学出版社,2005. [6] 崔武子,付钪,鞠慧敏. C语言程序设计实践教程[M]. 北京:清华大学出版社,2005. [7] 黄继昌. 实用单元电路及应用[M]. 北京:人民邮电出版社,2006. [8] 吴国经. 单片机应用技术[M].北京:高等教育出版社,2003. [9] 丁元杰. 单片微机原理及应用[M]. 北京:机械工业出版社,2009.

[10] 何立民.单片机应用系统设计系统配置与接口技术[M].北京:北京航空航天大学出版社,2006.

[11] 谢自美. 电子线路设计·实验·测试(第二版)[M]. 武汉:华中科技大学出版社.2007. [12] 魏小龙. MSP430系列单片机接口技术及系统设计实例[M]. 北京:北京航空航天大学出版

社,2004.

[13] 丁文霞,陆岷,刘安芝. 电子技术基础实验与课程设计(第二版)[M]. 北京:电子工业出

版社,2008.

- 36 -

本科生毕业设计说明书(2011)

致 谢

我的毕业设计是在指导老师的精心指导和严格要求下完成的。通过毕业设计,我丰富了自己的理论知识,极大地提高了动手实践能力,并对我自己的专业——电气工程及其自动化加深了了解,同时对MSP430系列单片机和LCD液晶显示器有了深入的了解,相信这对我今后的工作与学习将会有极大的帮助。

首先,我要对我的毕业设计指导教师致以诚挚的谢意!另外在设计中我还得到了同学的帮助,感谢你们的帮助。此外,我还要感谢我们电气班的所有同学。在几年的大学中,我们相互帮助、相互团结、相互督促,共同创造了一个良好的学习环境。

再一次对指导老师、同学以及所有关心和帮助过我的人表示衷心的感谢! 最后我还要感谢培养我长大含辛茹苦的父母,谢谢你们!

- 37 -

基于MSP430单片机的时钟设计

附 录

附录1 程序清单

//********************************LCD_1602.h**********************************

#ifndef __LCD_1602_test_h #define __LCD_1602_test_h

#include \"msp430x14x.h\"

#define SET_LCD_1602_EN P3OUT |= 0x04 //pin 2 #define CLR_LCD_1602_EN P3OUT &= ~0x04

#define SET_LCD_1602_RS P3OUT |= 0x01 //pin 0 #define CLR_LCD_1602_RS P3OUT &= ~0x01

#define SET_LCD_1602_RW P3OUT |= 0x02 //pin 1 #define CLR_LCD_1602_RW P3OUT &= ~0x02 #define LCD_I0 P2OUT

void LCD_delay(unsigned int i);

void LCD_en_command(unsigned char command); void LCD_en_dat(unsigned char temp); void LCD_init(void);

void LCD_set_xy( unsigned char x, unsigned char y );

void LCD_write_char( unsigned x,unsigned char y,unsigned char dat);

void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);

#endif

//********************************LCD_1602.c**********************************

#include \"LCD_1602.h\"

/********************************************************************/ void LCD_delay(unsigned int i) {

for(;i>0;i--); }

/********************************************************************/ void LCD_en_command(unsigned char command) {

P3DIR=0x07; P2DIR=0xFF;

CLR_LCD_1602_RS; CLR_LCD_1602_RW; LCD_I0=command;

- 38 -

本科生毕业设计说明书(2011)

SET_LCD_1602_EN; LCD_delay(50); CLR_LCD_1602_EN; }

/********************************************************************/ void LCD_en_dat(unsigned char dat) {

P3DIR=0x07; P2DIR=0xFF; SET_LCD_1602_RS; CLR_LCD_1602_RW; LCD_I0=dat;

SET_LCD_1602_EN; LCD_delay(100); CLR_LCD_1602_EN; }

/********************************************************************/ void LCD_set_xy( unsigned char x, unsigned char y ) {

unsigned char address; if (y == 0)

address = 0x80 + x; else

address = 0xc0 + x; LCD_en_command(address); }

/********************************************************************/ void LCD_write_char( unsigned x,unsigned char y,unsigned char dat) {

LCD_set_xy( x, y ); LCD_en_dat(dat); }

/********************************************************************/ void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) {

LCD_delay(200);

LCD_set_xy( X, Y ); while (*s) {

LCD_I0=*s;

LCD_en_dat(*s); s ++; } }

- 39 -

基于MSP430单片机的时钟设计

/********************************************************************/ void LCD_init(void) {

LCD_delay(2000);

//LCD_delay(20000);

P3DIR = BIT0 + BIT1 + BIT2; // LCD control bus

LCD_en_command(0x38); //8位接口,两行显示,5*7点阵 //LCD_en_command(0x38); //LCD_en_command(0x38); LCD_delay(200);

LCD_en_command(0x0c); //整体显示开,光标开,闪烁开 //LCD_en_command(0x0e); LCD_delay(200);

LCD_en_command(0x01); //清除显示 LCD_delay(1000);

LCD_en_command(0x06); //光标右移,AC+1,禁止滚动 //LCD_en_command(0x80); //设置DDRAM地址为80 }

/********************************************************************/ /*void main()

{ unsigned char s[]=\"abcdef\"; //unsigned char *p; //p=s;

LCD_init();

LCD_en_command(0x01); LCD_en_command(0x80); //LCD_delay(200);

LCD_write_string(0,1,s); LCD_write_string(8,1,s); //LCD_write_string(0,0,s);

// while(1) // {

// LCD_write_string(1,1,s); //LCD_write_char(0,0,'w'); // }

//LCD_set_xy( 0, 0 ); /* while (*p) {

LCD_I0=*p;

LCD_en_dat(*p); p++; }

- 40 -

本科生毕业设计说明书(2011)

//LCD_write_string(2,0,s); //LCD_write_char(8,1,'2'); }*/

/*****************************watch.c********************************/ #include #include \"LCD_1602.h\"

static unsigned char seconds = 0, minutes = 0, hours = 0x12; //unsigned char code[10]={'0','1','2','3','4','5','6','7','8','9'}; unsigned char code[16]= {'0','1','2','3','4','5','6','7','8','9','a','b',

'c','d','e','f'};

unsigned char BCD[6]={1,2,0,0,0,0}; unsigned char disp_BCD[6]={1,2,0,0,0,0}; unsigned char i=0; unsigned char j=0;

unsigned char s1[ ]=\"SET TIME\"; unsigned char s2[ ]=\"NOW TIME\";

unsigned char seg[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0xc1,0x1f,0x01,0x19}; /*****************************************************************/ void disp_led(void) {

unsigned char i=0; unsigned char temp=0x80; for(i=0;i<5;i++) {

P4DIR=0xFF; P5DIR=0xFF; P4OUT=temp; temp=temp>>1;

P5OUT=seg[disp_BCD[i]]; LCD_delay(500); } }

void incHours (void) {

- 41 -

基于MSP430单片机的时钟设计

hours = __bcd_add_short(hours, 0x01);

if (hours == 0x13)

hours = 0x01; // If hrs transition is 12 to 13, hrs = 1 }

/****************************************************************/ void incMinutes(void) {

minutes = __bcd_add_short(minutes, 0x01); if (minutes == 0x60) {

minutes = 0; //incHours(); } }

/******************************************************************/ void incSeconds(void) {

seconds = __bcd_add_short(seconds, 0x01); if (seconds == 0x60) {

seconds = 0; //minutes(); } }

/**********************************************************************/ void display_time(void) //conversion to display {

disp_BCD[0]=(hours&0xF0)>>4; disp_BCD[1]=hours&0x0F; disp_BCD[2]=(minutes&0xF0)>>4; disp_BCD[3]=minutes&0x0F; disp_BCD[4]=(seconds&0xF0)>>4;

- 42 -

本科生毕业设计说明书(2011)

disp_BCD[5]=seconds&0x0F; LCD_write_string(4,0,s2);

LCD_write_char(4,1,code[disp_BCD[0]]); LCD_write_char(5,1,code[disp_BCD[1]]); LCD_write_char(6,1,':');

LCD_write_char(7,1,code[disp_BCD[2]]); LCD_write_char(8,1,code[disp_BCD[3]]); LCD_write_char(9,1,':');

LCD_write_char(10,1,code[disp_BCD[4]]); LCD_write_char(11,1,code[disp_BCD[5]]); return; }

/*************************************************************/ void conv(void) {

hours=(BCD[0]<<4)|BCD[1]; minutes=(BCD[2]<<4)|BCD[3]; seconds=(BCD[4]<<4)|BCD[5]; LCD_set_xy(0,1);

LCD_write_char(4,1,code[BCD[0]]); LCD_write_char(5,1,code[BCD[1]]); LCD_write_char(6,1,':');

LCD_write_char(7,1,code[BCD[2]]); LCD_write_char(8,1,code[BCD[3]]); LCD_write_char(9,1,':');

LCD_write_char(10,1,code[BCD[4]]); LCD_write_char(11,1,code[BCD[5]]); return; }

/*************************************************************/ void init_key_Port(void) {

P1SEL=0; P1DIR=0xF0; P1OUT=0x00;

- 43 -

基于MSP430单片机的时钟设计

P1IE=0x0F; P1IES=0x0F; P1IFG=0xf0; _EINT(); return; }

/*****************************************************************/ unsigned char key(void) {

unsigned char x=0xff; P1DIR=0XF0;

P1OUT=0XE0; //扫描第一行 if((P1IN&0X0F)==0X0E) x=12; else

if((P1IN&0X0F)==0X0D) x=9; else

if((P1IN&0X0F)==0x0B) x=5; else

if((P1IN&0X0F)==0x07) x=1; else {

P1OUT=0XD0; //扫描第二行 if((P1IN&0X0F)==0X0E) x=13; else

if((P1IN&0X0F)==0X0D) x=0; else

if((P1IN&0X0F)==0x0B) x=6;

- 44 -

本科生毕业设计说明书(2011)

else

if((P1IN&0X0F)==0x07) x=2; else {

P1OUT=0XB0; //扫描第三行 if((P1IN&0X0F)==0X0E) x=14; else

if((P1IN&0X0F)==0X0D) x=10; else

if((P1IN&0X0F)==0x0B) x=7; else

if((P1IN&0X0F)==0x07) x=3; else

{P1OUT=0x70; //扫描第四行 if((P1IN&0X0F)==0X0E) x=15; else

if((P1IN&0X0F)==0X0D) x=11; else

if((P1IN&0X0F)==0x0B) x=8; else

if((P1IN&0X0F)==0x07) x=4; } } } P1OUT=0x00; return(x);

- 45 -

基于MSP430单片机的时钟设计

}

/*******************************************************************/ unsigned char keyj(void) {

unsigned char aa; P1DIR=0xF0;

P1OUT=0x00; aa=(P1IN&0X0F); return(aa); }

/******************************************************************/ void led(void) { unsigned int a; P6DIR = 0x80; for (a=0;a<=10;a++) {

unsigned int i;

P6OUT ^= 0x80; i = 20000; do (i--); while (i != 0); } }

#pragma vector=PORT1_VECTOR __interrupt void port1key(void) {

if(keyj()!=0X0f)

{ LCD_delay(300) ; //消抖动 if(keyj()!=0X0f) {

i=key();

if((i>=0)&&(i<=9)) { IE1 &=~WDTIE;

- 46 -

本科生毕业设计说明书(2011)

switch(j) { case 0 :

if(i<=1){BCD[j]=i; j++;} break; case 1 :

if(BCD[0]==0){BCD[j]=i; j++;} else if(i<=2){BCD[j]=i; j++;} break; case 2 :

if(i<=5){BCD[j]=i; j++;} break; case 3 :

BCD[j]=i; j++; LCD_set_xy(3,1); break; case 4 :

if(i<=5){BCD[j]=i; j++; } break; case 5 :

BCD[j]=i; j++; break; }

LCD_write_string(4,0,s1); conv(); }

else if(i==15) { j=0;

IE1 &=~WDTIE;

LCD_write_string(4,0,s1); }

else if(i>=10 &&i<15) {IE1 |= WDTIE;} if(j==6) { j=0;

IE1 |= WDTIE; } }

- 47 -

基于MSP430单片机的时钟设计

} P1IFG=0x00; }

#pragma vector=WDT_VECTOR __interrupt void watchdog_timer(void) {

seconds = __bcd_add_short(seconds, 0x01); if( seconds == 0x60 ) {

seconds = 0;

minutes = __bcd_add_short(minutes, 0x01); if( minutes == 0x60 ) {

minutes = 0;

hours = __bcd_add_short(hours, 0x01); if( hours == 0x13 ) {

hours = 0x01; } } }

display_time(); }

#pragma vector=TIMERA0_VECTOR __interrupt void ta1_isr(void) {

IE1 &= ~WDTIE; disp_led(); CCR0+=60000; IE1 |= WDTIE; }

/***********************************************************************/

- 48 -

本科生毕业设计说明书(2011)

void main(void) {

LCD_init(); P3DIR|=0x80; P3OUT&=0x7f; init_key_Port();

WDTCTL = WDT_ADLY_1000; // Set Watchdog Timer interval to ~30ms IE1 |= WDTIE; // Enable WDT interrupt TACTL=TASSEL0+TACLR; CCR0=60000; CCTL0=CCIE; TACTL|=MC0; _EINT();

//_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt

while(1) {

disp_led(); } }

/***********************************************************************/

- 49 -

基于MSP430单片机的时钟设计

附录2 系统原理图

盐城工学院 设计 审核 日期 尹 龙 2011.6 课 题名 称 图名 专业 学号 电气工程及自动化 班级 姓名 比例 图号 共2张 B M电气072 尹 龙 1:1 A4 第 2 张 0751402223 基于MSP430单片机的时钟设计 系统PCB图 - 50 -

本科生毕业设计说明书(2011)

附录3 系统PCB图

盐城工学院 设计 审核 日期 尹 龙 2011.6 课 题名 称 图名 专业 学号 电气工程及自动化 班级 姓名 比例 图号 共2张 B M电气072 尹 龙 1:1 A4 第 2 张 0751402223 基于MSP430单片机的时钟设计 系统PCB图 - 51 -

基于MSP430单片机的时钟设计

附录4 元器件清单

序号 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

- 52 -

元器件名称 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 C1 C2 C3 C4 C5 C6 JP1 U1 U2 U3 U4 U5 U6 X1 Y2 LCD D1 D2 型号或参数 470Ω 470Ω 470Ω 470Ω 470Ω 470Ω 470Ω 470Ω 1KΩ 1KΩ 1KΩ 1KΩ 100KΩ 470Ω 300Ω 10KΩ 104 220uF 220uF 104 12pF 12pF JTAG MSP430F149 74HC244 LED4 LED4 SPX1117 POW 32KHz 8MHz TC1602 LED LED 个数 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

因篇幅问题不能全部显示,请点此查看更多更全内容