版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
DS18B20獲取溫度程序流程圖
DS18B20的讀字節(jié),寫(xiě)字節(jié),獲取溫度的程序流程圖如圖所示。
DS18B20初始化
程序流程圖
l)SIXB2()gr
I_—?
與0x1跳過(guò)
DS1XB20寫(xiě)字節(jié)
讀RCM程中減程圖
寫(xiě)0x44啟司
DSI8B20
延時(shí)500Ms
DS1XB20W
_t&dt-
一—一
與Oxcc跳短
讀ROM
▼DS18B2O讀字節(jié)
”O(jiān)xbe讀程序流程圖
I】、」^KU1
(結(jié)束
DSI8B2O獲取溫度
程序流程圖
圖3-4DS18B20程序流程圖
顯示程序設(shè)計(jì)
顯示電路是由四位一體的數(shù)碼管來(lái)實(shí)現(xiàn)的。由于單片機(jī)的J1/0口有限,因此
數(shù)碼管采用動(dòng)態(tài)掃描H勺方式來(lái)進(jìn)行顯示。程序流程圖如圖所示。
(開(kāi)始)
按鍵程序設(shè)計(jì)
按鍵是用來(lái)設(shè)定上下限報(bào)警溫度的。詳細(xì)H勺程序沆程圖如圖所示。
SO'.-:I限
S=l調(diào)卜取
Tempi
附1源程序代碼
*程序名;基于DS18B20的測(cè)溫系統(tǒng)
*功能:實(shí)時(shí)測(cè)量溫度,超過(guò)上下限報(bào)警,報(bào)警溫度可手動(dòng)調(diào)整。KI是用來(lái)
*進(jìn)入上下限調(diào)整模式的,當(dāng)按一下K1進(jìn)入上限調(diào)整模式,再按一下進(jìn)入下限
*調(diào)整模式。在正常模式下,按一下K2進(jìn)入查行上限溫度模式,顯示1s左右自動(dòng)
*退出:按一下K3進(jìn)入查看下限溫度模式,顯示1s左右自動(dòng)退出:按一下K4消除
*按犍音,再按一下啟動(dòng)按鍵音。在調(diào)整上下限溫度模式下,K2是實(shí)現(xiàn)加I功能,
*KI是實(shí)現(xiàn)減1功能,K3是用來(lái)設(shè)定上下限溫度正負(fù)口勺。
*編程者:ZPZ
*編程時(shí)間:2009/10/2
*****在************************************************X**************/
#includc<AT89X52.h>〃將AT89X52.h頭文獻(xiàn)包括到主程序
#include<intrins.h>〃將inirins.h頭文獻(xiàn)包括到主程序(調(diào)用其中『Lnop_()空操作
函數(shù)延時(shí))
#defineuintunsignedint弁變量類(lèi)型宏定義,用uint表達(dá)無(wú)符號(hào)整形(16位)
#dcfincucharunsignedchar弁變量類(lèi)型宏定義,用uchar表達(dá)無(wú)符號(hào)字符型(8位)
ucharmax=0x00,min=0x00;//max是上限報(bào)警溫度,min是下限報(bào)警溫度
bits=0;//s是調(diào)整上下限溫度時(shí)溫度閃爍的標(biāo)志位,s=0不顯示
200ms,s=l顯示Is左右
bitsl=O;//si標(biāo)志位用于上下限查看時(shí)口勺顯示
voiddisplay1(uintz);//申明display、()函數(shù)
#include"dsl8b20.h"〃將ds!8b20.h頭文獻(xiàn)包括到主程序
#include"keyscan.h"〃將keyscan.h頭文獻(xiàn)包括到主程序
#include"display.h"弁將display.h頭文獻(xiàn)包括到主程序
/***********************主函數(shù)************************/
voidmain()
beer=1;〃關(guān)閉蜂鳴器
lcd=l;〃關(guān)閉LED燈
timerl_init(O);〃初始化定期器1(未啟動(dòng)定期器1)
get_temperature(1);〃初次啟動(dòng)DS18R20獲取溫度(DS18R20卜點(diǎn)后自動(dòng)將
EEPROM中的上下限溫度復(fù)制到TH和TL寄存器)
while(l)〃主循環(huán)
keyscan();〃按鍵掃描函數(shù)
get_temperature(O);〃獲取溫度函數(shù)
keyscan();〃按鍵掃描函數(shù)
display(temp,temp_d*0.625);〃顯示函數(shù)
alarm();〃報(bào)警函數(shù)
keyscan();〃按鍵掃描函數(shù)
)
}
/***********************************************左******************東*
*程序名;_dsl8b20_h_
*功能:DSI8B20H'、Jc51編程頭文獻(xiàn)
*編程者:ZPZ
*編程時(shí)間:2009/10/2
*說(shuō)明:用到的全局變量是:無(wú)符號(hào)字符型變量temp(測(cè)得的溫度整數(shù)部分),temp_d
*(測(cè)得的溫度小數(shù)部分),標(biāo)忑位f(測(cè)量溫度的標(biāo)志位'0'表達(dá)"正溫度"'1'表
*示“負(fù)溫度”),標(biāo)志位f_max(上限溫度的標(biāo)志位’0'表達(dá)“正溫度“、表
*示“負(fù)溫度”),標(biāo)志位f_min(下限溫度的標(biāo)志位,0'表達(dá)“正溫度"、'1'表
*示“負(fù)溫度”).標(biāo)志何M報(bào)警標(biāo)志傳'1'啟動(dòng)報(bào)警'0'關(guān)閉報(bào)警).
***********京******************************************x**************/
#ifndef_ds18b20_h_〃定義頭文獻(xiàn)
#define_dsl8b20h.
#deflneuintunsignedint〃變量類(lèi)型宏定義,用uint表達(dá)無(wú)符號(hào)整形(16位)
#defineucharunsignedchar〃變量類(lèi)型宏定義,用uchar表達(dá)無(wú)符號(hào)字符型(8位)
sbitDQ=P2A3:〃可位尋址變量定義,用DQ表達(dá)P2.3口
sbitbeer=PlA0;〃用beer表達(dá)P1.0
sbitled=PlAl;〃用led表達(dá)Pl.l
uchartemp=0:〃測(cè)量溫度的整數(shù)部分
uchartenip_d=0;〃測(cè)量溫度的小數(shù)部
bitf=0;〃測(cè)量溫度的標(biāo)志位,0'表達(dá)“正溫度"T表達(dá)'‘負(fù)溫度")
bitf_max=O;〃上限溫度的標(biāo)志位'0'表達(dá)"正溫度"'1'表達(dá)"負(fù)溫度”)
bitLmin=0;〃下限溫度的標(biāo)志位'0'表達(dá)“正溫度"、'1'表達(dá)"負(fù)溫度”)
bitw=0;〃報(bào)警標(biāo)志位’1'啟動(dòng)報(bào)警’0'關(guān)閉報(bào)警)
/本車(chē)****木本****米京:$:*****本車(chē)*****京木延時(shí)子函數(shù)**本***小********奈***木*卒*木去**東木*/
voiddsl8b20_dclayus(uint()〃延時(shí)幾P
{while(t-);}
voiddsl8b2O_delayms(uintI)〃延時(shí)1ms左右
uinti.j;for(i=t;i>0;i-)for(j=120;j>0;j-);}
/***********木木木木*****泰本18b20初始彳匕函數(shù)****木木******木****5木**木木木/
voidds18b20_init()//DSI8R201J)^{^
DQ=1;〃拉高數(shù)據(jù)線
DQ=();〃控制器向DS18B20發(fā)低電平脈沖
dsl8b20_delayus(30);〃延時(shí)480口s左右
DQ=1;〃控制器拉高總線,
whilc(DQ);〃等待DS18B20拉低總線
dsl8b20_delayus(20);〃延時(shí),等待上拉電阻拉奇總線
DQ=1;//拉高數(shù)據(jù)線,準(zhǔn)備數(shù)據(jù)傳播:
uchardsl8b20_read()//DSI8B20字節(jié)讀取
uchari;〃定義一種局部變量i(局部變量只在本函數(shù)中有效)
uchard=0;〃定義?種局部變量d
DQ=1;〃準(zhǔn)備讀;
for(i=8;i>0;i-)〃一位一位的讀,循環(huán)8次
i
d?=1;〃d右移一位,低位先發(fā):
DQ=O;
_nop_();_nop_();_nop_();
DQ=1;〃必須寫(xiě)1,否則讀出來(lái)H勺將是不預(yù)期的數(shù)據(jù):
if(DQ)〃在12us處讀取數(shù)據(jù),送給d的最高位
d|=0x80;
dsl8b20_delayus(10);
}returnd;〃返回讀取的值
/*************************dsl8b20字節(jié)寫(xiě)函數(shù)**************************/
voidds1Xb20_write(uchard)〃ds18b20字節(jié)寫(xiě)
uchari;
for(i=8;i>0;i—)〃一位一位的寫(xiě)
DQ=0;
_nop_();_nop_();_nop_();DQ=d&0x0i;〃寫(xiě)數(shù)據(jù)
ds!8b20_delayus(5);
DQ=I;
d?=1;〃d右移一位,低位先發(fā):
/*******彌*******************獲取溫度函數(shù)*左**************************/
voidgct_tcmpcra(urc(bitf)
uchara=0,h=0,c=0,d=0:
uinti;
ds!8b20_init();/DS18B2O初始化
dsl8b20_write(0xcc)y/|?JDSI8B20發(fā)跳過(guò)讀ROM命令
ds18b20_write(0x44);//^DSI8B20進(jìn)行溫度轉(zhuǎn)換命令,轉(zhuǎn)換成果存入內(nèi)部RAM
if(f==l)
〃初次啟動(dòng)DS18B2O進(jìn)行溫度轉(zhuǎn)換需要500ms,若轉(zhuǎn)換時(shí)間不夠就出錯(cuò),讀出的
是85度口勺錯(cuò)誤值。
display1(1);〃用開(kāi)機(jī)動(dòng)畫(huà)耗時(shí)
else
ds18b20_delayins(l);
dsl8b20_init();//DS18B20初始化
ds18b20_write(0xcc);〃向DS18B20發(fā)跳過(guò)讀ROM命令
ds18b20_write(0xbe);〃寫(xiě)讀內(nèi)部RAM中9字節(jié)的內(nèi)容命令
a=ds18b20_read();〃讀內(nèi)部RAM(LSB)
b=ds18b20_rcad();〃讀內(nèi)部RAM(MSB)
if(f==l)〃局部位變量f=l時(shí)讀上下限報(bào)警溫度
f
I
max=ds18b20_read();〃讀內(nèi)部RAM(TH)
min=ds18b20_read();〃讀內(nèi)部RAM(T1)
}
if((max&0x80)==0x80)〃若讀取的上限溫度的最高位(符號(hào)位)為‘1'表明是負(fù)溫度
{匚max=l;max=(max-0x80);}〃將上限溫度符號(hào)標(biāo)志位置'1'表達(dá)負(fù)溫度,將上限溫度
轉(zhuǎn)換成無(wú)符號(hào)數(shù)。
if((min&0x80)=0x80)〃若讀取的下限溫度的最高位(符號(hào)位)為T(mén)表明是負(fù)溫度
{f_n】in=l:min=(min-0x80);}〃將下限溫度符號(hào)標(biāo)志位置'1'表達(dá)負(fù)溫度,將下限溫度裝
換成無(wú)符號(hào)數(shù)。
i=b;i?=4;
if(i==O)
(
f=0;小為0,表達(dá)讀取的溫度是正溫度,設(shè)置正溫度標(biāo)識(shí)
temp=((a?4)|(b?4));〃整數(shù)部分
a=(a&OxOf);
temp_d=a;〃小數(shù)部分
)
else
(
f=l;/八為1,表達(dá)讀取的溫度是負(fù)溫度,設(shè)置負(fù)溫度標(biāo)識(shí)
a=~a+l;〃負(fù)數(shù)的小數(shù)部分取反加1
b=~b;〃負(fù)數(shù)的整數(shù)部分取反
temp=((a?4)|(h?4));〃整數(shù)部分
a=(a&OxOf);〃小數(shù)部分,低四位為小數(shù)位
temp_d=a;
產(chǎn)*******:$:****今******赤****存儲(chǔ)極限溫度函數(shù)*****宰******:$:****未室********/
voidstore」。
if(f_max==l)〃若上限溫度為負(fù),將上限溫度轉(zhuǎn)換成有符號(hào)數(shù)(最高1是負(fù),0是正)
niax=max+0x80:
if(fLmin==l)〃若卜.限溫度為負(fù),將卜限溫度轉(zhuǎn)換成有符號(hào)數(shù)
min=min+0x80;
dsl8b20_init();“DSI8B20初始化
dsl8b20_write(0xcc);〃向DS18B20發(fā)跳過(guò)讀ROM命令
ds18b20_writc(0x4c);〃向DSI8B20發(fā)寫(xiě)字節(jié)至?xí)捍嫫?和3(TH和TL)命令
dsl8b20_write(max);〃向暫存器TH(上限溫度暫存器)寫(xiě)溫度
dsl8b20_write(min);〃向暫存器TL(下限溫度暫存器)寫(xiě)溫度
dsl8b20_write(0xft);〃向配置寄存器寫(xiě)命令,進(jìn)行溫度值辨別率設(shè)置
dsl8b20_init();//DS18B20初始化
ds18b20_write(0xcc);〃向DS18B20發(fā)跳過(guò)讀ROM命令
dsl8b20_write(0x48);〃向DSI8B20發(fā)將RAM中2、3字節(jié)的內(nèi)容寫(xiě)入EEPROM
)//DS18R20卜電后會(huì)自動(dòng)將FEPRCM中的卜下限溫度拷貝到TH、TL暫
存器
/*************中***********?:溫度超限艮警函數(shù)****************:):********/
voidalarmO
if(f_max==0)〃若上限值是正值
if(f_min==0)〃若下限值是止值
if(f==O)〃若測(cè)量值是正值
if((tcmp+temp_d*0.0625)<=min||(tcmp+tcmp_d*0.0625)>=max)
{w=l;TRl=l;}〃當(dāng)測(cè)量值不不小于?最小值或不小于最大值時(shí)報(bào)
if((tcmp+tcmp_d*0.0625)<max&&(tcmp+tcmp_d*0.0625)>min)
{w=0;}〃當(dāng)測(cè)量值不小于最小值且不不小于最大值時(shí)不
報(bào)警
if(f==1){w=I:TR1=1:}〃若測(cè)量值是負(fù)值時(shí)報(bào)警
if(f_min==l)〃若下限值是負(fù)值
if(f==O)〃若測(cè)量值是止值
if((temp+tcmp_d*0.0625)>=max)〃當(dāng)測(cè)量值不小于最大值時(shí)報(bào)警
(w=l:TRl=l;)
if((temp+temp_d*0.0625)<max)〃當(dāng)測(cè)量值不不小「最大值時(shí)不報(bào)警
{w=0;}
if(f==l)〃若測(cè)量值是負(fù)值
{if((temp+temp_d*0.0625)>=min)〃當(dāng)測(cè)量值不小于最小值時(shí)報(bào)警
{w=l;TRl=l;}
if((temp+temp_d*0.0625)<min)//當(dāng)測(cè)量值不不小于最小值時(shí)不報(bào)警
{w=0;}
if(f_max==l)〃若上限值是負(fù)值
if(Cniin==l)〃若下限值是負(fù)值
if(f==l)〃若測(cè)量值是負(fù)值
if((temp+temp_d*0.0625)<=max||(temp+temp_d*0.0625)>=min)
(w=i;TRl=l;}〃當(dāng)測(cè)量值不不小于最大值或不小于最小值時(shí)報(bào)
警,比較的是其絕空值
if((lemp+temp_d*0.0625)<min<^^(temp+tenip_d*0.06?5)>max)
{w=0;}〃當(dāng)測(cè)量值不不小于最小值且不小于最大值時(shí)不
報(bào)警
if(f==O){w=I;TR1=I;}〃若測(cè)量值是正值時(shí)報(bào)警
)
#endif
/**********************************************************************
*程序名;―keyscan_H—
*功能:dsl8b20鍵盤(pán)頭文獻(xiàn),通過(guò)鍵盤(pán)設(shè)定設(shè)定上下限報(bào)警溫度
*編程者:ZPZ
*編程時(shí)間:2009/10/2
#ifndef—keyscan_H—〃定義頭文獻(xiàn)
#define_keyscan_H—
sbitkeyl=P2A2;〃可位尋址變量定義,用keyl表達(dá)P2.2口
sbitkey2=P2A1;〃用key2表達(dá)P2.1口
sbitkcy3=P2A0;〃用key3表達(dá)P2.0口
sbitkey4=P3A3;〃用key4表達(dá)P3.3U
nchnri=0;〃定義全局變量i用干不一樣功能模式的選擇,'0'
正常模式,'I'上限調(diào)整模式,’2'下限調(diào)整模式
uchara=0;//定義全局變量a用于不一樣模式下數(shù)碼管顯示的選擇
bitk4=0;〃K4按鍵雙功能選擇位,k4=0時(shí)K4按鍵選擇消按鍵音的功能,k4=l時(shí)
K4按鍵選擇正負(fù)溫度設(shè)定功轉(zhuǎn)
bitv=0;〃K2、K3按鍵雙功能選擇位,v=0時(shí)選擇上下限查看功能,v=l時(shí)選擇上
下限溫度加減功能
bitvl=O;//vl=l時(shí)定期1250ms時(shí)間到自動(dòng)關(guān)閉報(bào)警上下限查看功能
bitv2=0;〃消按鍵音功能調(diào)整位,為'0'時(shí)開(kāi)按鍵音,為'1'時(shí)關(guān)按鍵音
voidkeyscan_delay(uintz)〃延時(shí)1ms左右
uinti,j;
fbr(i=z;i>O;i-)
for(j=l20;j>0;j-);
inttemp_change(intcount,bitf)〃上下限溫度調(diào)整
if(kcy2==0)〃判斷K2與否按下
{if(v2==0)beer=0;〃v2=0開(kāi)按鍵音,否則消按鍵音
keyscan_delay(10);〃延時(shí)10ms
if(key2==0)〃再次判斷K2與否按下(實(shí)現(xiàn)按按鍵時(shí)消抖)
bccr=l;〃K2按下關(guān)按鍵音
if(f==O)〃若溫度為正
count++;〃每按一下K2溫度上調(diào)1
if(a==l){if(count>125)count=l25;}〃當(dāng)溫度值不小于125時(shí)不上調(diào)
if(a==2){if(count>125)couni=125;}
if(f!=O)〃若溫度為負(fù)
count++;〃每按一下K2溫度下調(diào)1
if(a==l){if(count>55)counl=55;)〃當(dāng)溫度值不不小于-55時(shí)不再下調(diào)
if(a==2){if(count>55)count=55;}
)
)
while(key2==0);keyscan_delay(10);〃K2松開(kāi)按鍵時(shí)消抖
if(key3==0)
if(v2==0)heer=0:key*can_delay(10);
if(key3==0)//K3按按鍵時(shí)消抖
becr=1;
count-;〃每按一下K3溫度為正時(shí)下調(diào)1,為負(fù)時(shí)上調(diào)1
if(a==1)(if(count<0)count=0;}〃當(dāng)溫度值到達(dá)0時(shí)不再調(diào)
if(a==2){if(couni<0)coun(=0;}
)
while(key3==0);keyscan_delay(10);//K3松開(kāi)按鍵時(shí)消抖
returncount;
/*********************黎***:?***1實(shí)鍵盤(pán)函數(shù)*******京*******冬****京*******秦*/
voidkeyscan()
if(kcyl==O)
if(v2==O)beer=0;keyscan_delay(10);
if(keyl==O)//KI按按鍵時(shí)消抖
bccr=l;
TR1=1;〃開(kāi)定期器1,通過(guò)s標(biāo)志位的變化,實(shí)目前上下限溫度調(diào)整時(shí)溫度顯示
時(shí)閃爍H勺功能
k4=l;〃在上下溫度調(diào)整功能模式下選擇K4的調(diào)整上下限溫度正負(fù)的功能
v=l;〃在上下溫度調(diào)整功能模式下選擇K2、K3日勺溫度加減功能
i++;〃K1按一下ilJIIl,i='O'進(jìn)入正常模式,i=T'進(jìn)入調(diào)上限模式,i二
’2'進(jìn)入調(diào)下限模式
if(i>2)//K1按下三次后退出調(diào)整模式
i=O;〃進(jìn)入正常模式
TR1=O;〃關(guān)定期器1
k4=0;〃在正常模式下選擇K4的消按鍵音功能
v=O;〃在正常模式卜選擇K2、K3的查看上下限報(bào)警溫度功能
storc_t();〃存儲(chǔ)調(diào)整后的上下限報(bào)警溫度
switch(i)〃顯示選擇
{
caseO:a=O;break;//a=O選擇顯示測(cè)得的溫度
casel:a=l;break;//a=l選擇顯示上限溫度
case2:a=2;break;//a=2選擇顯示下限溫度
default:break,
}
}
while(key1==O);〃K1松按鍵時(shí)消抖
keyscan_delay(10);
if(a==l&&v==l)//a=l選擇顯示上限溫度且v=l時(shí)選擇上下限溫度加功能
{led=O;max=temp_change(max,ILmax);}〃顯示上限溫度
elseif(a==2&&v==l)//a=2選擇顯示下限溫度且v=l時(shí)選擇上下限溫度減功能
{lcd=l;min=tcmp_change(min,L^in)^}
else;
if(k4==l)//k4=l時(shí)K4按鍵選擇正負(fù)溫度設(shè)定功能
{
if(key4==0)
{
if(v2==0)beer=0;keyscan_delay(5);
if(key4==0)
{bcer=1;
if(a==l)
(if(max>55)f_max=O;elsef_max=~f_max;)〃當(dāng)溫度不小于55度時(shí),只能設(shè)
定為正溫度
if(a==2)
{if(min>55)f_max=O;elsef_min=~f_min;}〃當(dāng)溫度不小「55度時(shí),只能設(shè)定
為止溫度
while(key4==0);keyscan_delay(10);
if(v==O)〃v=0時(shí)選擇上下限查看功能
if(key2==0)
if(v2==0)beer=0;keyscan_delay(IO);
if(key2==0)
beer=1;
a=l;〃選擇上限顯示
TR1=1;〃開(kāi)定期器I開(kāi)始定期一分鐘左右
sl=l;〃上限顯示不閃爍,顯示一分鐘左右自動(dòng)退出
while(key2==0);keyscan_delay(IO);
if(kcy3==0)
if(v2==0)heer=0:keyscan_delay(10);
if(key3==0)
bcer=1;
a=2;〃選擇下限顯示
TR1=1;〃開(kāi)定期器1開(kāi)始定期1s
sl=l:〃下限顯示不閃爍,顯示1s自動(dòng)退出
while(key3==0);keyscan_delay(10);
if(vl==l)//vl=l時(shí)定期Is時(shí)間到自動(dòng)美閉報(bào)警上下限查看功能
{a=O;vl=O;TRl=O;)〃a=0顯示實(shí)測(cè)溫度,清零,關(guān)定期器1
if(k4==0)//k4=0時(shí)K4按鍵選擇消按灌音的功能
if(kcy4==0)
if(v2==0)beer=0;keyscan_delay(10);
if(key4==0)
becr=l;v2=~v2;〃為‘O'時(shí)開(kāi)按鍵音,為‘1'時(shí)關(guān)按鍵音
while(key4==0);
keyscan_dclay(IO);
)
#endif
/*************木******木*******本***********************木****灰*******木****
*程序名;_ds18b20_display_H_
*功能:dsl8b20數(shù)碼管動(dòng)態(tài)顯示頭文獻(xiàn),通過(guò)定期器。延時(shí)實(shí)現(xiàn)數(shù)碼管動(dòng)態(tài)顯示
*編程者:ZPZ
*編程時(shí)間:2009/10/2
******************京秦************秦******************9fC**X***************/
#ifndef—ds18b20_display_H_〃定義頭文獻(xiàn)
#dcfinc__ds!8b20_display_H_
#defineuintunsignedint〃變量類(lèi)型宏定義,用uint表達(dá)無(wú)符號(hào)整形(16位)
#defineucharunsignedchar〃變量類(lèi)型宏定義,用uchar表達(dá)無(wú)符號(hào)字符型(8位)
sbitweiI=P2A4:〃可位尋址變量定義,用weil表達(dá)P2.4口
sbitwei2=P2A5;//fflwei2表達(dá)P2.5□
sbitwei3=P2A6;〃用wei3表達(dá)P2.6口
sbitwei4=P2A7;〃用wei4表達(dá)P2.7U
nchnrnuni=O;//定義num為全局無(wú)符號(hào)字符型變量.賦初值為'0'
ucharcodetemperatureI[]={0x3f,0x06,0x5b,0x4f.0x66,
0x6d.0x7d,0x07,0x7L0x6f);〃定義顯示碼表0~9
ucharcodetemperaturc2[l={0xbf,0x86.0xdb,0xcf,0xe6.
0xed,0xfd,0x87,0xff,0xef};〃帶小數(shù)點(diǎn)的O.~9.
ucharcodetemperalure3[]={0xD0.0x80,0x40,0x76.0x38};〃依次是'不顯示‘*H
'L'
voiddisplay_delay(uintt)〃延時(shí)1ms左右
uinti.j;
for(i=t;i>0;i-)
for(j=120;j>0;j--);
/**************************定期器]初始化函數(shù)***************************/
voidtimerl_init(bitt)
TMOD=OxlO;〃設(shè)定定期器1工作在方式1,最大定期65.53ms
TH0=0x3c;〃定期器賦初值,定期50ms
TL0=0xb0;
EA=1;〃開(kāi)總中斷
ET1=1;〃開(kāi)定期器1中斷
TRl=t;//局部變量t為1啟動(dòng)定期器1,為0關(guān)閉定期器I
/**************************定期器1
voidtimer!()interrupt3
TH0=0x3c;〃重新賦初值,定期50nls
TL0=0xb0;
num++;〃每進(jìn)入一次定期器中斷num加11每50ms加1一次)
if(num<5)
{s=1;if(w==1){beer=1;led=1;}else{beer=l;led=1;}}
Else〃進(jìn)入4次中斷,定期200ms時(shí)若報(bào)警標(biāo)志位w為則啟動(dòng)報(bào)警,不為‘1'不
啟動(dòng)
〃實(shí)現(xiàn)間歇性報(bào)警功能
{s=0;if(w==1){beer=0;led=0;}else{bccr=l;lcd=1:}}
if(num>20)〃進(jìn)入20次中斷,定期Is
num=0;“num歸0,重新定開(kāi)始定期Is
sl=0;〃定期Is時(shí)間屆時(shí)自動(dòng)關(guān)閉報(bào)警上下限顯示功能
vl=l;〃定期1s時(shí)間屆時(shí)自動(dòng)關(guān)閉報(bào)警上下限查看功能
voidselsct_l(ucharf,uchark)〃消除百位的0顯示,及正負(fù)溫度的顯示選擇
if(f==O)〃若為正溫度,百位為0則不顯示百位,不為0則顯示
if(k/100==0)P0=:cnipcraturc3[0];elsePO=tcmperaturc1[k/100];
}
if(f==l)〃若為負(fù)溫度,若十位為0,百位不顯示,否則百位顯示
{
if(k%l(X)/IO==O)P0=temperature3l0J;elseP0=teniperature3[2J;
)
)
voidselsct_2(bitCuchark)〃消除十位的0顯示,及正負(fù)溫度日勺顯示選擇
{
if(f==O)弁若為正溫度,百位十位均為0則不顯示十位,否則顯示十位
{if((k/100==0)&&(k%100/10==0))P0=temperature3[0];
elsePO=temperatureI[k%100/10J;
)
if(f==l)〃若為負(fù)溫度,若十位為0,十位不顯示,否則十位顯示
{if(k%100/10==0)P0=teniperature3|2];
ekePO=teinpfirnlurel[k%100/10];
/****************************主顯示函數(shù)********************************/
voiddisplay(uchart,uchart_d)〃用于實(shí)測(cè)溫度、上限溫度I肉顯示
uchari;
for(i=0;i<4;i++)〃依次從左至右選通數(shù)碼管顯示,實(shí)現(xiàn)動(dòng)態(tài)顯示
switch(i)
case0:〃選通第一種數(shù)碼管
if(a==O){selsct_1(f,t);}〃若a=0則在第?種數(shù)碼管上顯示測(cè)量溫度f(wàn)、J百位或
if(a=l)
PO=teniperature3l3J;〃若a=l則在第一種數(shù)碼管上顯示4H,
)
if(a==2)
P0=(empcraturc3[4];〃若a=2則在第一種數(shù)碼管上顯示'L'
wei2=0:〃關(guān)第二個(gè)數(shù)碼管
wci3=0;〃關(guān)第三個(gè)數(shù)碼管
wei4=0;〃關(guān)第四個(gè)數(shù)碼管
wcil=l;〃開(kāi)第一種數(shù)碼管
break;
case1:〃選通第二個(gè)數(shù)碼管
if(a==0){selsct_2(f,t);}〃若a=0則在第二個(gè)數(shù)碼管上顯示測(cè)量溫度的十位或
if(a==l)/偌a=l則在第二個(gè)數(shù)碼管上顯示上限報(bào)警溫度口勺百位或
(
if(s==O)selsct」(f_max,max);〃若s=0則顯示第二個(gè)數(shù)碼管,否則不顯示
elseP0=temperature3[0J;〃通過(guò)s標(biāo)志位I向變化實(shí)現(xiàn)調(diào)整上下限報(bào)警
溫度時(shí)數(shù)碼管H勺閃爍
if(sl==l)selsct_l(f_max,max);/^sl=l則顯示第二個(gè)數(shù)碼管(si標(biāo)志位用于
上下限查看時(shí)日勺顯示)
)
if(a==2)〃若a=2則在第二個(gè)數(shù)碼管上顯示下限報(bào)警溫度口勺百位或
(
if(s==O)selsct_l(f_niin,min);
elseP0=temperature3(0);
if(sl==l)selsct」((_min,min);
}
wei1=0;wei3=0:wei4=0;wei2=1;break;
case2:〃選通第三個(gè)數(shù)碼管
if(a==0){P0=icnipcraiurc2[l%10];)〃若a=0則在
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年綠色環(huán)保知識(shí)與應(yīng)用能力實(shí)操試題
- 2026年旅游目的地文化與習(xí)俗介紹導(dǎo)游文化素養(yǎng)及講解能力考核題
- 2026年心理學(xué)基礎(chǔ)理論章節(jié)練習(xí)社會(huì)心理學(xué)
- 建筑施工安全生產(chǎn)事故應(yīng)急救援預(yù)案制度(標(biāo)準(zhǔn)版)
- 2026年關(guān)于推出新商務(wù)談判專(zhuān)業(yè)測(cè)試題目了解現(xiàn)代商務(wù)核心要點(diǎn)
- 2026年數(shù)學(xué)建模與統(tǒng)計(jì)分析試題集
- 2026年信息安全技術(shù)與網(wǎng)絡(luò)安全公需課測(cè)驗(yàn)題
- 海關(guān)監(jiān)制考試題及答案
- 國(guó)際信托面試題及答案
- 手衛(wèi)生知識(shí)試題及答案
- 海參供貨合同范例
- 工程勘察設(shè)計(jì)行業(yè)質(zhì)量管理體系
- 復(fù)方蒲公英注射液對(duì)心血管系統(tǒng)作用研究
- 2021-2022學(xué)年浙江省寧波市鎮(zhèn)海區(qū)蛟川書(shū)院八年級(jí)(上)期末數(shù)學(xué)試卷(附答案詳解)
- (新版)老年人能力評(píng)估師理論考試復(fù)習(xí)題庫(kù)(含答案)
- 光纖激光打標(biāo)機(jī)說(shuō)明書(shū)
- 治理現(xiàn)代化下的高校合同管理
- 境外宗教滲透與云南邊疆民族地區(qū)意識(shí)形態(tài)安全研究
- GB/T 28920-2012教學(xué)實(shí)驗(yàn)用危險(xiǎn)固體、液體的使用與保管
- ARDS患者的護(hù)理查房課件
- 人大企業(yè)經(jīng)濟(jì)學(xué)考研真題-802經(jīng)濟(jì)學(xué)綜合歷年真題重點(diǎn)
評(píng)論
0/150
提交評(píng)論