導航:首頁 > 操作系統 > 單片機溫度報警器

單片機溫度報警器

發布時間:2022-09-24 10:50:36

❶ 溫度報警器的程序

網上很多搜下ds18b20的常式吧。或者Tbao搜:基於單片機火災報警器(MQ2+DS18B20)模擬和C程序資料。

❷ 單片機 ds18b20溫度報警器問題

if((MSB&0XF8)==X0F8)
應該是if((MSB&0XF8)==0xF8)吧?

❸ 基於AT89C51和DS18B20製作的溫度報警器原理圖和單片機內部程序

#include <reg52.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P2^2; //溫度感測器信號線
sbit la=P2^6; //數碼管段選線
sbit wela=P2^7; //數碼管位選線
sbit beep=P2^3; //蜂鳴器

uint temp;
float f_temp;
uint warn_l1=260;
uint warn_l2=250;
uint warn_h1=300;
uint warn_h2=320;

sbit led0=P1^0;
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;

unsigned char code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0xbf,0x86,
0xdb,0xcf,0xe6,0xed,
0xfd,0x87,0xff,0xef}; //不帶小數點的編碼

void delay(uint z)//延時函數
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void dsreset(void) //18B20復位,初始化函數
{
uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}

bit tempreadbit(void) //讀1位函數
{
uint i;
bit dat;
ds=0;i++; //i++ 起延時作用
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return (dat);
}

uchar tempread(void) //讀1個位元組
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1); //讀出的數據最低位在最前面,這樣剛好一個位元組在DAT里
}
return(dat);
}

void tempwritebyte(uchar dat) //向18B20寫一個位元組數據
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //寫 1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0; //寫 0
i=8;while(i>0)i--;
ds=1;
i++;i++;
}

}
}

void tempchange(void) //DS18B20 開始獲取溫度並轉換
{
dsreset();
delay(1);
tempwritebyte(0xcc); // 寫跳過讀ROM指令
tempwritebyte(0x44); // 寫溫度轉換指令
}

uint get_temp() //讀取寄存器中存儲的溫度數據
{
uchar a,b;

dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread(); //讀低8位
b=tempread(); //讀高8位
temp=b;
temp<<=8; //兩個位元組組合為1個字
temp=temp|a;
f_temp=temp*0.0625; //溫度在寄存器中為12位 解析度位0.0625°
temp=f_temp*10+0.5; //乘以10表示小數點後面只取1位,加0.5是四捨五入
f_temp=f_temp+0.05;
return temp; //temp是整型
}

////////////////////顯示程序//////////////////////////
void display(uchar num,uchar dat)
{
uchar i;
la=0;
P0=table[dat];
la=1;
la=0;

wela=0;
i=0XFF;
i=i&(~((0X01)<<(num)));
P0=i;
wela=1;
wela=0;
delay(1);
}

void dis_temp(uint t)
{
uchar i;
i=t/100;
display(0,i);
i=t%100/10;
display(1,i+10);
i=t%100%10;
display(2,i);
}
//////////////////////////////////////////////
void warn(uint s,uchar led) //蜂鳴器報警聲音 ,s控制音調
{
uchar i;i=s;
la=0;
wela=0;

beep=0;
P1=~(led);
while(i--)
{
dis_temp(get_temp());
}
beep=1;
P1=0XFF;
i=s;
while(i--)
{
dis_temp(get_temp());
}
}
void deal(uint t)
{
uchar i;
if((t>warn_l2)&&(t<=warn_l1)) //大於25度小於27度
{
warn(40,0x01);

}
else if(t<=warn_l2) //小於25度
{
warn(10,0x03);
}
else if((t<warn_h2)&&(t>=warn_h1)) //小於32度大於30度
{
warn(40,0x04);
}
else if(t>=warn_h2) //大於32度
{
warn(10,0x0c);
}
else
{
i=40;
while(i--)
{
dis_temp(get_temp());
}
}
}

void init_com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}

void comm(char *parr)
{
do
{
SBUF = *parr++; //發送數據
while(!TI); //等待發送完成標志為1
TI =0; //標志清零
}while(*parr); //保持循環直到字元為'\0'
}

