基于單片機(jī)時鐘顯示的溫度傳感系統(tǒng)_第1頁
基于單片機(jī)時鐘顯示的溫度傳感系統(tǒng)_第2頁
基于單片機(jī)時鐘顯示的溫度傳感系統(tǒng)_第3頁
基于單片機(jī)時鐘顯示的溫度傳感系統(tǒng)_第4頁
基于單片機(jī)時鐘顯示的溫度傳感系統(tǒng)_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、基于單片機(jī)時鐘顯示的溫度傳感系統(tǒng)摘要:詳細(xì)介紹關(guān)于stc89c52與溫度傳感器ds18b20設(shè)計一個溫度傳感電路;包括時鐘芯片ds1302、溫度傳感器ds18b20、反相器74ls240和七段數(shù)碼管。組成智能數(shù)字溫度功能系統(tǒng)。關(guān)鍵字:stc89c52;ds18b20;溫度傳感器一.原理概述1、stc89單片機(jī)具有在系統(tǒng)可編程(isp)特性,isp 的好處是:省去購買通用編程器,單片機(jī)在用戶系統(tǒng)上即可下載/ 燒錄用戶程序,而無須將單片機(jī)從已生產(chǎn)好的產(chǎn)品上拆下,再用通用編程器將程序代碼燒錄進(jìn)單片機(jī)內(nèi)部。有些程序尚未定型的產(chǎn)品可以一邊生產(chǎn),一邊完善,加快了產(chǎn)品進(jìn)入市場的速度,減小了新產(chǎn)品由于軟件缺陷

2、帶來的風(fēng)險。由于可以將程序直接下載進(jìn)單片機(jī)看運(yùn)行結(jié)果故也可以不用仿真器。引腳圖如下: 2、ds1302的引腳排列,其中vcc1為后備電源,vcc2為主電源。在主電源關(guān)閉的情況下,也能保持時鐘的連續(xù)運(yùn)行。ds1302由vcc1或vcc2兩者中的較大者供電。當(dāng)vcc2大于vcc10.2v時,vcc2給ds1302供電。當(dāng)vcc2小于vcc1時,ds1302由vcc1供電。x1和x2是振蕩源,外接32.768khz晶振。rst是復(fù)位/片選線,通過把rst輸入驅(qū)動置高電平來啟動所有的數(shù)據(jù)傳送。rst輸入有兩種功能:首先,rst接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,rst提供終止單字節(jié)或

3、多字節(jié)數(shù)據(jù)的傳送手段。當(dāng)rst為高電平時,所有的數(shù)據(jù)傳送被初始化,允許對ds1302進(jìn)行操作。如果在傳送過程中rst置為低電平,則會終止此次數(shù)據(jù)傳送,i/o引腳變?yōu)楦咦钁B(tài)。上電運(yùn)行時,在vcc2.5v之前,rst必須保持低電平。只有在sclk為低電平時,才能將rst置為高電平。i/o為串行數(shù)據(jù)輸入輸出端(雙向),后面有詳細(xì)說明。sclk始終是輸入端。 下圖為ds1302的引腳功能圖x1,x232.768khz晶振引腳gnd地rst復(fù)位i/o數(shù)據(jù)輸入/輸出sclk串行時鐘vcc1電池引腳vcc2主電源引腳3、dallas最新單線數(shù)字溫度傳感器ds18b20簡介新的“一線器件”體積更小、適用電壓更

4、寬、更經(jīng)濟(jì) dallas 半導(dǎo)體公司的數(shù)字化溫度傳感器ds1820是世界上第一片支持 “一線總線”接口的溫度傳感器。一線總線獨(dú)特而且經(jīng)濟(jì)的特點(diǎn),使用戶可輕松地組建傳感器網(wǎng)絡(luò),為測量系統(tǒng)的構(gòu)建引入全新概念。ds18b20也 支持“一線總線”接口,測量溫度范圍為-55c+125c,在-10+85c范圍內(nèi),精度為0.5c。ds1822的精度較差為 2c ?,F(xiàn)場溫度直接以“一線總線”的數(shù)字方式傳輸,大大提高了系統(tǒng)的抗干擾性,適合于惡劣環(huán)境的現(xiàn)場溫度測量。ds18b20可以程序設(shè)定912位的分辨率,精度為0.5c??蛇x更小的封裝方式,更寬的電壓適用范圍。分辨率設(shè)定,及用戶設(shè)定的報警溫度存儲在eeprom

