《MSP430单片机温度单片机课程设计(共26页).doc》由会员分享,可在线阅读,更多相关《MSP430单片机温度单片机课程设计(共26页).doc(30页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上山东理工大学计算机学院课 程 设 计单片机系统设计班 级 计科1104 姓 名 学 号 指导教师 李业德 韩慧 二 一四 年 十一 月 日课程设计任务书及成绩评定课题名称_温度测试系统设计_I、 题目的目的和要求: 利用温度传感器和MSP430单片机设计一个温度测试系统,将测试结果(十进制)在LED上显示出来,并定义一个保持按键,当按下该键时,将当前测试值保持不变(按键不动作时为正常测量显示)。温度显示格式为:XXX 。II、 设计进度及完成情况日 期内 容11.10选取题目,进行资料搜集和系统分析工作11.14进行单独程序设计以及完成单独接口电路11.16将全部程序
2、综合并进行整体程序调试和连接整体接口电路11.18书写课程设计报告并写下相关问题总结11.20进行课程设计答辩,并打印上交III、 主要参考文献及资料MSP430系列16位低功耗单片机原理及应用DS18B20温度传感器的使用智能仪器原理及应用学科部主任 李业德、 成绩评定:设计成绩: (教师填写)指导老师: (签字)二 年 月 日 目录本次课程设计的目的和意义课程设计是让我熟练掌握了课本上的一些理论知识,课程设计也是一个学习新知识、巩固加深所学课本理论知识的过程,它培养了我们综合运用知识的能力,独立思考和解决问题的能力。加深我们对单片机原理与应用课程的理解设计题目温度测试系统设计:利用温度传感
3、器DS18B20和MSP430单片机设计一个温度测试系统,将测试结果(十进制)在LED上显示出来,并定义一个保持按键,当按下该键时,将当前测试值保持不变(按键不动作时为正常测量显示)。温度显示格式为:XXX 。系统的主要功能、作用以及主要技术性能指标系统的主要功能是单片机实时从温度传感器读取温度数据信息,并在数码管显示,同时扫描是否有保持按键按下,如果按下则不再继续从温度传感器读取温度数据信息,保持温度值不变。作用是可以实时读取环境中的温度信息,供用户查看,同时当用户需要观察某温度时,可以按下按键保持温度不变。主要技术指标:1. 基本范围0-992. 精度误差小于0.53. LED数码直读显示
4、4. 扫描按键保持数值总体设计方案、工作和组成原理数字温度计设计方案论证方案一 由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。方案二 进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简单
5、,故采用了方案二。主控制器单片机采用MSP430单片机,处理能力强,功耗低,实现该功能仅需一个按键,8位数码管显示,以及DS18B20温度传感器。显示电路: 显示电路采用8位共阴LED数码管,从P4口输出段码。图一总体设计框图温度传感器: DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现912位的数字值读数方式。DS18B20的性能特点如下: 独特的单线接口仅需要一个端口引脚进行通信; 多个DS18B20可以并联在惟一的三线上,实现多点组网功能; 无须外部器件; 可
6、通过数据线供电,电压范围为3.05.5; 零待机功耗; 温度以9或12位数字; 用户可定义报警设置; 报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件; 负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作; DS18B20内部结构框图如图2所示。64位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。温度报警触发器和,可通过软件写入户报警上下限。DS18B20温度传感器的内部存储器还包括一个高速暂存和一个非易失性的可电擦除的EERAM。高速暂存RAM的
7、结构为8字节的存储器,结构如图3所示。头2个字节包含测得的温度信息,第3和第4字节和的拷贝,是易失的,每次上电复位时被刷新。第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。该字节各位的定义如图3所示。低5位一直为1,是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率。温度传感器连接如下图所示,DQ引脚与单片机的P5.3相连:系统设计接口电路设计,程序设计(程序框图和程序清单及注释)其他有关的理论分析和计算接口
8、电路设计: 主控制器MSP430 温度传感器保持按键数码管电路程序框图:总体设计流程图读取温度传感器数据流程图数码管温度显示程序设计:/*定义引脚*#define LED8PORT P2OUT /P2接8个LED灯#define LED8SEL P2SEL /P2接8个LED灯#define LED8DIR P2DIR /P2接8个LED灯#define DATAPORTP4OUT /数据口所在端口P4#define DATASEL P4SEL /数据口功能寄存器,控制功能模式#define DATADIR P4DIR /数据口方向寄存器#define CTRPORT P6OUT /控制线所在
9、的端口P6#define CTRSEL P6SEL /控制口功能寄存器,控制功能模式#define CTRDIR P6DIR /控制口方向寄存器#define DCTR0 P6OUT &= BIT4 /数码管段控制位信号置低#define DCTR1 P6OUT |= BIT4 /数码管段控制位信号置高#define WCTR0 P6OUT &= BIT3 /数码管位控制位信号置低#define WCTR1 P6OUT |= BIT3 /数码管位控制位信号置高#define KEYPORT P1OUT /按键所在的端口P1#define KEYSEL P1SEL /控制口功能寄存器,控制功能模
10、式#define KEYDIR P1DIR /控制口方向寄存器#define KEYIN P1IN /键盘扫描判断需要读取IO口状态值uchar key=0xFF; /键值变量uint temp_value;float truetemp;uint temp,A1,A2,A3; /定义的变量,显示数据处理/*共阴数码管显示的断码表*uchar table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/ *系统时钟初始化*void Clock_Init() uchar i; BCS
11、CTL1&=XT2OFF; /打开XT2振荡器 BCSCTL2|=SELM1+SELS; /MCLK为8MHZ,SMCLK为8MHZ do IFG1&=OFIFG; /清楚振荡器错误标志 for(i=0;i100;i+) _NOP(); while(IFG1&OFIFG)!=0); /如果标志位1,则继续循环等待 IFG1&=OFIFG; /*MSP430内部看门狗初始化*void WDT_Init() WDTCTL = WDTPW + WDTHOLD; /关闭看门狗/*MSP430IO口初始化*void Port_Init() LED8SEL = 0x00; /设置IO口为普通I/O模式,此
12、句可省 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模式,
13、此句可省 KEYDIR = 0x0F; /高四位输入模式,低四位输出模式,外部上拉电阻 KEYPORT= 0xF0; /初始值0xF0/*74HC573控制数码管动态扫描键值显示函数*void Display_Key(uchar num) uchar i,j; j=0x01; /此数据用来控制位选 for(i=0;i8;i+) /8个数码管依次显示 DCTR1; /控制数码管段数据的74HC573的LE管脚置高 WCTR1; /控制数码管位的74HC573的LE管脚置高 DATAPORT=j; /设置要显示的位,也就是哪一个数码管亮 WCTR0; /锁存位数据,下面送上段数据以后,就显示出来了
14、 DATAPORT=tablenum; /送要显示的数据,这里是键值 DCTR0; /锁存段数据,数码管亮一个时间片刻 j=j1; /移位,准备进行下一位的显示 delay_us(500); /显示一个时间片刻,会影响亮度和闪烁性 Close_LED(); /显示完8个数码管后关闭数码管显示,否则可能导致各个数码管亮度不一致/*键盘扫描子程序,采用逐键扫描的方式*uchar Key_Scan(void) uchar key_check; uchar key_checkin; key_checkin=KEYIN; /读取IO口状态,判断是否有键按下 key_checkin&= 0xF0; /屏蔽
15、掉低四位的不确定值 if(key_checkin!=0xF0) /IO口值发生变化则表示有键按下 delay_ms(20); /键盘消抖,延时20MS key_checkin=KEYIN; /再次读取IO口状态 if(key_checkin!=0xF0) /确定是否真正的有键按下 key_check=KEYIN; /有键按下,读取端口值 switch (key_check & 0xF0) /判断是哪个键按下 case 0xE0:key=1;break; case 0xD0:key=2;break; case 0xB0:key=3;break; case 0x70:key=4;break; el
16、se key=0xFF; /无键按下,返回FF return key;/*74HC573控制数码管动态扫描显示函数,显示采集到的温度*void Display_DS18B20(uint data_b,uint data_s,uint data_g) uchar i,j; j=0x01; /此数据用来控制位选 for(i=0;i3;i+) /用后3位数码管来显示 DCTR1; WCTR1; DATAPORT=j; WCTR0; j=(j1); DATAPORT=0x00; /前5位都不显示,送数据00即可 DCTR0; delay_ms(2); DCTR1; /开始显示第6位,即十位 WCTR1
17、; DATAPORT=j; WCTR0; j=(j1); /DATAPORT=tableA1; DATAPORT=tabledata_b; DCTR0; delay_ms(1); DCTR1; /开始显示个位 WCTR1; DATAPORT=j; WCTR0; j=(j1); /DATAPORT=tableA2|0x80; /显示小数点 DATAPORT=tabledata_s|0x80; /显示小数点 DCTR0; delay_ms(1); DCTR1; /开始显示小数点后面的数据 WCTR1; DATAPORT=j; WCTR0; j=(j1); /DATAPORT=tableA3; DA
18、TAPORT=tabledata_g; DCTR0; delay_ms(1); DCTR1; /开始显示温度单位 WCTR1; DATAPORT=j; WCTR0; j=(j1); /DATAPORT=tableA3; DATAPORT=0x63; DCTR0; delay_ms(1); DCTR1; /开始显示温度单位 WCTR1; DATAPORT=j; WCTR0; j=(j480uS) if (i) return 0x00; else return 0x01; /*DS18B20读一个字节函数* unsigned char ds1820_read_byte(void) unsigned
19、 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; fo
20、r (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_tem
21、p(void) unsigned int i; unsigned char buf9; DS18B20_Reset(); ds1820_write_byte(0xCC); /勿略地址 ds1820_write_byte(0xBE); /读取温度 for (i = 0; i 9; i+) bufi = ds1820_read_byte(); i = buf1; i = 8; i |= buf0; temp_value=i; temp_value=(uint)(temp_value*0.625); /不是乘以0.0625的原因是为了把小数点后一位数据也转化为可以显示的数据 /比如温度本身为27.5
22、度,为了在后续的数据处理程序中得到BCD码,我们先放大到275 /然后在显示的时候确定小数点的位置即可,就能显示出27.5度了 return i;/*温度数据处理函数*void data_do(uint temp_d) A3=temp_d%10; /分出百,十,和个位 temp_d/=10; A2=temp_d%10; A1=temp_d/10;/*处理温度数据*void handletemp() ds1820_start(); /启动一次转换 ds1820_read_temp(); /读取温度数值 data_do(temp_value); /处理数据,得到要显示的值 truetemp=0.1
23、*temp_value; /judgeAlarm(); /判断是否触发警报/已将其添加至按键程序/*显示温度*void showtemp() uchar j; for(j=0;j100;j+) Display_DS18B20(A1,A2,A3); /显示温度值 /delay_ms(100); /延时100ms/*主程序*void main(void) uchar flag1,flag2,flag3,flag4; /uint key_store=0x00; /没有按键按下时,默认显示1 WDT_Init(); /看门狗初始化 Clock_Init(); /时钟初始化 Port_Init(); /
24、端口初始化,用于控制IO口输入或输出 /Close_LED(); DS18B20_Reset(); /复位D18B20 delay_ms(100); /延时100ms while(1) Key_Scan(); /键盘扫描,看是否有按键按下 if(key!=0xff) /如果有按键按下,则显示该按键键值14 switch(key) case 1: LED8PORT=0xfc;flag1=1;flag2=0;flag3=0;flag4=0;break;/对温度数据处理判断警报,然后显示,handletemp();showtemp(); case 2: LED8PORT=0xf3;flag1=0;f
25、lag2=1;flag3=0;flag4=0;break;/温度数据处理判断警报,关闭显示,节省电源,handletemp();Close_LED(); case 3: LED8PORT=0xcf;flag1=0;flag2=0;flag3=1;flag4=0;break;/关闭警报,SOUNDOFF;handletemp(); case 4: LED8PORT=0x3f;flag1=0;flag2=0;flag3=0;flag4=1;break;/测试警报SOUNDON; else LED8PORT&=0xff; / if(flag1=1) /handletemp(); showtemp()
26、; if(flag2=1) handletemp(); showtemp(); if(flag3=1) SOUNDOFF; handletemp(); if(flag4=1) SOUNDON; 设计总结对整个设计工作过程进行归纳和综合,对设计中所存在的问题和不足进行分析和总结,提出解决的方法、措施、建议和对这次设计实践的认识、收获和提高。在本次设计的过程中,我发现很多的问题,也学到了许多东西。虽然我以前也做过类似的课程设计,但这次设计真的让我长进了很多。本次单片机课程设计的重点就在于测温及按键编程软件算法的设计,其中有许多很巧妙的算法。我以前总是能看懂别人写的程序,但自己单独写时就会出现很多问题,经过这次锻炼我基本掌握了C语言编程的方法并在以前的基础上有所提高。 从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。作品的使用或操作说明作品上电后,按下复位按键,数码管开始显示当前环境温度,并实时刷新数据,按下保持按键后,温度会保持在当前温度不变,当再次按下显示按键后,温度又会开始实时显示。设计图纸或图表数码管显示按键温度传感器主控芯片专心-专注-专业