void main()
{
uchar buff[4],i;
la=0;
wela=0;
init_com();
while(1)
{
tempchange();
for(i=10;i>0;i--)
{
dis_temp(get_temp());}
deal(temp);

sprintf(buff,"%f",f_temp);

for(i=10;i>0;i--)
{
dis_temp(get_temp());}

comm(buff);

for(i=10;i>0;i--)
{
dis_temp(get_temp());}

}
}

❹ 51單片機溫度報警器,為什麼我用串口設置的門限溫度無論是多少,都會報警是哪個地方沒有設置好嗎

有沒有代碼,貼上來看看

❺ 單片機溫度報警器的溫度上下限按鍵調控的C語言程序怎麼編

溫度報警器就是需要溫度感測器不停地對監控的對象進行檢測,例如pt100溫度感測器,pt100感測器是不同溫度下,阻值會不同,在同一溫度下,阻值是相同的。根據這個原理通過電路轉換成電壓,然後模擬量轉換成數字量輸入到單片機,單片機根據讀取到的電壓值判斷實際溫度值,然後根據設定的報警值比較,如果超過 就進行報警動作。
在實際設計過程中那個報警溫度的設定,可以直接對那個變數進行加減的,例如
void actfuntion(unsigned char temp)
{
temp++;
}
然後在檢測到按鍵有電平跳變的時候,就調用這個含參子函數對定義的溫度設定值進行加操作,減操作也是一樣,還可以在調用的後面進行最大值或者最小值的判斷。
如果覺得這樣一下一下的按太麻煩了,可以對按鍵進行長按連續觸發進行判斷,就是在定時器里進行判斷按下時間,然後不停的調用這個子函數。
當然這個設定值是需要考慮掉電保存的,或者是按鍵保存。可以在設定好溫度值之後,在按下其他的按鍵,進行把溫度設定值 保存到單片機內部eeprom就可以了,不需要保存太多數據的情況下,現在市面上很多單片機都有的內部eeprom就夠用的了,不需要進行外部擴展。
然後在單片機上電,也就是主函數的開頭進行讀取eeprom中保存的設定值。

❻ STC89C52單片機,用C語言編溫度報警器的程序

我們可以給你提供。 //初始化DS18B20
//讓DS18B20一段相對長時間低電平, 然後一段相對非常短時間高電平, 即可啟動
void dsInit()
{
//對於11.0592MHz時鍾, unsigned int型的i, 作一個i++操作的時間大於8us
unsigned int i;
ds = 0;
i = 100; //拉低約800us, 符合協議要求的480us以上
while(i>0) i--;
ds = 1; //產生一個上升沿, 進入等待應答狀態
i = 4;
while(i>0) i--;
}

void dsWait()
{
unsigned int i;
while(ds);
while(~ds); //檢測到應答脈沖
i = 4;
while(i > 0) i--;
}

//向DS18B20讀取一位數據
//讀一位, 讓DS18B20一小周期低電平, 然後兩小周期高電平,
//之後DS18B20則會輸出持續一段時間的一位數據
bit readBit()
{
unsigned int i;
bit b;
ds = 0;
i++; //延時約8us, 符合協議要求至少保持1us
ds = 1;
i++; i++; //延時約16us, 符合協議要求的至少延時15us以上
b = ds;
i = 8;
while(i>0) i--; //延時約64us, 符合讀時隙不低於60us要求
return b;
}

//讀取一位元組數據, 通過調用readBit()來實現
unsigned char readByte()
{
unsigned int i;
unsigned char j, dat;
dat = 0;
for(i=0; i<8; i++)
{
j = readBit();
//最先讀出的是最低位數據
dat = (j << 7) | (dat >> 1);
}
return dat;
}

}

//向DS18B20發送溫度轉換命令
void sendChangeCmd()
{
dsInit(); //初始化DS18B20, 無論什麼命令, 首先都要發起初始化
dsWait(); //等待DS18B20應答
delay(1); //延時1ms, 因為DS18B20會拉低DQ 60~240us作為應答信號
writeByte(0xcc); //寫入跳過序列號命令字 Skip Rom
writeByte(0x44); //寫入溫度轉換命令字 Convert T
}