5、中,掉電后依然保存。 ds18b20內(nèi)部結(jié)構(gòu)主要由四部分組成:64位光刻rom、溫度傳感器、非揮發(fā)的溫度報警觸發(fā)器th和tl、配置寄存器。ds18b20的管腳排列如右圖:4、74ls240是一種芯片向eprom2764寫入程序機(jī)器碼,通過程序固化器將下列程序中對應(yīng)的機(jī)器碼,依次寫入到eprom2764的0000h0015h地址單元中。 機(jī)器碼 地址 程序 org 0000h ;表示程序從地址0000h存放 75 90 00 0000h start: mov p1,#00h 11 17 0003h acall delay ;延時一段時間,便于觀察 75 90 ff 0005h mov p1,#0

6、ffh 11 17 0008h acall delay ;延時 80 e9 000ah sjmp start ;返回,從start開始重復(fù) 7b ff 000ch delay: mov r3,#0ffh ;一段延時子程序 7c ff 000eh del2: mov r4,#0ffh 00 0010h del1: nop dc fd 0011h djnz r4,del1 db f9 0013h djnz r3,del2 22 0015h ret ;子程序返回 end ;表示程序結(jié)束 由于單片機(jī)驅(qū)動能力太弱無法驅(qū)動七段數(shù)碼管所以要用74ls240來增強(qiáng)其驅(qū)動能力。5、共陽管是指將所有發(fā)光二極管的陽

7、極接到一起形成公共陽極(com)的數(shù)碼管。共陽數(shù)碼管在應(yīng)用時應(yīng)將公共極com接到+5v,當(dāng)某一字段發(fā)光二極管的陰極為低電平時,相應(yīng)字段就點(diǎn)亮。當(dāng)某一字段的陰極為高電平時,相應(yīng)字段就不亮。共陰數(shù)碼管是指將所有發(fā)光二極管的陰極接到一起形成公共陰極(com)的數(shù)碼管。共陰數(shù)碼管在應(yīng)用時應(yīng)將公共極com接到地線gnd上,當(dāng)某一字段發(fā)光二極管的陽極為高電平時,相應(yīng)字段就點(diǎn)亮。當(dāng)某一字段的陽極為低電平時,相應(yīng)字段就不亮。二、實(shí)驗(yàn)電路圖及功能介紹部分引腳連線如下:1、 p1.0p1.7分別接u2(74ls240)a1a4、b1b4;2、p2.2p2.7分別接u3(74ls240)a1a4、b1、b2;2、

8、u2(74ls240)的1y11y4、2y12y4分別接數(shù)碼管a、b、c、d、e、f、g、dp。電路功能: 顯示周圍壞境溫度;然后時鐘顯示小時、分、秒;再顯示年、月、日最后顯示星期。四個過程循環(huán)顯示。 其中初始時鐘設(shè)為09 02 28(09年02月28日);23 59 30(23時59分30秒);7(星期日)。三程序代碼:#include /定義頭文件#include /定義頭文件#include /定義頭文件sbit dula=p24;/定義dula代表p2.4口sbit wela=p25; sbit jj=p26;sbit kk=p22;sbit oo=p23;sbit pp=p27;sb

9、it ds=p21;#define uchar unsigned char#define unint unsigned intunint temp;/? / variable of temperature uchar flag1;/?/ sign of the result positive or negative /* 時鐘程序*/sbit t_clk=p32; /實(shí)時時鐘的時鐘線引腳sbit t_io=p33; /* 實(shí)時時鐘的數(shù)據(jù)線*/sbit t_rst=p34; /實(shí)時時鐘的復(fù)位線引腳sbit gw=p22; /個位sbit sw=p23; /十位sbit bw=p24; /百位sb

10、it qw=p25; /千位sbit ww=p26; /數(shù)碼管選通位sbit yt=p32; sbit sww=p27; /數(shù)碼管選通位unint a6;/=0,0,0,0; /*位段的數(shù)字*/uchar code ledk10=0xc0,0xf9,0xa4,0xb0,0x99 ,0x92,0x82,0xf8, 0x80,0x90;/不加小數(shù)點(diǎn) uchar code ledk110=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10;/加了小數(shù)點(diǎn)unint uccurtime7=30,59,23,28,2,0x07,0x09; / 秒 分 時 日

