整个系统通过单片机MSP430G2553控制DS18B20读取温度,采用LCD1602显示,温度传感器DS18B20与单片机之间通过串口进行数据传输.MSP430系列单片机具有超低功耗,且外围的整合性高,DS18B20只需一个端口即可实现数信,连接方便。
基于单片机的温度控制系统设计与实现
1 项目要求
此系统的主要功能:
● 可以测量一定摄氏度内的温度;
● 用液晶显示温度,精确到小数点后两位;
● 利用温度传感器(DS18B20)测量某一点环境温度;
● 至少有高、低两路限温控制输出接口控制外部电路。
● 高、低两路限温控制点可在一定范围内独立设置,通过发光二极管模拟显示其控制状态输出。
● 当温度达到高、低限温控制点发光报警;
● 提高温度测量精度,使分辨率不低于0.10C;
● 可以通过按键设置高、低两路限温控制点。
2项目分析和系统设计
此数字温度控制系统硬件部分利用了MSP430G2553芯片内部的ADC10功能配置,结合DS18B20温度传感器来测量环境中的温度,将所测数值在LCD1602串行显示;软件部分利用CCS软件来进行编译,并且根据实际需要来完成各模块程序的编写,再进行复杂的调试。
3 硬件设计
该温度控制系统在MSP430G2553芯片的功能配置和协调下,与其他模块搭建来完成。由MSP430控制温度传感器DS18B20实时测量环境中的温度,然后在LCD5110显示出来,当该温度超过了设定的最大或者最小温度值时,LED开始报警。
图3.1系统结构框图
3.1单片机选型模块
基于名为Launch Pad,MSP-EXP430G2低成本实验板是一款适用于TI最新MSP430G2XXX犀利产品的完整开发解决方案。基于USB的集成型仿真器可提供全系列MSP430G2XX器件开发应用所必备的所有软件、硬件。Lunch Pad具有集成的DIP目标插座,可支持多达20个引脚,从而使MSP430Value Line器件能够轻松插入LaunchPad实验板电路。
图3.2单片机选型模块图
3.2温度测量模块
温度测量传感器采用DALLAS公司DS18B20的单总线数字化温度传感器,测温范围为-55℃~125℃,可编程为9位~12位A/D转换精度,测温分辨率达到0.0625℃,采用寄生电源工作方式,CPU只需一根口线便能与DS18B20通信,占用CPU口线少,可节省大量引线和逻辑电路。接口电路如图3.3所示。
图3.3 DS18B20测量电路图
3.3 LCD液晶显示模块
LCD液晶显示模块采用LCD1602型号,性价比高,LCD1602可以显示32个字符,口相对简单。1602共16个管脚,但是编程用到的主要管脚不过三个,分别为:RS(数据命令选择端),R/W(读写选择端),E(使能信号);以后编程便主要围绕这三个管脚展开进行初始化,写命令,写数据。
以下具体阐述这三个管脚:
RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器。
R/W为读写选择,高电平进行读操作,低电平进行写操作。
E端为使能端,后面和时序联系在一起。
除此外,D0~D7分别为8位双向数据线。
其接线如图3.4所示
图3.4 LCD显示电路
3.4系统电源
整个电路采用USB电源,为所有的USB 外设提供了单一的易于使用的标准的连接类型,简化了USB 外设的设计。整个的USB 的系统只有一个端口和一个中断节省了系统资源。
4 软件设计4.1主程序
本系统整体工作主要由单片机程序控制实现,其工作过程为:由MSP430控制温度传感器DS18B20实时测量环境中的温度,然后在LCD1602显示出来,当该温度超过了设定的最大或者最小温度值时,LED开始报警。
程序流程图如下:
图4.2 温度测量子程序图
5 系统调试5.1硬件调试
主要根据系统框图和硬件原理设计进行原理的绘制、各参数的设置、电路板的制作,以及元器件的焊接等。具体如下:
5.1.1 各单元电路,确认各单元电路链接无误,尤其是关键元器件,一定要接保护电阻。
(1)在样机加电之前,首先用万用表等工具,根据硬件电器原理图和装配图仔细检查样机线路的正确性,并核对元器件的型号、规格和安装是否符合要求。应特别注意电源的走线,防止电源之间的短路和极性错误,电源连接是否正确测试LCD显示屏是否有输出,LCD显示屏上的温度的显示是否符合;
(2)运用MSP430单片机中简单的I/O口功能,优异在检查硬件是否正常工作时先检测单片机本身的I/O口设置,可以先不连接外部电路,使用单片机本身I/O口,测试程序是否正确,以免在软件调试中引起不必要的麻烦。
5.1.2 PCB设计注意事项:
在进行PCB设计时,必须遵守PCB设计的一般原则,并注意其要求。
(1)此系统采用的电阻和电容较多,注意在画PCB时注意各器件的封装,对照使用的实物选取封装,保证焊接硬件的正确性。
(2)此系统采用光敏电阻及较大的极性电容,介于成本的原因,采用的封装是是直插式的,在PCB设计时特别注意
(3)根据电路的模块布局,这样便于在出现问题时进行检查,尤其注意MSP430单片机系统中I/O口是否设置正确。
5.2程序调试
此程序设计中仅使用了MSP430单片机系统中I/O口资源,调试过程中,主要使用寄存器窗口,以及设置断点,观察系统程序主要实现对采集来的模拟信号进行模数转换,并对数字信号进行液晶显示,所以程序有采集模拟信号、DA转换和液晶显示三部分;在中断子程序设置断点,判断运行是否正确。在调试过程中,由局部到整体,判断程序可能出现的问题,认真分析逻辑,实现要求的功能,在简化程序。
5.2.1 CCSV5的打开步骤
- 右键Code Composer Studio v5快捷方式,左键打开。会出现如图5.2所示界面:
图5.1 Code Composer Studio v5软件加载界面
(2)加载完毕之后会有如图5.3所示界面出现:
图5.2 Code Composer Studio v5软件打开界面
(3)选择Project->Import Existing CCS Eclipse Project,导入程序文件夹中的工程;具体操作如图5.4:
图5.3 Code Composer Studio v5程序导入步骤图
5.2.2CCSV5的使用步骤
(1)CCS新建工程:
①首先打开CCS并确定工作区间,然后选择project-->New CCS Project
弹出图5.5对话框。,在简化程序。
图5.4创建新工程主界面
②在project name中输入新建工程名称turang。
③在Device部分中,Variant中选择MSP430G××× Family,芯片选择MSP430G2553,其余选择默认。
④选择空工程,然后单击Finish,完成新工程的创建。
⑤创建工程如图5.6所示:
图5.5ProjectExplorer界面
⑥然后选择File-->New-->Source File,新建一个C文件,并且命名为turang.C,并在工程名上右击选择Add Files,创建工程如图5.7:
图5.6 新建工程界面
(2)CCS调试:
①调试之前,先确定目标配置文件是否已经创建并且配置正确。
②首先进行工程编译:选择Project-->Build Project,编译目标工程。编译结果如图5.8所示,表示没有错误,可以进行下载调试,如果有错误,知道调试到没错误为止。
图5.7工程调试结果
③单击运行图标运行程序,可以观察显示的结果。在程序调试的过程中,也可通过设置断点来调试程序,选择需要设置断点的位置,右击鼠标选择Breakpoints-->Breakpoint,断点设置成功后显示图标可以通过双击该图标来取消该断点。程序运行的过程中还可以通过单步调试按钮进行调试。
5.3联合调试
整个系统的软硬件都完成后,需要进行联合调试,主要是针对系统设定的功能能否完成和完善进行调试。将电路线连接好,接入3V电源,LCD显示屏亮,且测得当前温度,如果当前温度超过给定的量程范围内LED等就会亮,此时就是发出警报,提示当前温度已超出给定温度范围。超出给定的温度(35°)LED灯就会亮,否则LED灯就会灭,如下图。
图5.8联合调试图
1
6项目演练
对于本设计,尚可以进一步进行如下设想:
使用按键控制设定的温度的高低,设计思路如下:
系统主要包括16位单片机MSP430、温度采集模块DS18B20、液晶显示模块LCD1602、键盘控制和执行机构等几个部分。设计思路如下:
系统总体方案设计框图如下:
图6.1系统结构框图
7项目总结
此系统单片机具有集成度高,通用性好,功能强,特别是体积小,重量轻,耗能低,可靠性高,抗干扰能力强和使用方便等独特优点,在数字、智能化方面有广泛的用途。430与51的最大区别在于430有很多的寄存器,较之51程序较为复杂。虽然与51单片机的组成都是差不多但还有很大的区别,就拿本次设计还说,虽说是之前是了解过还改用msp430设计还是有一点的难度,对于51单片机I/O口多,而现在我们用的msp430虽说是功能多,但编程起来还是很困难,可能是我知识的欠缺,之前所学的可能是最简单的,现在学习了这个16位的单片机还是有一点难度,不过我们还需多学习。
1
附录1电路设计原理图(参考)
1
附录2 PCB设计原理图(参考)
附录3 关键程序(参考)
- 主程序:
- void main()
- {
- WDTCTL=WDTPW+WDTHOLD; //关闭看门狗
- BCSCTL1=CALBC1_1MHZ; //BCSCTL1 Calibration Data for 1MHz
- DCOCTL=CALDCO_1MHZ; //DCOCTL Calibration Data for 1MHz
- BCSCTL2=SELM_1+DIVM_0; //设置MCLK为1MHZ
- // __enable_interrupt(); // 中断控制开启
-
- P1SEL&=0X00; //设置P1口为I/O模式
- P2SEL&=0X00; //设置P2口为I/O模式
- P1DIR|=0XFF; //设置P1口为输出模式
- P2DIR|= (BIT0+BIT1+BIT2+BIT4); //设置P2口为输出模式
-
- P1OUT&= 0X00; //P1口清零
- P2OUT&=~(BIT0+BIT1+BIT2); //P2.0 2.1 2.2 清零
- init();
- DS18B20_Init();
- //_EINT();
-
- while(1)
- {
- DS18B20_ReadTemp();
- xianshi();
- baojing ();
- }
- }
-
-
- 显示子程序:
- void xianshi()
- {
- float n; unsigned long value;
- n=Temper*1000;
- value = (unsigned long int)n;
-
- temp_display[1] = digit[value/100000]; //100位
- value = value%100000;
-
- temp_display[2] = digit[value/10000]; //10位
- value = value%10000;
-
- temp_display[3] = digit[value/1000]; //1位
- value = value%1000;
-
- temp_display[5] = digit[value/100]; //0.1位
- value = value%100;
-
- temp_display[6] = digit[value/10]; //0.01位
- value = value%10;
-
- temp_display[7] = digit[value/1]; //0.001位
- }
-
-
- 报警子程序:
- void baojing ()
- {
- t=35;
- if(Temper>t)
- {
-
- P2OUT|=BIT4;
- DispStr(0,0,LCDBuf3);
- DispStr(0,1,temp_display);
- Disp1Char(8,1,0XDF);
-
- }
- else
- {
- P2OUT&=~BIT4;
- DispStr(11,0," ");
- DispStr(0,0,LCDBuf1);
- DispStr(0,1,temp_display);
- Disp1Char(8,1,0XDF);
-
- }
- }
-
-
- 外延子程序:
- //按键中断函数
- #pragma vector=PORT2_VECTOR
- __interrupt void Port_2(void)
- {
-
-
- if((P2IN&BIT4)==0)
- {
- delay_ms(10);
- if((P2IN&BIT4)==0)
- {
- t=t-1;
- }
- P2IFG&=~((BIT4+BIT5));
- }
-
- if((P2IN&BIT5)==0)
- {
-
- delay_ms(10);
- if((P2IN&BIT5)==0)
- {
- t=t+1;
- }
- P2IFG&=~((BIT4+BIT5));
- }
- P2IFG&=~((BIT4+BIT5));
- }
|