//向DS18B20發送讀取數據命令
void sendReadCmd()
{
dsInit();
dsWait();
delay(1);
writeByte(0xcc); //寫入跳過序列號命令字 Skip Rom
writeByte(0xbe); //寫入讀取數據令字 Read Scratchpad
}

//獲取當前溫度值
int getTmpValue()
{

int value; //存放溫度數值
float t;
unsigned char low, high;
sendReadCmd();
//連續讀取兩個位元組數據
low = readByte();
high = readByte();
tmpvalue = high;
tmpvalue <<= 8;
tmpvalue |= low;
value = tmpvalue;

//使用DS18B20的默認解析度12位, 精確度為0.0625度, 即讀回數據的最低位代表0.0625度
t = value * 0.0625;
value = t * 100 + (value > 0 ? 0.5 : -0.5); //大於0加0.5, 小於0減0.5
return value;
}

unsigned char const timeCount = 3; //動態掃描的時間間隔
//顯示當前溫度值, 精確到小數點後一位
//若先位選再段選, 由於IO口默認輸出高電平, 所以當先位選會使數碼管出現亂碼
/*void display()
{
unsigned int tmp = abs(tempValue);

switch(sum)
{
case 1: PA8255=table[tmp % 10]; PB8255=0xfe; delay(1);
PA8255=table[ tmp % 100 / 10]; PB8255=0xfd; delay(1);
PA8255=tableWidthDot[ tmp % 1000 / 100]; PB8255=0xfb; delay(1);
PA8255=table[tmp % 10000 / 1000]; PB8255=0xf7; delay(1); PB8255=0xff;break; //顯示溫度

case 2: PA8255=table[0]; PB8255=0xfe; delay(1);
PA8255=tableWidthDot[high%10]; PB8255=0xfd; delay(1);
PA8255=table[high/10]; PB8255=0xfb; delay(1); PB8255=0xff; break; //顯示上限溫度

case 3: PA8255=table[0]; PB8255=0xfe; delay(1);
PA8255=tableWidthDot[low%10]; PB8255=0xfd; delay(1);
PA8255=table[low/10]; PB8255=0xfb; delay(1); PB8255=0xff; break; //顯示下限溫度

default: break;
}

} */

Into() interrupt 0
{ sum++;
if(sum==4)
sum=1;
}

uchar keyscan() //鍵盤掃描,調整溫度上下限
{
PC8255=0xfc;
if((PC8255&0xc0)!=0xc0)
{
delay(40);
if((PC8255&0xc0)!=0xc0)
PC8255=0xfe;
if((PC8255&0xc0)==0x80)
high++;
if((PC8255&0xc0)==0x40)
high--;
PC8255=0xfd;
if((PC8255&0xc0)==0x80)
low++;
if((PC8255&0xc0)==0x40)
low--;
}
}

void main()
{

unsigned int tmp ;

COM8255=0x88;
IT0=1; //外部中斷0,採用外部中斷0進行實時溫度,上限溫度和下限溫度之間的顯示切換
EX0=1;
EA=1;
P1_0=0x1;
sum=1;
high=22; //初始溫度上下限設定
low=10;
while(1)
{
//啟動溫度轉換
sendChangeCmd();
tempValue = getTmpValue();
keyscan();// 讀取鍵值
tmp = abs(tempValue); //讀取溫度
switch(sum)
{
case 1: PA8255=table[tmp % 10]; PB8255=0xfe; delay(1);
PA8255=table[ tmp % 100 / 10]; PB8255=0xfd; delay(1);
PA8255=tableWidthDot[ tmp % 1000 / 100]; PB8255=0xfb; delay(1);
PA8255=table[tmp % 10000 / 1000]; PB8255=0xf7; delay(1); PB8255=0xff;break; //顯示溫度

case 2: PA8255=table[0]; PB8255=0xfe; delay(1);
PA8255=tableWidthDot[high%10]; PB8255=0xfd; delay(1);
PA8255=table[high/10]; PB8255=0xfb; delay(1); PB8255=0xff; break; //顯示上限溫度

case 3: PA8255=table[0]; PB8255=0xfe; delay(1);
PA8255=tableWidthDot[low%10]; PB8255=0xfd; delay(1);
PA8255=table[low/10]; PB8255=0xfb; delay(1); PB8255=0xff; break; //顯示下限溫度

default: break;
}

if(tmp>(high*100)|tmp<(low*100) ) //&&tempValue>low) //超過溫度設定范圍,系統自動報警
{
P1_0=0;
}
else
P1_0=1; }

}

