MSP430单片机温度单片机课程设计.docx

上传人:b****1 文档编号:12713621 上传时间:2023-04-21 格式:DOCX 页数:28 大小:488.54KB
下载 相关 举报
MSP430单片机温度单片机课程设计.docx_第1页
第1页 / 共28页
MSP430单片机温度单片机课程设计.docx_第2页
第2页 / 共28页
MSP430单片机温度单片机课程设计.docx_第3页
第3页 / 共28页
MSP430单片机温度单片机课程设计.docx_第4页
第4页 / 共28页
MSP430单片机温度单片机课程设计.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

MSP430单片机温度单片机课程设计.docx

《MSP430单片机温度单片机课程设计.docx》由会员分享,可在线阅读,更多相关《MSP430单片机温度单片机课程设计.docx(28页珍藏版)》请在冰豆网上搜索。

MSP430单片机温度单片机课程设计.docx

MSP430单片机温度单片机课程设计

 

山东理工大学计算机学院

课程设计

单片机系统设计

 

班级计科1104

姓名

学号

指导教师李业德韩慧

 

二○一四年十一月日

 

课程设计任务书及成绩评定

 

课题名称_______温度测试系统设计_______

 

I、题目的目的和要求:

利用温度传感器和MSP430单片机设计一个温度测试系统,将测试结果(十进制)在LED上显示出来,并定义一个保持按键,当按下该键时,将当前测试值保持不变(按键不动作时为正常测量显示)。

温度显示格式为:

XXX℃。

 

II、设计进度及完成情况

日期

内容

11.10

选取题目,进行资料搜集和系统分析工作

11.14

进行单独程序设计以及完成单独接口电路

11.16

将全部程序综合并进行整体程序调试和连接整体接口电路

11.18

书写课程设计报告并写下相关问题总结

11.20

进行课程设计答辩,并打印上交

 

III、主要参考文献及资料

MSP430系列16位低功耗单片机原理及应用

DS18B20温度传感器的使用

智能仪器原理及应用

 

学科部主任李业德

 

Ⅵ、成绩评定:

设计成绩:

(教师填写)

指导老师:

(签字)

 

二○年月日

  

本次课程设计的目的和意义

课程设计是让我熟练掌握了课本上的一些理论知识,课程设计也是一个学习新知识、巩固加深所学课本理论知识的过程,它培养了我们综合运用知识的能力,独立思考和解决问题的能力。

加深我们对单片机原理与应用课程的理解

设计题目

温度测试系统设计:

利用温度传感器DS18B20和MSP430单片机设计一个温度测试系统,将测试结果(十进制)在LED上显示出来,并定义一个保持按键,当按下该键时,将当前测试值保持不变(按键不动作时为正常测量显示)。

温度显示格式为:

XXX℃。

系统的主要功能、作用以及主要技术性能指标

系统的主要功能是单片机实时从温度传感器读取温度数据信息,并在数码管显示,同时扫描是否有保持按键按下,如果按下则不再继续从温度传感器读取温度数据信息,保持温度值不变。

作用是可以实时读取环境中的温度信息,供用户查看,同时当用户需要观察某温度时,可以按下按键保持温度不变。

主要技术指标:

1.基本范围0℃-99℃

2.精度误差小于0.5℃

3.LED数码直读显示

4.扫描按键保持数值

总体设计方案、工作和组成原理

数字温度计设计方案论证

方案一

由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。

方案二

进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。

从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故采用了方案二。

主控制器

单片机采用MSP430单片机,处理能力强,功耗低,实现该功能仅需一个按键,8位数码管显示,以及DS18B20温度传感器。

显示电路:

显示电路采用8位共阴LED数码管,从P4口输出段码。

图一总体设计框图

温度传感器:

DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。

DS18B20的性能特点如下:

●独特的单线接口仅需要一个端口引脚进行通信;

●多个DS18B20可以并联在惟一的三线上,实现多点组网功能;

●无须外部器件;

●可通过数据线供电,电压范围为3.0~5.5V;

●零待机功耗;

●温度以9或12位数字;

●用户可定义报警设置;

●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;

●负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;

DS18B20内部结构框图如图2所示。

64位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。

温度报警触发器TH和TL,可通过软件写入户报警上下限。

DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。

高速暂存RAM的结构为8字节的存储器,结构如图3所示。

头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。

第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。

DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。

该字节各位的定义如图3所示。

低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率。

温度传感器连接如下图所示,DQ引脚与单片机的P5.3相连:

系统设计

接口电路设计,程序设计(程序框图和程序清单及注释)其他有关的理论分析和计算

接口电路设计:

主控制器MSP430

温度传感器

保持按键

数码管电路

程序框图:

总体设计流程图

读取温度传感器数据流程图

数码管温度显示

程序设计:

//*************************定义引脚**********************************

