搜档网
当前位置:搜档网 › (完整版)MSP430单片机课程设计.doc

(完整版)MSP430单片机课程设计.doc

(完整版)MSP430单片机课程设计.doc
(完整版)MSP430单片机课程设计.doc

文华学院学生课程考查报告

考查课程: MSP430单片机应用设计

设计题目:基于MSP430单片机的温度测量仪设计

专业班级: **

学号: ****

姓名: **

指导教师: **

实验日期: 2016 年 5 月 8 日

基于 MSP430单片机的温度测量仪设计

文华学院

摘要

MSP430 单片机是德州公司最新开发的具有 16 位总线带 FLASH的单片机,由于它的性价比和集成度高,受到广大技术开发人员的青睐。它的可靠性能比较好,加强电干扰运行不受影响,适应工业级的运行环境,在各种行业中都占有重要的位置,越来越多的领域应用到以单片机为控制核心,用液晶显示作为显示终端的数字化控制设备,通过单片机对被控制对象进行智能控制。

MSP430 单片机将会在工程技术应用中得到广泛的应用。而且,它是通向 DSP 系列的桥梁,随着自动控制的低功耗化和高速化, MSP430系列单片机将会得到越来越多人的喜爱。

通过这次毕业设计,我对 MSP430单片机有了完整的了解,并且着重了解了MSP430F149芯片的原理图以及它的工作原理,对内部的硬件资源和自身的汇编

语法进行了实验,把它和 DS18B20温度传感器联系在一起实现了温度的测量以

及报警。

关键词: MSP430;超低功耗;单片机; DS18B20

Abstract

Texas MSP430 microcontroller is the latest development of a 16-bit

bus with FLASH MCU, due to its cost-effective and highly integrated, by

the majority of technology developers of all ages. Its reliability is

better, enhancing electrical interference unaffected, adapt industrial-grade operating environment, in a variety of industry occupies an important position in both, applied to more and more areas to microcontroller core, with LCD as a digital control display terminal

equipment, through the controlled object MCU intelligent control.

MSP430 microcontroller applications engineering technology will be

widely used. And, it is a bridge leading DSPfamily, with automatic control, low power consumption and high speed, MSP430 MCU will get more and

more people's favorite.

Through this graduation project, I have a complete understanding of the

MSP430 microcontroller, and focus on understanding the MSP430F149

chip schematic and it works, and the internal hardware resources and their own assembler syntax conducted experiments it and DS18B20 linked to the temperature sensor of the temperature-measuring andalarm.

Keywords: MSP430; ultra-low power; SCM; DS18B20

一、概述

1.1 引言

十七世纪是温度计诞生和发展的最初阶段,这个仪器几乎比任何其它仪器都得到更加广泛的应用。现代历史研究认为最早发明温度计的科学家是伽利略,他

在1592 年发明了最早的气体温度计,最早的液体温度计则是荷兰科学家华伦

海特制造出来的。

随着核能,宇航,冶金,低温,材料,微电子学和生物医学等方面的发展,对于温度测量控制的精度和范围提出了很高的要求,特别是对温度的测量不但要准确,而且需要读取数值时要更直观,更方便,这样的要求促进了温度测量和控制技术的迅速发展。在如今虽然水银温度计仍是各温度测量的计量标准,可是它的缺点则是刻度间隔通常很密,不能准确分辨,读数困难,而且它们的热容量比较大,这使得达到热平衡所需的时间非常长,因此更难读准,同时,玻璃管易碎,里边的水银有毒,使用起来非常不方便。

后来出现了代替水银的有,酒精温度计和金属簧片温度计。它们虽然无毒性,但是测量精度很低,只能作为一个大概的指示。后来接着又出现了热电阻温度计、热电偶温度计等温度计。之后随着大规模集成电路技术的提高,又出现了多种集成的数字化温度传感器。如今随着电子工业的发展,数字仪表的优点有反应速度快,操作简单,并且对使用环境要求不高,市场上出现越来越多的数字式温度计,纵观国际上现有的温度计的变化,总趋势是从模拟信号向数字信号转变,相应的体积也在不断的减小,一切向着数字化,智能化控制方向发展。

1.2 现状和发展状况

温度检测和控制是在工业生产过程中是比较典型的应用之一,随着传感器在生产生活中的广泛应用,利用新型总线式数字温度传感器来实现对温度的测试,并且让控制得到更快的开发。

在现在的生活中,所用到的家具设备,电器,工业产品等对温度的要求日益

