1. 程式人生 > >基於51微控制器的電子溫度計系統的設計與實現

基於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);				
	}		
}



相關推薦

基於James技術的企業電子郵件系統設計實現

     基於James技術的企業電子郵件系統設計與實現   轉載:https://www.taodocs.com/p-156363658.html        1、簡介     

[原始碼和文件分享]基於C++的庫存管理系統設計實現

一 需求分析 1.1 總體要求 運用面向物件程式設計知識,利用C++語言設計和實現一個“庫存管理系統設計”,主要完成對商品的銷售、統計和簡單管理。在實現過程中,需利用面向物件程式設計理論的基礎知識,充分體現出C++語言關於類、繼承和封裝等核心概念,每一個類應包含資料成員和成員函式。 1.

[原始碼和文件分享]基於C++的學生生活系統設計實現

一 需求分析 需要設計並實現如下場景:在那山的那邊,湖的那邊,有一所學校,學校裡有一幢宿舍樓,宿舍樓有若干層,每一層有若干房間 ,一群學生快樂地生活在這裡。他們每天可做的事情有: 換宿舍,從一個房間搬到另一個房間 退學,亦即搬出宿舍樓 入學,亦即搬入宿舍樓

[原始碼和文件分享]基於QT的考試管理系統設計實現

一、專案概要 1.1 專案名稱 考試管理系統 1.2 專案目標 培養快速學習新的知識,解決問題的能力 規劃專案的整體功能以及相關需求分析,並設計出合理的資料庫,並熟悉整個試題系統的開發流程。 1.3 軟體概要 開發一個考試管理系統,考生可以進行練習,

一種基於WiFi的室內定位系統設計實現 _RFID世界網

參考:http://network.chinabyte.com/376/12363876.shtml 1. 引言 位置資訊在人們的日常生活中扮演著重要的作用。在郊外、展覽館、公園等陌生環境中,使用定位導航資訊可為觀眾遊覽提供更便捷的服務;在倉儲物流過程中,對物品進行實時定

基於WebGIS的Web服務器日誌管理系統設計實現_愛學術——免費下載

富客戶端 平臺 .com 服務器日誌 操作 shu 實現 c51 bsp 【摘要】WebGIS優勢是通過互聯網對地理空間數據進行發布和應用,以實現空間數據的共享和相互操作。將WebGIS和富客戶端技術引入Web服務器日誌管理領域,從總體設計、數據庫設計、實現框架等幾個方面設

基於Web的企業排班管理系統設計實現_愛學術——免費下載

安全 html 快速 開發框架 管理 document 企業 search src 【摘要】隨著我國企業的快速發展,落後的排班方式正日益影響企業的工作效率。本文即探討基於Web的企業排班管理。提出基於SSH開發框架並結合MVC設計模式來開發企業排班管理系統,提高系統的安全性

基於51微控制器的矩陣計算器設計

      當初本科的畢業設計不是很完美,一直想把它完善一下,這學期剛開始有點時間,就以一個小專案的方式,綜合自己這一年多來的程式碼閱讀收穫,重寫了這個工程。 一,平臺的重新搭建 Ø  在win7上重新安裝了proteus7.8用於模擬階段的測試,並從以前

基於51微控制器的簡易電子琴設計

轉載地址: https://blog.csdn.net/zy010101/article/details/80538312                   

課設 - 基於FPGA的電子警察系統設計(流程)

  本文以FPGA晶片為核心,來檢測運動車輛是否超速以及車輛是否闖紅燈。   通過攝像機採集到的影象以影象處理的方法進行處理,然後通過MATLAB軟體將採集到的圖片轉化成Verilog可識別的的數字程式碼,再加以幀間差分法、最小二乘法,對處理過後的影象進行進一步的

文獻綜述十四:基於Oracle11g的超市進銷存管理系統設計實現

一、基本資訊   標題:基於Oracle11g的超市進銷存管理系統設計與實現   時間:2016   出版源:技術創新   檔案分類:對資料庫的研究 二、研究背景   為超市設計開發的超市管理系統,採用的是 VC+ Oracle模 式的電子管理平臺,研究基於C/S模式的電子資訊管理的實現。 三、具體內容   