❼ 溫度報警器的原理

【1】溫度自動報警器工作原理是根據單片機語音數字聯網火災報警器設計的。

【2】主要是使用AT89C51單片機,選用集成溫度感測器AD590和氣體感測器TGS202作為敏感元件,利用多感測器信息融合技術,開發了可用於小型單位火災報警的語音數字聯網報警器。 關鍵詞:單片機;感測器;信號處理;火災報警器 1 引 言 我國的火災自動報警控制。如下圖所示:

❽ 溫度自動報警器的報警原理

基於單片機語音數字聯網火災報警器設計

摘 要:使用AT89C51單片機,選用集成溫度感測器AD590和氣體感測器TGS202作為敏感元件,利用多感測器信息融合技術,開發了可用於小型單位火災報警的語音數字聯網報警器。 關鍵詞:單片機;感測器;信號處理;火災報警器 1 引 言 我國的火災自動報警控制系統經歷了從無到有、從簡單到復雜的發展過程,其智能化程度也越來越高。目前國內廠家多偏重用於大型倉庫、商場、高級寫字樓、賓館等場所大型火災報警系統的研發,他們採用集中區域報警控制方式,其系統復雜、成本較高。而在居民住宅區、機房、辦公室等小型防火單位,需要設置一種單一或區域聯網、廉價實用的火災自動探測報警裝置,因此,研製一種結構簡單、價格低廉的語音數字聯網火災報警器是非常必要的。 一般小型防火單位火災報警系統如圖1所示。現場火災報警器通過對感測器火情信息的檢測,使用智能識別演算法實現對火災的監測。當報警器監測到火情信息後,直接通過Modem經公用電話交換網迅速向消防指揮中心報告火情信息(包括火災單位編碼、單位名稱、火情級別以及報警時間等),同時產生聲光報警信號,並按事先預留的電話號碼自動撥號通知單位有關負責人。消防指揮中心根據接收到的火警信息,立即在消防信息資料庫中查詢單位位置、周圍道路、交通、水源情況等基本信息,根據所獲得的信息迅速確定最佳救火方案,通過網路將出警命令直接下達各消防中隊。本文將詳細介紹小型防火單位語音數字聯網報警器的設計與實現。 2 報警器硬體設計 2.1 硬體組成 如圖2所示,報警器硬體由溫度煙霧信號採集模塊、聲光報警模塊以及單片機與Modem通信模塊組成。圖中1,2,3組成數據採集模塊,4,5組成聲光報警模塊,5,6,7組成與Modem通信模塊。其中,1為感測器(包括煙感和溫感),將現場溫度、煙霧等非電信號轉化為電信號;2為信號調理電路,將感測器輸出的電信號進行調理(放大、濾波等),使之滿足A/D轉換的要求;3為A/D轉換電路,完成將溫度感測器和煙霧感測器輸出的模擬信號到數字信號的轉換。聲光報警模塊由單片機和報警電路組成,由單片機控制實現不同的聲光報警(異常報警、故障報警、火災報警)功能。單片機與Modem通信模塊由單片機、GM16C550串列埠擴展晶元和RS232電平轉換電路組成,實現報警器經Modem與消防指揮中心的通信。下面對上述各模塊進行簡要介紹。 2.2 溫度煙霧信號採集模塊 要准確地進行火災報警,選擇合適的溫度和煙霧感測器是准確報警的前提。綜合考慮各因素,本文選擇集成溫度感測器AD590和氣體感測器TGS202用作採集系統的敏感元件。 AD590是美國Analog Devices公司生產的一種電流型二端溫度感測器。電路如圖3所示。由於AD590是電流型溫度感測器,他的輸出同絕對溫度成正比,即1μA/k,而數模轉換晶元ADC0809的輸入要求是電壓量,所以在AD590的負極接出一個10 kΩ的電阻R1和一個100Ω的可調電阻W,將電流量變為電壓量送入ADC0809。通過調節可調電阻,便可在輸出端VT獲得與絕對溫度成正比的電壓量,即10 mV/K。 火災中氣體煙霧主要是CO2和CO。TGS202氣體感測器能探測CO2,CO,甲烷、煤氣等多種氣體,他靈敏度高,穩定性好,適合於火災中氣體的探測。如圖4所示,當TGS202探測到CO2或CO時,感測器的內阻變小,VA迅速上升。選擇適當的電阻阻值,使得當氣體濃度達到一定程度(如CO濃度達到0.06%)時,VA端獲得適當的電壓(設為3 V)。 A/D轉換電路採用了常用的8位8通道數模轉換專用晶元ADC0809,電路如圖5所示。溫度、煙霧感測器的輸出分別接到ADC0809的IN0和IN1。ADC0809的通道選擇地址A,B,C分別由89C51的P0.0~P0.2經地址鎖存器74LS373輸出提供。當P2.7=0時,與寫信號WR共同選通ADC0809。圖中ALE信號與ST信號連在一起,在WR信 號的前沿寫入地址信號,在其後沿啟動轉換。例如,輸出地址7FF8H可選通通道IN0,實現對溫度感測器輸出的模擬量進行轉換;輸出地址7FF9H可選通通道IN1,實現對煙霧感測器輸出的模擬量進行轉換。圖中ADC0809的轉換結束狀態信號EOC接到89C51的INT1引腳,當A/D轉換完成後,EOC變為高電平,表示轉換結束,產生中斷。在中斷服務程序中,將轉換好的數據送到指定的存儲單元。 2.3 聲光報警模塊 聲光報警電路在單片機P1口的控制下,可以根據不同情況(火災、異常、故障)發出不同的聲光報警信號。聲音信號由專用語音晶元提供。通過給語音晶元的S1和S2端輸入不同的邏輯電平(00,01,10,11),便可以獲得4種不同的聲音信號。由單片機的P1.0和P1.1控制。另外該晶元還需要一個選通信號,由P1.3提供。只有當該信號為高電平時,晶元才會根據S1和S2端的控制信號發出不同的報警聲,否則不會發聲報警。 由P1口的P1.4~P1.7分別控制4個發光二極體,予以光報警,如圖6所示。P1.4~P1.7控制的燈依次為綠色(正常信號燈)、黃色(故障信號燈)、紅色(異常信號燈)和紅色(火災信號燈)。當這些輸出端輸出低電平時,對應的信號燈便會發光報警。 2.4 單片機與Modem通信模塊 當報警器監測到火災信息後,除了在火災現場產生聲光報警信號外,還需要將火災信息按事先預留的電話號碼自動撥號通知單位有關人員,並迅速上報消防指揮中心,為此,系統設計了單片機與Modem通訊模塊,該模塊由單片機、GM16C550串列埠擴展晶元和RS232電平轉換電路組成。限於篇幅,對通訊模塊的硬體電路及編程不做詳細論述。 3 報警器監控程序設計 監控程序流程圖如圖7所示。系統復位後,首先要進行初始化,包括對各個控制用寄存器的初始化、設置中斷服務程序的入口地址、設置堆棧等。 為了便於系統維護和功能擴充,採用了模塊化程序設計方法,系統各個模塊的具體功能都是通過子程序調用實現的。本系統主要包括數據採集子程序、火災判斷與報警子程序以及Modem通訊子程序等。 3.1 數據採集子程序 數據採集部分的程序設計包括:驅動ADC0809的IN0和IN1進行A/D轉換,分別由子程序ADC1(溫度轉換)和ADC2(煙霧濃度轉換)完成;單片機接收轉換好的數據,存入指定內存單元,由INT1中斷服務程序完成。每次驅動A/D轉換後等待外部中斷1,中斷到來說明A/D轉換已經完成,通過中斷服務程序讀取轉換得到的數據。 3.2 火災判斷與報警程序 為了降低誤報率,系統採用了多次採集、多次判斷的方法。每次數據採集後根據得到的數據對現場情況進行判斷:00H表示正常、01H表示異常、02H表示火災;然後綜合多次判斷結果做出最終的火情判斷。數據在內部RAM存儲單元中的存放情況如表1所示。具體判斷方法如下: (1)對溫度和煙霧進行了兩次數據採集與判斷 溫度≥100℃,溫度異常,置標志位為1,否則為0;煙霧(CO,CO2)濃度≥0.06%,煙霧濃度異常,置標志位為1,否則為0。 (2)根據溫度和煙霧的異常標志位判斷現場情況 2個標志位均為0,表示情況正常,給53H或56H單元送00H;2個中僅有1個為1,表示情況異常,送01H;2個均為1,表示有火災發生,送02H。 (3)綜合兩次情況做最後判斷,並予以報警 若53H和56H中數據不相同,說明是誤報,調故障報警子程序;否則按該單元中的數據調相應的報警子程序。 00H為情況正常,返回。 01H為情況異常,調異常報警子程序。 02H為現場有火災,調火災報警子程序,並向消防中心報告火情。 4 結 語 本文研製的用於小型防火單位的語音數字聯網火災報警器具有以下特點: (1)能對室內煙霧(CO2,CO)及溫度突變進行報警(聲光報警)。 (2)如果出現硬體故障(如感測器遺落、內部元器件損壞等),能發出故障報警。 (3)如果只有一種參數出現異常(如煙霧濃度過大或是溫度較高),能發出異常報警信號,令值班人員到現場處理。 (4)如果煙霧和溫度同時出現異常,則說明有火災,發出火災警報,並及時將火災信息上報消防指揮中心。 現場模擬實驗表明,本系統安全可靠,誤報率低。且由於其體積小、操作維護方便、成本低廉等,具有廣闊的應用前景。
http://..com/question/4525751.html