增高,与此同时灵敏的温度控制报警系统已经成为了日常生活中必

不可少的产品。例如锅炉,冰箱的温控系统等,都需要用到了这一功能部件。

对此,我这次设计了基于 MSP430F149单片机的温度检测系统,来模拟现实中的温

度控制系统。此系统的设计和布线简单,体积小,重量轻,结构紧凑,抗干扰能力

比较强,扩展方便,性价比高,在工厂,大型仓库,智能化的建筑等领域的多点温

度检测系统中有广阔的应用前景。

所以在科学技术发展的今天,温度的检测,控制应用于许多行业,随着电子

工业的迅速发展,数字仪表的优点有反应速度快,操作简单,对使用环境要求不高,市场上出现了越来越多的数字式温度计,实践表明,低功耗,高精度的便携

式数字式温度计使用十分方便,工作状况稳定,待机时间比较长,已经开始得到

广泛应用。

1.3 课题研究的主要内容

本设计的目的是实现基于MSP430单片机的温度测量仪设计,主要内容有:

1 、可利用单片机芯片内温度传感器或DS18B20单线温度传感器。

2 、5 位数字显示(显示器可用LED数码管、 LCD1002或 LCD12664显示模块)。

二、系统方案设计

2.1 系统组成结构

该系统主要由 4 模块组成,其中包括 DS18B20温度传感器, MSP430F149微

控制器, LED显示模块,报警模块 4 部分组成。由温度传感器负责数据采集,经过

处理器转换后由 LED显示模块输出,同时报警模块负责温度报警的上下限,当温

度到达设定值时就会发生报警。其组成框图如下所示:

2.2 系统工作流程

首先设定温度报警的上下限值,然后由温度传感器进行温度数据的采集,当

微处理器检测到温度超过设定的范围值时就实行报警,提醒用户做相关操作。.

2.3 系统核心器件选型

MSP430F149单片机, DS18B20温度传感器,液晶显示器

2.4 系统硬件主要电路说明

2.4.1 数据采集系统电路

该系统采用美国DALLAS公司生产的单线数字温度传感器DS18B20来采集温度数据,作为单片机MSP430149的温度传感器,该芯片有很多优点,可把温度信号直接转换成串行数字信号供微机处理。由于每片 DS18B20含有唯一的硅串行数,从 DS18B20读出的信息或写入 DS18B20的信息,仅需要一根口线(单线接口)。由于该系统采用 DS18B20作为温度采集传感器,这部分电路就比较简单了,下图为温度采集电路。

DS18B20的读写时序和测温原理和 DS1820相同,只是得到的温度值的位数

因分辨率不同而不同, DS18B20的测温过程中温度的变化对晶振的振荡频率影响

非常的小,会产生脉冲信号送到计数器 1,而且是固定的频率。但高温度的晶振的

振荡频率就会随着温度的变化而产生明显的改变搞温度的晶振所产生的频率会

做为计数器 2 的脉冲输入。计数器 1 和温度寄存器被预置在-55℃所对应的一个基数值。计数器 1 对低温度系数晶振产生的脉冲信号进行减法计数,当计数器 1 的预置值减到 0 时,温度寄存器的值将加 1,计数器 1 的预置将重新被装入,计数器 1 重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数

器2 计数到 0 时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测

温度。

高速缓存器存储器包含一个高速暂存 RAM和一个非易失性的可电擦除的

EP2RAM。配置寄存器为高速缓存器中的第五个字节,它的内容用于确定温度值的

数字转换分辨率。后五位一直是1,TM是测试模式位,用于设置DS18B20在工作模式还是测试模式,在DS18B20出厂时被设置为0,用户不需要去改动,R1 和R0决定温度转换的精度位数 [6] 。

2.4.2 PL2303下载电路

PL2303器件内置 USB功能控制器, USB 收发器,振荡器和带有全部调制解调器控制信号的 UART,所以我们只需要外接几个电容就可实现 RS232信号与 USB 信号的转换,这样能够方便我们嵌入到各种设备当中。这些信息的转换全部由器件自身完成,不需要我们自己动手操作。

2.4.3 报警模块蜂鸣器电路

报警处埋模块相当简单,这里只是简单的在一个I/O 口上送出数据来驱动蜂鸣器,该模块包括数据产生和初始化端口两个部分,数据的产生部分主要是在输出端口产生数据,这里不是简单的一个高电平或者是低电平的问题,而是要有一定频率的数据才可以,因为只有是交流信号才能够让蜂鸣器发出声。而不同的周期信号可以得到不同的频率,则可以根据信号处理的知识来进行分析 [7] 。

