單片機(jī)設(shè)計(jì)溫度計(jì)流程圖源碼實(shí)物圖片要點(diǎn)簡(jiǎn)介_(kāi)第1頁(yè)
單片機(jī)設(shè)計(jì)溫度計(jì)流程圖源碼實(shí)物圖片要點(diǎn)簡(jiǎn)介_(kāi)第2頁(yè)
單片機(jī)設(shè)計(jì)溫度計(jì)流程圖源碼實(shí)物圖片要點(diǎn)簡(jiǎn)介_(kāi)第3頁(yè)
單片機(jī)設(shè)計(jì)溫度計(jì)流程圖源碼實(shí)物圖片要點(diǎn)簡(jiǎn)介_(kāi)第4頁(yè)
單片機(jī)設(shè)計(jì)溫度計(jì)流程圖源碼實(shí)物圖片要點(diǎn)簡(jiǎn)介_(kāi)第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論