❾ 求哪位高人給我寫個程序吧,寫一個設計電路的程序,電路我有,是單片機的。溫度報警器

發個電路的圖片吧我想好多人會幫你的忙。

#include<at89x51.h>//用AT89C51時就用這個頭文件

//#include<reg52.h>//用華邦W78E58B時必須用這個頭文件

#include<absacc.h>

#include<ctype.h>

#include<math.h>

#include<stdio.h>

#include<string.h>

#include<DS18B20.h>

#include"LCD1602.h" ////液晶顯示頭文件

//sbitDQ=P3^4; //定義DQ引腳為P3.4

unsignedchart[2],*pt; //用來存放溫度值,測溫程序就是通過這個數組與主函數通信的

unsignedcharTempBuffer1[9]={0x2b,0x31,0x32,0x32,0x2e,0x30,0x30,0x43,''};

//顯示實時溫度,上電時顯示+125.00C

unsignedcharTempBuffer0[17]={0x54,0x48,0x3a,0x2b,0x31,0x32,0x35,0x20,

0x54,0x4c,0x3a,0x2b,0x31,0x32,0x34,0x43,''};

//顯示溫度上下限,上電時顯示TH:+125TL:+124C

unsignedcharcodedotcode[4]={0,25,50,75};

/***因顯示解析度為0.25,但小數運算比較麻煩,故採用查表的方法*******

再將表值分離出十位和個位後送到十分位和百分位********************/

