基于51单片机的电子温度计系统的设计与实现

设计一个基于51单片机的电子温度计系统,其采用STC12C5A60S2芯片作为控制中心,DS18B20温度传感器为测温元件,LCD为显示器件。硬件设计部分包括温度传感电路设计、温度控制电路设计及显示电路设计;软件设计部分包括主程序设计、读温度子程序设计、温度转换命令子程序和计算温度子程序设计。根据设计方案,设计出来的温度计能实现温度采集和显示功能,能测量0 ~100℃之间的温度,测量精度为0.5℃。能根据需要任意设定上下限,使用方便,操作简单,具有高精度、高准确率、体积小和功耗低等优点。

ds18b20temp.h

#ifndef __DS18B20_TEMP_H_
#define __DS18B20_TEMP_H_

#include<reg52.h>
//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint 
#define uint unsigned int
#endif

//--定义使用的IO口--//
sbit DSPORT=P3^7;

//--声明全局函数--//
void Delay1ms(uint );
uchar Ds18b20Init();
void Ds18b20WriteByte(uchar com);
uchar Ds18b20ReadByte();
void  Ds18b20ChangTemp();
void  Ds18b20ReadTempCom();
int Ds18b20ReadTemp();

#endif

lcd1602.h

#ifndef __LCD1602_H_
#define __LCD1602_H_
/**********************************
当使用的是4位数据传输的时候定义,
使用8位取消这个定义
**********************************/
//#define LCD1602_4PINS

/**********************************
包含头文件
**********************************/
#include<reg52.h>

//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint 
#define uint unsigned int
#endif

/**********************************
PIN口定义
**********************************/
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;

/**********************************
函数声明
**********************************/
/*在51单片机12MHZ时钟下的延时函数*/
void Lcd1602_Delay1ms(uint c);   //误差 0us
/*LCD1602写入8位命令子函数*/
void LcdWriteCom(uchar com);
/*LCD1602写入8位数据子函数*/	
void LcdWriteData(uchar dat)	;
/*LCD1602初始化子程序*/		
void LcdInit();						  

#endif

ds18b20temp.c

#include"ds18b20temp.h"
/*******************************************************************************
* 函 数 名         : Delay1ms
* 函数功能		   : 延时函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void Delay1ms(uint y)
{
	uint x;
	for( ; y>0; y--)
	{
		for(x=110; x>0; x--);
	}
}
/*******************************************************************************
* 函 数 名         : Ds18b20Init
* 函数功能		   : 初始化
* 输    入         : 无
* 输    出         : 初始化成功返回1,失败返回0
*******************************************************************************/

uchar Ds18b20Init()
{
	uchar i;
	DSPORT = 0;			 //将总线拉低480us~960us
	i = 70;	
	while(i--);//延时642us
	DSPORT = 1;			//然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
	i = 0;
	while(DSPORT)	//等待DS18B20拉低总线
	{
		Delay1ms(1);
		i++;
		if(i>5)//等待>5MS
		{
			return 0;//初始化失败
		}
	
	}
	
	return 1;//初始化成功
}