2.4.4 LCD1602 显示模块电路

液晶显示 1602 利用的是液晶的物理性质,由电压控制其显示区域,可以显

示图形,只要有电源就可以显示图形。液晶显示装置有这不一般的厚度薄,适用于大规模集成电路的直接驱动,易于实现全彩色显示,这已被广泛应用于笔记本电脑,数码相机, CDA移动通信工具。在单片机系统中应用晶液显示器作为输出器件有以下几个优点:

1、显示质量高:由于显示器在每一个点在收到信号之后就一直保持那种色

彩和亮度,恒定发光,而不像显示器那样出现不断刷新的亮点。所以液晶显示器的画面质量很高,一般不会出现闪烁的现象,比传统的显示器画面要胜出一筹。

2、数字式接口:显示器全部是数字的,和其他单片机比起来更加的简单

可靠,操作则也很方便。

3、体积很小,重量很轻, i 一般的传统的显示器轻上很多。而液晶显示器通

过电极控制液晶内部的分子状态,从而达到显示的目的 [8] [9] 。

4、功耗低:相对与其他的单片机来说,液晶显示器的功耗主要消耗在驱动

IC 上,其他的则消耗在了内部电极上,因此消耗的电量比其它的传统显示器要

少得多。

三、工作原理

本设计的原理是 : 温度采集系统主要通过单线数字温度传感器DS18B20采集得到温度数据, MSP430F149作为 CPU从温度传感器读取数据,将得到的数据进

行判断然后做相应处理,比如显示或报警。温度传感器通过某种关系的换算,就可以得到温度传感器的输出电压,这样单片机通过模拟口采集得到传感器的输出

电压。由于 MSP430F149片内集成了 A/D 转换通道,这样可以直接将单片机的A/D 输入通道和传感器的模拟电压输出通道相连接另外系统通过键盘输入来完成对

报警温度上下限的设置,通过显示电路将得到的数据显示出来,当超过设定值时则会报警。该系统主要有电源及复位模块,温度传感器采集模块,温度报警模块和显示模块,分别有 P1.0-P1.7 , RESET,P2.5 ,P2.6 ,P4.0-P4.7 控制。

整个系统具有结构简单等特点。温度传感器的采集模块和单片机的数模转换

的通道连接,这样可以使得采集模块的设计简单化,从而使得设计的程序和模块

简单易懂。其中温度采集和显示模块的很多运算功能是通过单片机的 Pl 口来实现的,由于 Pl 口中断功能,所以实现起来非常容易,并且也非常适合软件编程。电源及复位模块主要是为整个系统提供可靠的电源,另外考虑到系统工作需要有复位功能,因此也为系统提供复位信号。

四、软件设计

程序:

include //延时函数

#define CPU_F ((double)8000000) //外部高频晶振8MHZ

#define CPU_F ((double)32768) //外部低频晶振32.768KHZ

#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))

#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

//自定义数据结构

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

//DS18B20 控制脚,单脚控制

#define DQ_IN P1DIR &= ~BIT6 // DS18B20 接单片机 P17口#define DQ_OUT P1DIR |= BIT6 // 设置输出

#define DQ_CLR P1OUT &= ~BIT6 // 置低电平

#define DQ_SET P1OUT |= BIT6 // 置高电平

#define DQ_R P1IN & BIT6 // 读电平

#define wei_h P5OUT |=BIT5 // 置高电平

#define wei_l P5OUT &=~BIT5 // 置低电平

#define duan_h P6OUT |=BIT6 // 置高电平

#define duan_l P6OUT &=~BIT6 // 置低电平

int temp_value;

int temp; // 定义的变量 , 显示数据处理

int A1,A2,A3;

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

****

// 系统时钟初始化,外部 8M晶振

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

****

void Clock_Init()

{

uchar i;

BCSCTL1&=~XT2OFF; BCSCTL2|=SELM1+SELS; //

//MCLK

打开XT2振荡器

为 8MHZ, SMCLK

8MHZ

do{

IFG1&=~OFIFG; // 清楚振荡器错误标志

for(i=0;i<100;i++)

_NOP();

}

while((IFG1&OFIFG)!=0); // 如果标志位1,则继续循环等待IFG1&=~OFIFG;

}

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

****

// MSP430 内部看门狗初始化

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