11、 月 星期 年 unint temp,dfdf,dwdw;uchar data buffer1=0; p2_0=0;/選通74ls240unsigned char code table= 0xc0,0xf9,0xa4,0xb0, 0x99 ,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e,0x00; /溫度傳感器位段的數(shù)字unsigned char code table1=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10 ;/加了小數(shù)點(diǎn)溫度傳感器位段的數(shù)字void delay(u

12、nint count)/定義延時子函數(shù) unint i; /初始化while(count) i=200; while(i0) i-; count-; void init_com(void) /溫度傳感器初始化程序 tmod = 0x20; /定時器1工作在模式2的方式下 pcon = 0x00; /初始化電源管理寄存器 scon = 0x50; /串口工作在模式1的方式下 th1 = 0xfd;/定時器高位寄存器初始化 tl1 = 0xfd; /定時器低位寄存器初始化 tr1 = 1;/啟動定時器 void dsreset(void)/ ds18b20發(fā)送命令和初始化函數(shù) unint i; /

13、初始化ds=0; /產(chǎn)生秒沖,用于初始化i=103; /用于延時使用while(i0)i-; /產(chǎn)生精確的延時大于470usds=1; /產(chǎn)生脈沖。這期間可以用于數(shù)據(jù)的采集和發(fā)送命令等i=4; while(i0)i-; /稍微延時一下 bit tmpreadbit(void) / 讀一位數(shù)據(jù) unint i; bit dat; /讀取到的數(shù)據(jù)值 ds=0;i+;/產(chǎn)生脈沖并延時 ds=1;i+;i+; /產(chǎn)生脈沖延時 dat=ds; /將總線上的數(shù)據(jù)存入到dat中 i=8;while(i0)i-;/依次讀8位數(shù)據(jù) return (dat); /返回數(shù)據(jù) uchar tmpread(void)/

14、 讀取一個字節(jié)的數(shù)據(jù) uchar i,j,dat; dat=0; for(i=1;i=8;i+) /讀8位數(shù)據(jù) j=tmpreadbit(); /將讀取到每一位的數(shù)據(jù)存儲在j中dat=(j1); /讀出的數(shù)據(jù)最低位在最前面,這樣剛好一個字節(jié)在dat里 return(dat); /返回讀取到的數(shù)據(jù) void tmpwritebyte(uchar dat)/ 寫一個字節(jié)到ds18b20里 unint i; uchar j; bit testb; /定義一位變量for(j=1;j1; /數(shù)據(jù)左移一位繼續(xù)寫一位數(shù)據(jù)if(testb) /寫1 ds=0; i+;i+; ds=1; i=8;while(i

15、0)i-; else ds=0; /寫0 i=8;while(i0)i-; ds=1; i+;i+; void tmpchange(void)/ 溫度轉(zhuǎn)變函數(shù) dsreset();/初始化ds18b20delay(1); /延時tmpwritebyte(0xcc); /跳過序列號命令tmpwritebyte(0x44); /發(fā)送溫度轉(zhuǎn)換命令 unint tmp()獲得溫度 float tt; uchar a,b; dsreset(); delay(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe); /發(fā)送讀取數(shù)據(jù)命令a=tmpread(); b=tmprea

16、d();/連續(xù)讀兩個字節(jié)數(shù)據(jù)temp=b; temp0;a-) for(b=60;b0;b-); void display8(unint temp)/顯示程序 uchar a1,a2,a2t,a3,ser; /定于局部變量 kk=0; oo=0; pp=0; ser=temp/10; /取溫度值的整數(shù)部分 sbuf=ser; a1=temp/100; /整數(shù)部分取百位整數(shù) a2t=temp%100; /取整數(shù)部分對100的余數(shù)部分 a2=a2t/10; /取十位數(shù)據(jù) a3=a2t%10; /取個位數(shù)據(jù) dula=0; /數(shù)碼管位鎖存器位選信號有效 p1=tablea3;/顯示百位 dula=1

17、; /所存數(shù)據(jù),位選信號置高delay(1); dula=0; p1=table1a2;/顯示十位 wela=1; /所存數(shù)據(jù)delay(1); /延時函數(shù) wela=0; /數(shù)碼管段鎖存器位選信號有效 p1=tablea1;/顯示個位 jj=1; delay(1);jj=0; void delay4() /延時uchar m,n;for(m=5;m0;m-)for(n=100;n0;n-);void v_rtinputbyte(uchar ucda) /寫1個字節(jié)的數(shù)據(jù)uchar i;acc=ucda;for(i=8;i0;i-) if(acc&0x01)=1) /t_io=acc0; /相