voidcovert0(unsignedcharTH,unsignedcharTL) //將溫度上下限轉換為LCD顯示的數據

{

if(TH>0x7F)//判斷正負,如果為負溫,將其轉化為其絕對值

{

TempBuffer0[3]=0x2d; //0x2d為"-"的ASCII碼

TH=~TH;

TH++;

}

elseTempBuffer0[3]=0x2b; //0x2B為"+"的ASCII碼

if(TL>0x7f)

{

TempBuffer0[11]=0x2d; //0x2d為"-"的ASCII碼

TL=~TL+1;

}

elseTempBuffer0[11]=0x2b; //0x2B為"+"的ASCII碼

TempBuffer0[4]=TH/100+0x30; //分離出TH的百十個位

if(TempBuffer0[4]==0x30)TempBuffer0[4]=0xfe;//百位數消隱

TempBuffer0[5]=(TH%100)/10+0x30; //分離出十位

TempBuffer0[6]=(TH%100)%10+0x30; //分離出個位

TempBuffer0[12]=TL/100+0x30; //分離出TL的百十個位

if(TempBuffer0[12]==0x30)TempBuffer0[12]=0xfe;//百位數消隱

TempBuffer0[13]=(TL%100)/10+0x30; //分離出十位

TempBuffer0[14]=(TL%100)%10+0x30; //分離出個位

}