****

void WDT_Init()

{

WDTCTL = WDTPW + WDTHOLD;//关闭看门狗

}

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

******

// 初始化 IO 口子程序

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

******

void Port_Init()

{

P5DIR = 0xFF;//设置IO口方向为输出

P4DIR = 0xFF;//P4口初始设置为FF

P6DIR = 0xFF;

}

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

******

//DS18B20初始化

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

******

unsigned char DS18B20_Reset(void)//初始化和复位{

unsigned char i;

DQ_OUT;

DQ_CLR;

delay_us(500);// 延时 500uS(480-960)

DQ_SET;

DQ_IN;

delay_us(80);//延时80uS

i = DQ_R;

delay_us(500);// 延时 500uS(保持 >480uS)

if (i)

{

return 0x00;

}

else

{

return 0x01;

}

}

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

******

// DS18B20读一个字节函数

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

unsigned char ds1820_read_byte(void)

{

unsigned char i;

unsigned char value = 0;

for (i = 8; i != 0; i--)

{

value >>= 1;

DQ_OUT;

DQ_CLR;

delay_us(4); //* 延时4uS

DQ_SET;

DQ_IN;

delay_us(10); //* 延时10uS

if (DQ_R)

{

value|=0x80;

}

delay_us(60); //* 延时60uS

}

return(value);

}

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

// 向 18B20写一个字节函数

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

/*DS18B20 字节写入函数 */

void ds1820_write_byte(unsigned char value)

{

unsigned char i;

for (i = 8; i != 0; i--)

{

DQ_OUT;

DQ_CLR;

delay_us(4);//延时4uS

if (value & 0x01)

{

DQ_SET;

}

delay_us(80); //延时80uS

DQ_SET; // 位结束

value >>= 1;

}

}

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

//发送温度转换命令

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

/* 启动 ds1820 转换 */

void ds1820_start(void)

{

DS18B20_Reset();

ds1820_write_byte(0xCC); ds1820_write_byte(0x44); //

//

勿略地址

启动转换

}

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

// DS8B20读取温度信息

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

unsigned int ds1820_read_temp(void)

{

unsigned int i;

unsigned char buf[9];

DS18B20_Reset();

ds1820_write_byte(0xCC); ds1820_write_byte(0xBE); //

//

勿略地址

读取温度

for (i = 0; i < 9; i++)

{

buf[i] = ds1820_read_byte();

}

i = buf[1];

i <<= 8;

i |= buf[0];

temp_value=i;

temp_value=(uint)(temp_value*0.625);

//不是乘以 0.0625 的原因是为了把小数点后一位数据也转化为可以显示的数据return i;

}

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

******

//温度数据处理函数

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

******

void data_do(int temp_d)

{

int A2t;

A1=temp_d/100; // 分出百,十,和个位 A2t=temp_d%100;

A2=A2t/10;

A3=A2t%10;

}

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

****

//主程序

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

****

void main(void)

{

const unsigned char seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; const unsigned char

zww[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};

uchar j;

WDT_Init(); Clock_Init(); Port_Init();

//

//

//

看门狗初始化

时钟初始化

端口初始化,用于控制IO 口

输入或输出

DS18B20_Reset(); //复位D18B20 while(1)

{

ds1820_start();

ds1820_read_temp(); //

//

启动一次转换

读取温度数值

data_do(temp_value); //

if(A1==zww[0]) A1=seg[0]; // 处理数据,得到要显示的值

以下将 DS18B20反馈的数值换成数码管的

字符编码以显示

else if(A1==zww[1]) A1=seg[1]; else if(A1==zww[2]) A1=seg[2];

else if(A1==zww[3]) A1=seg[3]; else if(A1==zww[4]) A1=seg[4]; else if(A1==zww[5]) A1=seg[5]; else if(A1==zww[6]) A1=seg[6]; else if(A1==zww[7]) A1=seg[7]; else if(A1==zww[8]) A1=seg[8]; else if(A1==zww[9]) A1=seg[9]; else A1=A1;

if(A2==zww[0]) A2=seg[0]; else if(A2==zww[1]) A2=seg[1]; else if(A2==zww[2]) A2=seg[2]; else if(A2==zww[3]) A2=seg[3]; else if(A2==zww[4]) A2=seg[4]; else if(A2==zww[5]) A2=seg[5]; else if(A2==zww[6]) A2=seg[6]; else if(A2==zww[7]) A2=seg[7]; else if(A2==zww[8]) A2=seg[8]; else if(A2==zww[9]) A2=seg[9]; else A2=A2;

if(A3==zww[0]) A3=seg[0]; else if(A3==zww[1]) A3=seg[1]; else if(A3==zww[2]) A3=seg[2]; else if(A3==zww[3]) A3=seg[3]; else if(A3==zww[4]) A3=seg[4]; else if(A3==zww[5]) A3=seg[5]; else if(A3==zww[6]) A3=seg[6]; else if(A3==zww[7]) A3=seg[7]; else if(A3==zww[8]) A3=seg[8]; else if(A3==zww[9]) A3=seg[9]; else A3=A3;

for(j=0;j<8;j++)

{

P4OUT=A1;

duan_h;

duan_l;

P4OUT=0Xfe;

wei_h;

wei_l;

delay_ms(0.4);

P4OUT=A2+BIT7;

duan_h;

duan_l;

P4OUT=0xfd;

wei_h;

wei_l;

delay_ms(0.4);

P4OUT=A3;

duan_h;

duan_l;

P4OUT=0xfb;

wei_h;

wei_l;

delay_ms(0.4);

P4OUT=0x39;

duan_h;

duan_l;

P4OUT=0xf7;

wei_h;

wei_l;

delay_ms(0.4);

P4OUT=0x00; //缺少该句,数码管会有微弱重影,有该句无重影

duan_h;

duan_l;

}

}

}