文獻綜述十八:基於SSH框架的進銷存管理系統設計實現

一、基本資訊   標題:基於SSH框架的進銷存管理系統設計與實現   時間:2017   出版源:內蒙古科技與經濟   檔案分類:對框架的研究 二、研究背景   進銷存管理系統在各企業中廣泛應用,使用SSH框架,很大程度上提高了開發效率及系統的可靠性和易用性。 三、具體內容   文獻的主要內容分為三大部分。一

基於JAVA的網上商城商家管理系統設計實現

**基於JAVA的網上商城商家管理系統設計與實現** 基於JAVA的網上商城商家管理系統設計與實現mysql資料庫建立語句 基於JAVA的網上商城商家管理系統設計與實現oracle資料庫建立語句 基於JAVA的網上商城商家管理系統設計與實現sqlserver資料庫建立語句

[原始碼和文件分享]基於VS2012和SQL SERVER的餐廳點餐系統設計實現

一、需求分析 1. 面向物件 點典點菜系統是一款面向顧客和管理人員的全方面系統,其中管理人員又包括服務員、採購員和廚師。本組認真分析了不同物件的需求,為不同的物件都設計了獨特的系統功能。簡化了傳統點菜、燒菜和採購方式繁瑣的步驟,為顧客提供便捷操作的同時提高酒店管理的效率。 2. 市場背景

[原始碼和文件分享]基於JSP的停車場資訊管理系統設計實現

1.1 專案背景 軟體系統的名稱是停車場管理系統。我們開發的系統將幫助停車場管理員和物業公司更加智慧化的管理停車場,省去很多的人力物力。方便隨時查詢停車場的情況,也有助於車主方便隨時查詢附近可以停車的停車場。 1.1.1使用者基本情況介紹 角色1:停車場管理員 檢視剩餘車位數量,

基於移動網際網路的高校評優評獎系統設計實現

**基於移動網際網路的高校評優評獎系統設計與實現** 基於移動網際網路的高校評優評獎系統設計與實現mysql資料庫建立語句 基於移動網際網路的高校評優評獎系統設計與實現oracle資料庫建立語句 基於移動網際網路的高校評優評獎系統設計與實現sqlserver資料庫建立語句

基於RFID的簡易圖書管理系統設計實現

  本次開發主要做了從串列埠分別獲取讀者卡號和圖書卡號,實現圖書管理,圖書借閱,讀者管理等功能。開發語言是C#,開發環境使用Visual Studio 2015。資料庫採用sql Server。   RFID選擇   讀者卡跟圖書卡均採用125K,一般稱之為低頻卡,典型的

基於SpringCloud 微服務架構下 廣告系統設計實現

互聯 編碼 課程總結 搭建 增刪 統一 維護 boa lan 第1章 課程簡介本章對這門課程進行說明,包括:廣告系統的介紹、課程使用的技術介紹、課程的學習規劃等。 第2章 廣告系統概覽與準備工作本章會介紹廣告系統的思想、廣告系統的技術實現架構、學習本課程之前的準備工作和廣告

基於Dubbo框架的秒殺系統設計實現-2

針對電影院線實際業務需求,設計出一套功能完整、效能高效穩定的秒殺系統。根據目標業務需求,將分散式框架Dubbo、Redis記憶體資料庫、分散式訊息佇列RocketMQ、Spring框架整合應用於秒殺系統,實現秒殺系統功能模組化,有效快速的利用閒置的硬體資源提高秒殺系統活

基於SSH的文章發布系統設計實現-JavaWeb項目-有源碼

技術 cat web項目 聯系 會員 根據 發布系統 eclipse 維護 開發工具:Myeclipse/Eclipse + MySQL + Tomcat 項目簡介: 文章發布系統的設計與實現項目,基本功能包括:網站信息、基礎信息、系統管理、個人信息等。本系統結構