voidcovert1(void) //將溫度轉換為LCD顯示的數據

{

unsignedcharx=0x00,y=0x00;

t[0]=*pt;

pt++;

t[1]=*pt;

if(t[1]>0x07)//判斷正負溫度

{

TempBuffer1[0]=0x2d; //0x2d為"-"的ASCII碼

t[1]=~t[1]; /*下面幾句把負數的補碼*/

t[0]=~t[0]; /*換算成絕對值*********/

x=t[0]+1; /***********************/

t[0]=x; /***********************/

if(x>255)/**********************/

t[1]++; /*********************/

}

elseTempBuffer1[0]=0x2b; //0xfe為變"+"的ASCII碼

t[1]<<=4; //將高位元組左移4位

t[1]=t[1]&0x70; //取出高位元組的3個有效數字位

x=t[0]; //將t[0]暫存到X,因為取小數部分還要用到它

x>>=4; //右移4位

x=x&0x0f; //和前面兩句就是取出t[0]的高四位

t[1]=t[1]|x; //將高低位元組的有效值的整數部分拼成一個位元組

TempBuffer1[1]=t[1]/100+0x30; //+0x30為變0~9ASCII碼

if(TempBuffer1[1]==0x30)TempBuffer1[1]=0xfe;//百位數消隱

TempBuffer1[2]=(t[1]%100)/10+0x30; //分離出十位

TempBuffer1[3]=(t[1]%100)%10+0x30; //分離出個位

t[0]=t[0]&0x0c; //取有效的兩位小數

t[0]>>=2; //左移兩位,以便查表

x=t[0];

y=dotcode[x]; //查表換算成實際的小數

TempBuffer1[5]=y/10+0x30; //分離出十分位

TempBuffer1[6]=y%10+0x30; //分離出百分位

}

voiddelay(unsignedchari)

{

while(i--);

}

main()

{

unsignedcharTH=110,TL=-20; //下一步擴展時可能通過這兩個變數,調節上下限

//測溫函數返回這個數組的頭地址

while(1)

{

pt=ReadTemperature(TH,TL,0x3f); //上限溫度-22,下限-24,解析度10位,也就是0.25C

//讀取溫度,溫度值存放在一個兩個位元組的數組中,

delay(100);

covert1();

covert0(TH,TL);

LCD_Initial(); //第一個參數列號,第二個為行號,為0表示第一行

//為1表示第二行,第三個參數為顯示數據的首地址

LCD_Print(0,0,TempBuffer0);

LCD_Print(0,1,TempBuffer1);

}

}

//一下是液晶代碼模塊

////////////////////////////////////////////////////////////////////////

#include<at89x51.h>//用AT89C51時就用這個頭文件

//#include<reg52.h>//用華邦W78E58B時必須用這個頭文件

#include<intrins.h>

//注意那個LCD_Wait()函數,它是判"忙"標志的,在實際硬體要把注掉的那種打開

//PortDefinitions**********************************************************

sbitLcdRs =P2^0;

sbitLcdRw =P2^1;