五、系统调试

调试步骤:

(1)通过“ IAR For MSP430”软件导入 C语言程序,下载到实验板上进行相关调试。如下图所示:

(2)用手在其周围扇风,使其周围温度降低,则发现温度示数减小,如下图所示:

( 3)用手捂住使其温度升高,如图所示:

六、结束语

6.1 遇到的问题及解决方案

调试时,系统刚开始启动就进入死循环,这个原因我们分析得知是由于刚开

始温度传感器还没来得及感测周围温度,相当于实际的温度值是 0,肯定小于原来预定的下限,从而进入死循环,最后在主程序前加一个等待延时程序,就解决了这个问题。

6.2 心得体会

MSP430单片机课程设计这门课,让我们充分的得到了锻炼,只有实践才能够将我们的所学有用武之地。在实验的开始,我们就开始要学习一个完全陌生的软

件 IAR,并且让我们认识到了不是所有的单片机都需要 Keil 软件来变程序的, IAR 软件让我们有了全新的认识,并且在短时间内学会了简单的运用它。 MSP单片机是我们第一次接触,但是我们曾学过 51 单片机的课设,所以自认为能够运

用自如,结果在实验的过程中就发生了很多问题,代码的编写,每种单片机对应的代码虽然大同小异,但是不小心仔细一些,就会出现很多错误,所以要运用课

上所学,使我们所学有所用,并结合到实践中去;其次小组的配合分工,使我们

更加有效率的做好每一个实验。

总的来说,这次的实验让我们更加深入的了解了 MSP430单片机的功能和特点,也体会到了团结合作的乐趣与激情,收获颇多。

七、参考文献

1、沈建华,杨艳琴,翟骁曙 . 《 MSP430系列 16 位超低功耗单片机原理与

应用》 . 北京:清华大学出版社, 2004

2、李维,郭强。《液晶显示应用技术》。电子工业出版社,2000

3、郑敏。《 DS18B20温度传感器在温度大枷多路测控技术中的应用》。四川 : 鄂州大学电子工程系, 520081

4、马云峰。《单片机与数字温度传感器 DS18B20的接口技术》。山东:潍

坊学院信息与控制工程系, 261041

5、梅丽凤。《基于 MSP430控制的液晶显示屏设计与实现》。辽宁工业大学信息科学与工程学院, 2007

6、李元斌。《DS18B20数字传感器温度检测显示系统》。湖北 : 华中科技大学生命学院试验中心, 430074

1双灯交替闪烁

程序设计:

#include

void delay(unsigned int n)

{

do(n--);

while(n!=0);

}

void main()

{WDTCTL=WDTPW+WDTHOLD; P2DIR=0xff;

P2OUT=0xfe;

while(1)

{

delay(30000);

P2OUT<<=1;

P2OUT|=0x01;

if(P2OUT==0x7f)

{

delay(30000);

P2OUT=0xbf;

}

}

}

实验结果:

2 流水灯轮流闪烁

程序设计:

#include

void delay(unsigned int n)

{

do(n--);

while(n!=0);

相关主题