数字转换分辨率。后五位一直是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; //打开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内部看门狗初始化
//***********************************************************************
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; } }
//*******************************************************************