18、當(dāng)于匯編中的rrc t_io=1; else t_io=0;/if(acc&0x01)=0) t_clk=1; t_clk=0; acc=acc1; uchar uc_rtoutputbyte(void)/輸出一個字節(jié)uchar i,acc;acc=0;for(i=0;i1; / 相當(dāng)于匯編中的rrc if(t_io=1) acc=acc|0x80; t_clk=1; t_clk=0;return(acc);/返回值void v_w1302(uchar ucaddr,uchar ucda)/向時鐘寄存器寫數(shù)據(jù)t_rst=0;t_clk=0;t_rst=1;v_rtinputbyte(ucadd

19、r); /地址,命令v_rtinputbyte(ucda); /寫1byte數(shù)據(jù)t_clk=1;t_rst=0;uchar uc_r1302(uchar ucaddr)/讀出數(shù)據(jù)unsigned char ucda,k;t_rst=0;t_clk=0;t_rst=1;v_rtinputbyte(ucaddr); /地址命令 ,輸入一個字節(jié)的數(shù)據(jù)。 寫入讀地址的控制命令。ucda=uc_rtoutputbyte();/ 讀取1byte數(shù)據(jù)t_clk=1;t_rst=0;k=ucda/16; /在將10進(jìn)制的數(shù)轉(zhuǎn)化為16進(jìn)制的數(shù)。ucda=ucda%16;ucda=ucda+k*10;return

20、(ucda);void v_set1302()/時鐘初始化uchar i,j;uchar ucaddr=0x80; v_w1302(0x8e,0x00); /控制命令,wp=0,寫操作for(i=0;i7;i+)j=uccurtimei; v_w1302(ucaddr,j); /秒 分 時 日 月 星期 年 ucaddr +=2;v_w1302(0x8e,0x80); /控制命令,wp=1,寫保護(hù)void v_get1302() /讀1302里的數(shù)據(jù)。uchar i;uchar ucaddr=0x81;for (i=0;i7;i+)uccurtimei=uc_r1302(ucaddr);/格式

21、為: 秒 分 時 日 月 星期 年 ucaddr +=2;void t2_10()unint k; a5=dfdf/10; a4=dfdf%10; a3=temp/1000; k=temp%1000; a2=k/100; k=k%100; a1=k/10; a0=k%10; void t2_11()unint k; a0=dwdw%10; /*顯示*/void display1() uchar c; t2_10(); c=a0; p1=ledkc;/不帶小數(shù)點(diǎn)的共陰數(shù)碼管的碼值 gw=1; delay4(); gw=0; c=a1; p1=ledkc; sw=1; delay4(); sw=0

22、; c=a2; p1=ledk1c; /帶小數(shù)點(diǎn)的共陰數(shù)碼管的碼值 bw=1; delay4(); bw=0; c=a3; p1=ledkc; qw=1; delay4(); qw=0; c=a4; p1=ledkc; ww=1; delay4(); ww=0; c=a5; p1=ledkc; sww=1; delay4(); sww=0;void display2() uchar c; t2_10(); c=a0; p1=ledkc; gw=1; delay4(); gw=0; c=a1; p1=ledkc; sw=1; delay4(); sw=0; c=a2; p1=ledkc; bw=

23、1; delay4(); bw=0; c=a3; p1=ledkc; qw=1; delay4(); qw=0; c=a4; p1=ledkc; ww=1; delay4(); ww=0; c=a5; p1=ledkc; sww=1; delay4(); sww=0;void display3() uchar c; t2_11(); c=a0; p1=ledkc; gw=1; delay4(); gw=0; void main1(void) v_get1302();temp=uccurtime1*100+uccurtime0; dfdf=uccurtime2; /temp里的值是為了顯示到數(shù)碼

24、管里而設(shè)定的值.display1();void main2(void) v_get1302();temp=uccurtime1*100+uccurtime0;dfdf=uccurtime2;display2();void main3(void) v_get1302();temp=uccurtime4*100+uccurtime3; dfdf=uccurtime6; /temp里的值是為了顯示到數(shù)碼管里而設(shè)定的值.display1();void main4(void) v_get1302();temp=uccurtime4*100+uccurtime3; dfdf=uccurtime6; /te

25、mp里的值是為了顯示到數(shù)碼管里而設(shè)定的值.display2();void main5(void) v_get1302(); dwdw=uccurtime5; /temp里的值是為了顯示到數(shù)碼管里而設(shè)定的值.display3();void main()unint k,i; for(i=0;i0;a-) / 調(diào)整亮度 display8(tmp();/七段數(shù)碼管顯示 while(a); m-; while(q)/顯示時間小時、分、秒 buffer0=buffer0+1; if(buffer0=55) /小數(shù)點(diǎn)每隔一秒閃動一次 main1();/帶小數(shù)點(diǎn)的數(shù)字亮 buffer0=0; else main2();/不帶小數(shù)點(diǎn)亮

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論