sbitLcdEn =P2^2;

sfrDBPort =0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數據埠

//內部等待函數**************************************************************************

unsignedcharLCD_Wait(void)

{

LcdRs=0;

LcdRw=1; _nop_();

LcdEn=1; _nop_();

//while(DBPort&0x80);//在用Proteus模擬時,注意用屏蔽此語句,在調用GotoXY()時,會進入死循環,

//可能在寫該控制字時,該模塊沒有返回寫入完備命令,即DBPort&0x80==0x80

//實際硬體時打開此語句

LcdEn=0;

returnDBPort;

}

//向LCD寫入命令或數據************************************************************

#defineLCD_COMMAND 0//Command

#defineLCD_DATA 1//Data

#defineLCD_CLEAR_SCREEN 0x01//清屏

#defineLCD_HOMING 0x02//游標返回原點

voidLCD_Write(bitstyle,unsignedcharinput)

{

LcdEn=0;

LcdRs=style;

LcdRw=0; _nop_();

DBPort=input; _nop_();//注意順序

LcdEn=1; _nop_();//注意順序

LcdEn=0; _nop_();

LCD_Wait();

}

//設置顯示模式************************************************************

#defineLCD_SHOW 0x04//顯示開

#defineLCD_HIDE 0x00//顯示關

#defineLCD_CURSOR 0x02 //顯示游標

#defineLCD_NO_CURSOR 0x00//無游標

#defineLCD_FLASH 0x01//游標閃動

#defineLCD_NO_FLASH 0x00//游標不閃動

voidLCD_SetDisplay(unsignedcharDisplayMode)

{

LCD_Write(LCD_COMMAND,0x08|DisplayMode);

}

//設置輸入模式************************************************************

#defineLCD_AC_UP 0x02

#defineLCD_AC_DOWN 0x00//default

#defineLCD_MOVE 0x01//畫面可平移

#defineLCD_NO_MOVE 0x00//default

voidLCD_SetInput(unsignedcharInputMode)

{

LCD_Write(LCD_COMMAND,0x04|InputMode);

}

//初始化LCD************************************************************

voidLCD_Initial()

{

LcdEn=0;

LCD_Write(LCD_COMMAND,0x38);//8位數據埠,2行顯示,5*7點陣

LCD_Write(LCD_COMMAND,0x38);

LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);//開啟顯示,無游標

LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);//清屏

LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);//AC遞增,畫面不動

}

//************************************************************************

voidGotoXY(unsignedcharx,unsignedchary)

{

if(y==0)

LCD_Write(LCD_COMMAND,0x80|x);

if(y==1)

LCD_Write(LCD_COMMAND,0x80|(x-0x40));

}

voidPrint(unsignedchar*str)

{

while(*str!='')

{

LCD_Write(LCD_DATA,*str);

str++;

}

}

voidLCD_Print(unsignedcharx,unsignedchary,unsignedchar*str)

{

GotoXY(x,y);

Print(str);

}

閱讀全文

與單片機溫度報警器相關的資料

熱點內容
QQ聊天記錄journal文件夾 瀏覽:118
蘋果公司雲伺服器地址 瀏覽:85
加密記事本手機 瀏覽:437
汽車壓縮機變頻閥 瀏覽:95
域外伺服器是什麼意思 瀏覽:639
大眾點評伺服器怎麼老卡頓 瀏覽:556
javavector與list的區別 瀏覽:316
java初始化類數組 瀏覽:303
java字元串轉換成json對象 瀏覽:647
android非阻塞socket 瀏覽:358
編譯系統概念 瀏覽:452
天眼通app能做什麼 瀏覽:557
魅族手機怎麼加密圖庫 瀏覽:8
rpa編譯器 瀏覽:572
車載雲伺服器記錄 瀏覽:740
四川金星壓縮機製造有限公司 瀏覽:55
移動平台圖片壓縮演算法 瀏覽:37
銀行項目java 瀏覽:571
怎樣將pdf轉換為ppt 瀏覽:598
純凈伺服器怎麼開服 瀏覽:288