#defineLED8PORTP2OUT//P2接8个LED灯

#defineLED8SELP2SEL//P2接8个LED灯

#defineLED8DIRP2DIR//P2接8个LED灯

#defineDATAPORTP4OUT//数据口所在端口P4

#defineDATASELP4SEL//数据口功能寄存器,控制功能模式

#defineDATADIRP4DIR//数据口方向寄存器

#defineCTRPORTP6OUT//控制线所在的端口P6

#defineCTRSELP6SEL//控制口功能寄存器,控制功能模式

#defineCTRDIRP6DIR//控制口方向寄存器

#defineDCTR0P6OUT&=~BIT4//数码管段控制位信号置低

#defineDCTR1P6OUT|=BIT4//数码管段控制位信号置高

#defineWCTR0P6OUT&=~BIT3//数码管位控制位信号置低

#defineWCTR1P6OUT|=BIT3//数码管位控制位信号置高

#defineKEYPORTP1OUT//按键所在的端口P1

#defineKEYSELP1SEL//控制口功能寄存器,控制功能模式

#defineKEYDIRP1DIR//控制口方向寄存器

#defineKEYINP1IN//键盘扫描判断需要读取IO口状态值

ucharkey=0xFF;//键值变量

uinttemp_value;

floattruetemp;

uinttemp,A1,A2,A3;//定义的变量,显示数据处理

//*******************共阴数码管显示的断码表************************

uchartable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//*******************系统时钟初始化***************************

voidClock_Init()

{

uchari;

BCSCTL1&=~XT2OFF;//打开XT2振荡器

BCSCTL2|=SELM1+SELS;//MCLK为8MHZ,SMCLK为8MHZ

do{

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

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

_NOP();

}

while((IFG1&OFIFG)!

=0);//如果标志位1,则继续循环等待

IFG1&=~OFIFG;

}

//*******************MSP430内部看门狗初始化***********************

voidWDT_Init()

{

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

}

//*******************MSP430IO口初始化*****************************

voidPort_Init()

{

LED8SEL=0x00;//设置IO口为普通I/O模式,此句可省

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

LED8PORT=0xFF;//P2口初始设置为FF

DATASEL=0x00;//设置IO口为普通I/O模式,此句可省

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

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

CTRSEL=0x00;//设置IO口为普通I/O模式,此句可省

CTRDIR|=BIT3+BIT4+BIT2;//设置IO口方向为输出,控制口在P63,P64

CTRPORT=0xFF;//P6口初始设置为FF

KEYSEL=0x00;//设置IO口为普通I/O模式,此句可省

KEYDIR=0x0F;//高四位输入模式,低四位输出模式,外部上拉电阻

KEYPORT=0xF0;//初始值0xF0

}

//*************74HC573控制数码管动态扫描键值显示函数******************

voidDisplay_Key(ucharnum)

{

uchari,j;

j=0x01;//此数据用来控制位选

for(i=0;i<8;i++)//8个数码管依次显示

{

DCTR1;//控制数码管段数据的74HC573的LE管脚置高

WCTR1;//控制数码管位的74HC573的LE管脚置高

DATAPORT=~j;//设置要显示的位,也就是哪一个数码管亮

WCTR0;//锁存位数据,下面送上段数据以后,就显示出来了

DATAPORT=table[num];//送要显示的数据,这里是键值

DCTR0;//锁存段数据,数码管亮一个时间片刻

j=j<<1;//移位,准备进行下一位的显示

delay_us(500);//显示一个时间片刻,会影响亮度和闪烁性

}

Close_LED();//显示完8个数码管后关闭数码管显示,否则可能导致各个数码管亮度不一致

}

//*****************键盘扫描子程序,采用逐键扫描的方式******************

ucharKey_Scan(void)

{

ucharkey_check;

ucharkey_checkin;

key_checkin=KEYIN;//读取IO口状态,判断是否有键按下

key_checkin&=0xF0;//屏蔽掉低四位的不确定值

if(key_checkin!

=0xF0)//IO口值发生变化则表示有键按下

{

delay_ms(20);//键盘消抖,延时20MS

key_checkin=KEYIN;//再次读取IO口状态

if(key_checkin!

=0xF0)//确定是否真正的有键按下

{

key_check=KEYIN;//有键按下,读取端口值

switch(key_check&0xF0)//判断是哪个键按下

{

case0xE0:

key=1;break;

case0xD0:

key=2;break;

case0xB0:

key=3;break;

case0x70:

key=4;break;

}

}

}

else

{

key=0xFF;//无键按下,返回FF

}

returnkey;

}

//******74HC573控制数码管动态扫描显示函数,显示采集到的温度**************

voidDisplay_DS18B20(uintdata_b,uintdata_s,uintdata_g)

