|
主程序代碼如下,
#include <REGX52.H>
#include "LCD1602.h"
#include "DS18B20.h"
#include "Delay.h"
#include "AT24C02.h"
#include "Key.h"
#include "Timer0.h"
#include "UART.h"
#include <stdio.h>
float T,TShow;
char TLow,THigh;
unsigned char KeyNum;
void UART_SendFloat(float f)
{
unsigned char *p = (unsigned char *)&f;
int i;
// 可選:發(fā)送起始標(biāo)志(例如0xAA)
UART_SendByte(0xAA);
// 發(fā)送4個字節(jié)(小端模式:低字節(jié)在前)
for(i = 0; i < 4; i++) {
UART_SendByte(p[i]);
}
// 可選:發(fā)送結(jié)束標(biāo)志(例如0x55)
UART_SendByte(0x55);
}
void main()
{
DS18B20_ConvertT(); //上電先轉(zhuǎn)換一次溫度,防止第一次讀數(shù)據(jù)錯誤
Delay(1000); //等待轉(zhuǎn)換完成
THigh=AT24C02_ReadByte(0); //讀取溫度閾值數(shù)據(jù)
TLow=AT24C02_ReadByte(1);
if(THigh>125 || TLow<-55 || THigh<=TLow)
{
THigh=20; //如果閾值非法,則設(shè)為默認(rèn)值
TLow=15;
}
LCD_Init();
UART_Init();
LCD_ShowString(1,1,"T:");
LCD_ShowString(2,1,"TH:");
LCD_ShowString(2,9,"TL:");
LCD_ShowSignedNum(2,4,THigh,3);
LCD_ShowSignedNum(2,12,TLow,3);
Timer0_Init();
while(1)
{
KeyNum=Key();
/*溫度讀取及顯示*/
DS18B20_ConvertT(); //轉(zhuǎn)換溫度
T=DS18B20_ReadT(); //讀取溫度
if(T<0) //如果溫度小于0
{
LCD_ShowChar(1,3,'-'); //顯示負(fù)號
TShow=-T; //將溫度變?yōu)檎龜?shù)
}
else //如果溫度大于等于0
{
LCD_ShowChar(1,3,'+'); //顯示正號
TShow=T;
}
LCD_ShowNum(1,4,TShow,3); //顯示溫度整數(shù)部分
LCD_ShowChar(1,7,'.'); //顯示小數(shù)點
LCD_ShowNum(1,8,(unsigned long)(TShow*100)%100,2);//顯示溫度小數(shù)部分
UART_SendFloat(TShow);
Delay(500);
/*閾值判斷及顯示*/
if(KeyNum)
{
if(KeyNum==1) //K1按鍵,THigh自增
{
THigh++;
if(THigh>125){THigh=125;}
}
if(KeyNum==2) //K2按鍵,THigh自減
{
THigh--;
if(THigh<=TLow){THigh++;}
}
if(KeyNum==3) //K3按鍵,TLow自增
{
TLow++;
if(TLow>=THigh){TLow--;}
}
if(KeyNum==4) //K4按鍵,TLow自減
{
TLow--;
if(TLow<-55){TLow=-55;}
}
LCD_ShowSignedNum(2,4,THigh,3); //顯示閾值數(shù)據(jù)
LCD_ShowSignedNum(2,12,TLow,3);
AT24C02_WriteByte(0,THigh); //寫入到At24C02中保存
Delay(5);
AT24C02_WriteByte(1,TLow);
Delay(5);
}
if(T>THigh) //越界判斷
{
LCD_ShowString(1,13,"OV:H");
}
else if(T<TLow)
{
LCD_ShowString(1,13,"OV:L");
}
else
{
LCD_ShowString(1,13," ");
}
}
}
void Timer0_Routine() interrupt 1
{
static unsigned int T0Count;
TL0 = 0x18; //設(shè)置定時初值
TH0 = 0xFC; //設(shè)置定時初值
T0Count++;
if(T0Count>=20)
{
T0Count=0;
Key_Loop(); //每20ms調(diào)用一次按鍵驅(qū)動函數(shù)
}
}
接受的串口通信就像圖片那樣
|
|