/*******************************************************************************
* 函 数 名         : Ds18b20WriteByte
* 函数功能		   : 向18B20写入一个字节
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void Ds18b20WriteByte(uchar dat)
{
	uint i, j;

	for(j=0; j<8; j++)
	{
		DSPORT = 0;	     	  //每写入一位数据之前先把总线拉低1us
		i++;
		DSPORT = dat & 0x01;  //然后写入一个数据,从最低位开始
		i=6;
		while(i--); //延时68us,持续时间最少60us
		DSPORT = 1;	//然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
		dat >>= 1;
	}
}
/*******************************************************************************
* 函 数 名         : Ds18b20ReadByte
* 函数功能		   : 读取一个字节
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/


uchar Ds18b20ReadByte()
{
	uchar byte, bi;
	uint i, j;	
	for(j=8; j>0; j--)
	{
		DSPORT = 0;//先将总线拉低1us
		i++;
		DSPORT = 1;//然后释放总线
		i++;
		i++;//延时6us等待数据稳定
		bi = DSPORT;	 //读取数据,从最低位开始读取
		/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
		byte = (byte >> 1) | (bi << 7);						  
		i = 4;		//读取完之后等待48us再接着读取下一个数
		while(i--);
	}				
	return byte;
}
/*******************************************************************************
* 函 数 名         : Ds18b20ChangTemp
* 函数功能		   : 让18b20开始转换温度
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void  Ds18b20ChangTemp()
{
	Ds18b20Init();
	Delay1ms(1);
	Ds18b20WriteByte(0xcc);		//跳过ROM操作命令		 
	Ds18b20WriteByte(0x44);	    //温度转换命令
	//Delay1ms(100);	//等待转换成功,而如果你是一直刷着的话,就不用这个延时了
   
}
/*******************************************************************************
* 函 数 名         : Ds18b20ReadTempCom
* 函数功能		   : 发送读取温度命令
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void  Ds18b20ReadTempCom()
{	

	Ds18b20Init();
	Delay1ms(1);
	Ds18b20WriteByte(0xcc);	 //跳过ROM操作命令
	Ds18b20WriteByte(0xbe);	 //发送读取温度命令
}
/*******************************************************************************
* 函 数 名         : Ds18b20ReadTemp
* 函数功能		   : 读取温度
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

int Ds18b20ReadTemp()
{
	int temp = 0;
	uchar tmh, tml;
	Ds18b20ChangTemp();			 	// 先写入转换命令
	Ds18b20ReadTempCom();			// 然后等待转换完后发送读取温度命令
	tml = Ds18b20ReadByte();		// 读取温度值共16位,先读低字节
	tmh = Ds18b20ReadByte();		// 再读高字节
	temp = tmh;
	temp <<= 8;
	temp |= tml;
	return temp;
}


lcd1602.h

#include "lcd1602.h"

/*******************************************************************************
* 函 数 名         : Lcd1602_Delay1ms
* 函数功能		   : 延时函数,延时1ms
* 输    入         : c
* 输    出         : 无
* 说    名         : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/

void Lcd1602_Delay1ms(uint c)   //误差 0us
{
    uchar a,b;
	for (; c>0; c--)
	{
		 for (b=199;b>0;b--)
		 {
		  	for(a=1;a>0;a--);
		 }      
	}
    	
}

/*******************************************************************************
* 函 数 名         : LcdWriteCom
* 函数功能		   : 向LCD写入一个字节的命令
* 输    入         : com
* 输    出         : 无
*******************************************************************************/
#ifndef 	LCD1602_4PINS	  //当没有定义这个LCD1602_4PINS时
void LcdWriteCom(uchar com)	  //写入命令
{
	LCD1602_E = 0;     		  // 使能
	LCD1602_RS = 0;	          // 选择发送命令
	LCD1602_RW = 0;	          // 选择写入
	
	LCD1602_DATAPINS = com;   //放入命令
	Lcd1602_Delay1ms(1);	  //等待数据稳定

	LCD1602_E = 1;	          //写入时序
	Lcd1602_Delay1ms(5);	  //保持时间
	LCD1602_E = 0;
}
#else 
void LcdWriteCom(uchar com)	  //写入命令
{
	LCD1602_E = 0;	 //使能清零
	LCD1602_RS = 0;	 //选择写入命令
	LCD1602_RW = 0;	 //选择写入

	LCD1602_DATAPINS = com;	//由于4位的接线是接到P0口的高四位,所以传送高四位不用改
	Lcd1602_Delay1ms(1);

	LCD1602_E = 1;	 //写入时序
	Lcd1602_Delay1ms(5);
	LCD1602_E = 0;

	LCD1602_DATAPINS = com << 4; //发送低四位
	Lcd1602_Delay1ms(1);

	LCD1602_E = 1;	 //写入时序
	Lcd1602_Delay1ms(5);
	LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名         : LcdWriteData
* 函数功能		   : 向LCD写入一个字节的数据
* 输    入         : dat
* 输    出         : 无
*******************************************************************************/		   
#ifndef 	LCD1602_4PINS		   
void LcdWriteData(uchar dat)			//写入数据
{
	LCD1602_E = 0;			// 使能清零
	LCD1602_RS = 1;			// 选择输入数据
	LCD1602_RW = 0;			// 选择写入

	LCD1602_DATAPINS = dat; // 写入数据
	Lcd1602_Delay1ms(1);

	LCD1602_E = 1;   		// 写入时序
	Lcd1602_Delay1ms(5);  	// 保持时间
	LCD1602_E = 0;
}
#else
void LcdWriteData(uchar dat)//写入数据
{
	LCD1602_E = 0;	  //使能清零
	LCD1602_RS = 1;	  //选择写入数据
	LCD1602_RW = 0;	  //选择写入

	LCD1602_DATAPINS = dat;	//由于4位的接线是接到P0口的高四位,所以传送高四位不用改
	Lcd1602_Delay1ms(1);

	LCD1602_E = 1;	  //写入时序
	Lcd1602_Delay1ms(5);
	LCD1602_E = 0;

	LCD1602_DATAPINS = dat << 4; //写入低四位
	Lcd1602_Delay1ms(1);

	LCD1602_E = 1;	  //写入时序
	Lcd1602_Delay1ms(5);
	LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名       : LcdInit()
* 函数功能		 : 初始化LCD屏
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/		   
#ifndef		LCD1602_4PINS
void LcdInit()						  //LCD初始化子程序
{
 	LcdWriteCom(0x38);  //开显示,且显示两行
	LcdWriteCom(0x0c);  //开显示不显示光标
	LcdWriteCom(0x06);  //写一个指针加1
	LcdWriteCom(0x01);  //清屏
	LcdWriteCom(0x80);  //设置数据指针起点
}
#else
void LcdInit()			 // LCD初始化子程序
{
	LcdWriteCom(0x32);	 // 将8位总线转为4位总线
	LcdWriteCom(0x28);	 // 在四位线下的初始化
	LcdWriteCom(0x0c);   // 开显示不显示光标
	LcdWriteCom(0x06);   // 写一个指针加1
	LcdWriteCom(0x01);   // 清屏
	LcdWriteCom(0x80);   // 设置数据指针起点
}
#endif

 

main.c

#include "reg52.h"			 	// 此文件中定义了单片机的一些特殊功能寄存器
#include "ds18b20temp.h"	
#include "lcd1602.h"

sbit BEEP= P1^7;

typedef unsigned int u16;	  	// 对数据类型进行声明定义
typedef unsigned char u8;
//=============================================函数前向申明
void SysInit(void);					// 系统初始化
void Do(void);						// 系统执行
void DoShow(void);	  				// 温度数据显示
void DoSetting(void);				// 用户阈值设定
void SaveSetting(void);				// 保存用户设设置
int  KeyScan(void);					// 按键扫描
void KeyListen(void);				// 按键监听
void datapros(int temp); 			// 数据处理
void DisInterface(uchar *disp); 	// 显示界面
void DisTempData(void);				// 显示温度数据
void DisTempThresholdData(void);	// 显示阈值数据
void CursorPositionToChange(void);	// 在指定位置修改数据
void Alarm(void);					// 温度超阈值警报

//=============================================数据定义
u8 DispInterface1[]="Temperature Is: ";		 // 显示温度检测界面
u8 DispInterface2[]=" <--Setting-->  ";	 	 // 显示温度阀值设置界面 1


u8 DispTempData[8]={0,0,0,'.',0,0,' ','C'};	 		// 显示温度值
u8 DispUpData[7]={'U',':','5','0','.','0','0'};		// 显示温度上限值
u8 DispDwData[7]={'D',':','2','0','.','0','0'};		// 显示温度下限值
	 
int TempData,TempDataUP=5000,TempDataDW=2000;		// 用于存储温度数据,温度上限,温度下限
u8 	DoWhat= 0;										// 事件执行标记 :0为 温度数据显示,1 为温度阈值设置
int veluTemp= 0;									// 用于存储数值增量
u8 	isChange=0;
u8  CursorPosition=0;								// 标识光标位置,共有八个位置

//char num= 0;


/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{
	SysInit();		// 系统初始化
	Do(); 			// 显示界面			
}
















/*******************************************************************************
* 函 数 名       : SysInit
* 函数功能		 : 系统初始化
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void SysInit(void)
{
	LcdInit();
	Ds18b20Init();
	Ds18b20ReadTemp(); 		// 刷新,舍去无效数据
	Ds18b20ReadTemp();
	Ds18b20ReadTemp();
}


/*******************************************************************************
* 函 数 名         : datapros()
* 函数功能		   : 温度读取处理转换函数
* 输    入         : temp
* 输    出         : 无
*******************************************************************************/
void datapros(int temp) 	 
{
   	float tp;  

	if(temp< 0)						//	当温度值为负数
  	{
		DispTempData[0] = '-'; 	 	//  负温度
		//因为读取的温度是实际温度的补码,所以减1,再取反求出原码
		temp=temp-1;
		temp=~temp;
		tp=temp;
		temp=tp*0.0625*100+0.5;	
		//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
		//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
		//算加上0.5,还是在小数点后面。
 
  	}
 	else
  	{			
		DispTempData[0] = '+'; 	 		//  正温度
		tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
		//如果温度是正的那么,那么正数的原码就是补码它本身
		temp=tp*0.0625*100+0.5;	
		//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
		//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
		//算加上0.5,还是在小数点后面。
	}
	TempData= temp % 10000;
	//Disp[20] = (temp / 10000) + '0';
	DispTempData[1] = (temp % 10000 / 1000) + '0';
	DispTempData[2] = (temp % 1000 / 100) + '0';
	DispTempData[4] = (temp % 100 / 10) + '0';
	DispTempData[5] = (temp % 10) + '0';
}

/*******************************************************************************
* 函 数 名       : DisInterface
* 函数功能		 : 显示界面
* 输    入       : uchar *disp
* 输    出    	 : 无
*******************************************************************************/
void DisInterface(uchar *disp)
{
	u8 i;

	LcdWriteCom(0x80);   			 	 // 设置数据指针起点	
	for(i=0;i<16;i++)
		LcdWriteData(disp[i]);			 // LCD12864显示数据
}
/*******************************************************************************
* 函 数 名       : DisTempData
* 函数功能		 : 显示温度数据
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void DisTempData(void)
{
	LcdWriteCom(0xc4);
	LcdWriteData(DispTempData[0]);			 // LCD12864显示数据
	LcdWriteData(DispTempData[1]);			 // LCD12864显示数据
	LcdWriteData(DispTempData[2]);			 // LCD12864显示数据
	LcdWriteData(DispTempData[3]);			 // LCD12864显示数据
	
	LcdWriteCom(0xc8);
	LcdWriteData(DispTempData[4]);			 // LCD12864显示数据
	LcdWriteData(DispTempData[5]);			 // LCD12864显示数据
	LcdWriteData(DispTempData[6]);			 // LCD12864显示数据
	LcdWriteData(DispTempData[7]);			 // LCD12864显示数据	
}
/*******************************************************************************
* 函 数 名       : DisTempThresholdData
* 函数功能		 : 显示温度阈值数据
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void DisTempThresholdData(void)
{ 
	u8 i=0;

	LcdWriteCom(0xc0);
	for(i=0; i<7;i++)
	{
		LcdWriteData(DispUpData[i]);			 // LCD12864显示数据
	}
	  		  
	LcdWriteCom(0xc9);
	for(i=0; i<7;i++)
	{
		LcdWriteData(DispDwData[i]);			 // LCD12864显示数据
	} 
	LcdWriteCom(0x83);	
}
/*******************************************************************************
* 函 数 名       : Do
* 函数功能		 : 事件执行
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void Do(void)
{
	while(1)
	{
		Alarm();		// 温度超阈值时触发警报	
		(DoWhat == 0)? DoShow():DoSetting();
		KeyListen();	// 按键监听
	}
	
}
/*******************************************************************************
* 函 数 名       : DoShow
* 函数功能		 : 执行温度显示
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void DoShow(void)
{
	if(isChange != 0)
	{
		LcdWriteCom(0x01);   			// 清屏
		isChange= 0;
	}
	
	DisInterface(DispInterface1); 		// 温度显示界面
	datapros(Ds18b20ReadTemp());	 	// 获取数据并处理 
	DisTempData();					 	// 显示温度数据	
	
}
/*******************************************************************************
* 函 数 名       : DoSetting
* 函数功能		 : 执行阈值设置
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void DoSetting(void)
{  
	if(isChange != 0)
	{
		LcdWriteCom(0x01);   			// 清屏
		isChange= 0;
	}
	DisInterface(DispInterface2);  		// 温度设置界面
	CursorPositionToChange();			// 指定位置显示光标,光标闪动,可以修改数据
	DisTempThresholdData();				// 显示阈值数据
}
/*******************************************************************************
* 函 数 名       : KeyListen
* 函数功能		 : 按键监听
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void KeyListen(void)
{
	int KeyVelu= KeyScan();
	if( KeyVelu != -1)			// 有按键按下
	{
		switch(KeyVelu)
		{
			case 1:					// 按键表示切换功能
			{
				DoWhat =  (DoWhat+1)%2;
				isChange= 1;
				break; 
			}	
			case 2:
			{						//  +
				if(DoWhat == 1)
				{
					switch(CursorPosition)
					{
						case 1:
						{
							veluTemp= (veluTemp+1)%10;
							DispUpData[2]= '0'+veluTemp;		   
							
							break;
						}
						case 2:
						{
							veluTemp= (veluTemp+1)%10;
							DispUpData[3]= '0'+veluTemp;
							break;
						}
						case 3:
						{
							veluTemp= (veluTemp+1)%10;
							DispUpData[5]= '0'+veluTemp;
							break;
						}
						case 4:
						{
							veluTemp= (veluTemp+1)%10;
							DispUpData[6]= '0'+veluTemp;
							break;
						}
						case 5:
						{
							veluTemp= (veluTemp+1)%10;
							DispDwData[2]= '0'+veluTemp;
							break;
						}
						case 6:
						{
							veluTemp= (veluTemp+1)%10;
							DispDwData[3]= '0'+veluTemp;
							break;
						}
						case 7:
						{
							veluTemp= (veluTemp+1)%10;
							DispDwData[5]= '0'+veluTemp;
							break;
						}
						case 8:
						{
							veluTemp= (veluTemp+1)%10;
							DispDwData[6]= '0'+veluTemp;
							break;
						}
						default :
						{
							break;
						}
					}							
				}
				break; 
			}
			case 3:
			{	  					// -
				if(DoWhat == 1)
				{
					switch(CursorPosition)
					{
						case 1:
						{
							veluTemp--;
							if(veluTemp < 0)
								  veluTemp= 9;
							DispUpData[2]= '0'+veluTemp;		   
							
							break;
						}
						case 2:
						{
							veluTemp--;
							if(veluTemp < 0)
								  veluTemp= 9;
							DispUpData[3]= '0'+veluTemp;
							break;
						}
						case 3:
						{
							veluTemp--;
							if(veluTemp < 0)
								  veluTemp= 9;
							DispUpData[5]= '0'+veluTemp;
							break;
						}
						case 4:
						{
							veluTemp--;
							if(veluTemp < 0)
								  veluTemp= 9;
							DispUpData[6]= '0'+veluTemp;
							break;
						}
						case 5:
						{
							veluTemp--;
							if(veluTemp < 0)
								  veluTemp= 9;
							DispDwData[2]= '0'+veluTemp;
							break;
						}
						case 6:
						{
							veluTemp--;
							if(veluTemp < 0)
								  veluTemp= 9;
							DispDwData[3]= '0'+veluTemp;
							break;
						}
						case 7:
						{
							veluTemp--;
							if(veluTemp < 0)
								  veluTemp= 9;
							DispDwData[5]= '0'+veluTemp;
							break;
						}
						case 8:
						{
							veluTemp--;
							if(veluTemp < 0)
								  veluTemp= 9;
							DispDwData[6]= '0'+veluTemp;
							break;
						}
						default :
						{
							break;
						}
					}	
				}
				break; 
			}	
			case 4:
			{	 					// <---
				if(DoWhat == 1)
				{
					CursorPosition--;
					if(CursorPosition == 0)	
						CursorPosition= 8;
				}
					
				break; 
			}
			case 5:
			{			 			// --->
				if(DoWhat == 1)
				{
					CursorPosition++;
					if(CursorPosition == 9)	
						CursorPosition= 1;
				}
				break; 
			}	
			case 6:
			{	 					// 确认
				if(DoWhat == 1)
				{	
					SaveSetting(); 	// 保存设定的数据
					DoWhat= 0;		// 事件重回温度显示
					isChange= 1;
				}
				break; 
			}
			case 7:
			{
				if(DoWhat == 1)
				{
				}
				break; 
			}	
			default:
			{
				if(DoWhat == 1)
				{
				}
				break; 
			}
		}
	}
}
/*******************************************************************************
* 函 数 名       : KeyScan
* 函数功能		 : 按键扫描
* 输    入       : 无
* 输    出    	 : u8类型的按键编号
*******************************************************************************/
int KeyScan(void)
{	 // 返回1~7 表示K1(P1.0)~K7(P1.7) ,无按键按下时,返回-1
  
	if((P1 & 0x7f) != 0x7f)	  		// 说明可能有按键按下
	{
		Delay1ms(10);				// 延时消抖
		if((P1 & 0x7f) != 0x7f)	  	// 说明确实有按键按下
		{
			switch(P1 & 0x7f)
			{
				case 0x7e:	  		// 0111 1110
					return 1;
				case 0x7d:			// 0111 1101
					return 2;	 	
				case 0x7b:			// 0111 1011
					return 3;
				case 0x77: 			// 0111 0111
					return 4;
				case 0x6f:			// 0110 1111
					return 5;
				case 0x5f:			// 0101 1111
					return 6;
				case 0x3f:			// 0011 1111
					return 7;
				default:
					return 0;
			}	
		}
		return -1;
	}
	else
		return -1;
}

/*******************************************************************************
* 函 数 名       : CursorPositionToChange
* 函数功能		 : 在指定位置显示光标并,执行数据修改
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void CursorPositionToChange(void)
{
	switch(CursorPosition)
	{
		case 1:
		{
			LcdWriteCom(0xc2);
			LcdWriteData(' ');			 // LCD12864显示数据
			Delay1ms(30);				 // 延时消抖
			break;
		}
		case 2:
		{
			LcdWriteCom(0xc3);
			LcdWriteData(' ');			 // LCD12864显示数据
			Delay1ms(30);				 // 延时消抖
			break;
		}
		case 3:
		{
			LcdWriteCom(0xc5);
			LcdWriteData(' ');			 // LCD12864显示数据
			Delay1ms(30);				 // 延时消抖
			break;
		}
		case 4:
		{
			LcdWriteCom(0xc6);
			LcdWriteData(' ');			 // LCD12864显示数据
			Delay1ms(30);				 // 延时消抖
			break;
		}
		case 5:
		{
			LcdWriteCom(0xcb);
			LcdWriteData(' ');			 // LCD12864显示数据
			Delay1ms(30);				 // 延时消抖
			break;
		}
		case 6:
		{
			LcdWriteCom(0xcc);
			LcdWriteData(' ');			 // LCD12864显示数据
			Delay1ms(30);				 // 延时消抖
			break;
		}
		case 7:
		{
			LcdWriteCom(0xce);
			LcdWriteData(' ');			 // LCD12864显示数据
			Delay1ms(30);				 // 延时消抖
			break;
		}
		case 8:
		{
			LcdWriteCom(0xcf);
			LcdWriteData(' ');			 // LCD12864显示数据
			Delay1ms(30);				 // 延时消抖
			break;
		}
		default :
		{
			break;
		}
	}
	
}

/*******************************************************************************
* 函 数 名       : SaveSetting
* 函数功能		 : 保存用户设置
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void SaveSetting(void)
{
	TempDataUP=  (DispUpData[2]-'0')*1000+ (DispUpData[3]-'0')*100+	(DispUpData[5]-'0')*10+ (DispUpData[6]-'0');
	TempDataDW=  (DispDwData[2]-'0')*1000+ (DispDwData[3]-'0')*100+	(DispDwData[5]-'0')*10+ (DispDwData[6]-'0');	
}
/*******************************************************************************
* 函 数 名       : Alarm
* 函数功能		 : 温度超阈值警报
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void Alarm(void)
{
	if((TempData < TempDataDW) || (TempData > TempDataUP))
	{
		BEEP= 1;
			Delay1ms(60);
		BEEP= 0;
			Delay1ms(30);				
	}		
}



猜你喜欢

转载自blog.csdn.net/smallerxuan/article/details/83338171