{

uchari,j;

j=0x01;//此数据用来控制位选

for(i=0;i<3;i++)//用后3位数码管来显示

{

DCTR1;

WCTR1;

DATAPORT=~j;

WCTR0;

j=(j<<1);

DATAPORT=0x00;//前5位都不显示,送数据00即可

DCTR0;

delay_ms

(2);

}

DCTR1;//开始显示第6位,即十位

WCTR1;

DATAPORT=~j;

WCTR0;

j=(j<<1);

//DATAPORT=table[A1];

DATAPORT=table[data_b];

DCTR0;

delay_ms

(1);

DCTR1;//开始显示个位

WCTR1;

DATAPORT=~j;

WCTR0;

j=(j<<1);

//DATAPORT=table[A2]|0x80;//显示小数点

DATAPORT=table[data_s]|0x80;//显示小数点

DCTR0;

delay_ms

(1);

DCTR1;//开始显示小数点后面的数据

WCTR1;

DATAPORT=~j;

WCTR0;

j=(j<<1);

//DATAPORT=table[A3];

DATAPORT=table[data_g];

DCTR0;

delay_ms

(1);

DCTR1;//开始显示温度单位

WCTR1;

DATAPORT=~j;

WCTR0;

j=(j<<1);

//DATAPORT=table[A3];

DATAPORT=0x63;

DCTR0;

delay_ms

(1);

DCTR1;//开始显示温度单位

WCTR1;

DATAPORT=~j;

WCTR0;

j=(j<<1);

//DATAPORT=table[A3];

DATAPORT=0x39;

DCTR0;

delay_ms

(1);

DCTR1;

WCTR1;

DATAPORT=0xff;

WCTR0;

}

//************************DS18B20初始化*******************************

unsignedcharDS18B20_Reset(void)//初始化和复位

{

unsignedchari;

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)

{

return0x00;

}

else

{

return0x01;

}

}

//**********************DS18B20读一个字节函数****************************

unsignedchards1820_read_byte(void)

{

unsignedchari;

unsignedcharvalue=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字节写入函数*/

voidds1820_write_byte(unsignedcharvalue)

{

unsignedchari;

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转换*/

voidds1820_start(void)

{

DS18B20_Reset();

ds1820_write_byte(0xCC);//勿略地址

ds1820_write_byte(0x44);//启动转换

}

//***********************DS8B20读取温度信息************************

unsignedintds1820_read_temp(void)

{

unsignedinti;

unsignedcharbuf[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的原因是为了把小数点后一位数据也转化为可以显示的数据

//比如温度本身为27.5度,为了在后续的数据处理程序中得到BCD码,我们先放大到275

//然后在显示的时候确定小数点的位置即可,就能显示出27.5度了

returni;

}

//*********************温度数据处理函数****************************

voiddata_do(uinttemp_d)

{

A3=temp_d%10;//分出百,十,和个位

temp_d/=10;

A2=temp_d%10;

A1=temp_d/10;

}

//***********************处理温度数据*********************

voidhandletemp()

{

ds1820_start();//启动一次转换

ds1820_read_temp();//读取温度数值

data_do(temp_value);//处理数据,得到要显示的值

truetemp=0.1*temp_value;

//judgeAlarm();//判断是否触发警报//已将其添加至按键程序

}

//***********************显示温度**********************

voidshowtemp()

{

ucharj;

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

{

Display_DS18B20(A1,A2,A3);//显示温度值

}

//delay_ms(100);//延时100ms

}

//***************************主程序************************

voidmain(void)

{

ucharflag1,flag2,flag3,flag4;

//uintkey_store=0x00;//没有按键按下时,默认显示1

WDT_Init();//看门狗初始化

Clock_Init();//时钟初始化

Port_Init();//端口初始化,用于控制IO口输入或输出

//Close_LED();

DS18B20_Reset();//复位D18B20

delay_ms(100);//延时100ms

while

(1)

{

Key_Scan();//键盘扫描,看是否有按键按下

if(key!

=0xff)//如果有按键按下,则显示该按键键值1~4

{

{

switch(key)

{

case1:

LED8PORT=0xfc;flag1=1;flag2=0;flag3=0;flag4=0;break;//对温度数据处理判断警报,然后显示,handletemp();showtemp();

case2:

LED8PORT=0xf3;flag1=0;flag2=1;flag3=0;flag4=0;break;//温度数据处理判断警报,关闭显示,节省电源,handletemp();Close_LED();

case3:

LED8PORT=0xcf;flag1=0;flag2=0;flag3=1;flag4=0;break;//关闭警报,SOUNDOFF;handletemp();

case4:

LED8PORT=0x3f;flag1=0;flag2=0;flag3=0;flag4=1;break;//测试警报SOUNDON;

}

}

}

else

{

LED8PORT&=0xff;//

if(flag1==1)

{

//handletemp();

showtemp();

}

if(flag2==1)

{

handletemp();

showtemp();

}

if(flag3==1

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1