版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 《單片機(jī)原理及接口》</p><p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> 題 目: 智能散熱系統(tǒng) </p><p> 專業(yè)名稱: 通信工程 </p><p> 班 級:
2、 </p><p> 學(xué) 號: </p><p> 姓 名: </p><p> 2015年 12月</p><p><b> 散熱系統(tǒng)</b></p><p>
3、;<b> 信息工程學(xué)院</b></p><p> 摘要:由于單片機(jī)體積小、成本低、使用方便,所以被廣泛地應(yīng)用于儀器儀表、現(xiàn)場數(shù)據(jù)的采集和控制。通過本次課程設(shè)計(jì)掌握單片機(jī)硬件和軟件方面的知識,更深入的了解單片機(jī)的實(shí)際應(yīng)用。</p><p> 關(guān)鍵詞:單片機(jī),程序,DS18B20溫度傳感器,LCD1602液晶顯示屏,定時(shí)器,直流電機(jī)等等</p>&l
4、t;p> 1課程設(shè)計(jì)的基本內(nèi)容</p><p> 為實(shí)現(xiàn)系統(tǒng)能采集當(dāng)前環(huán)境溫度,當(dāng)溫度達(dá)到一定值時(shí)觸發(fā)直流風(fēng)扇的轉(zhuǎn)動進(jìn)行主動散熱,并且隨著溫度的變化而改變風(fēng)力大小,風(fēng)力與溫度成正比,本系統(tǒng)設(shè)置了三個(gè)檔來控制風(fēng)力的大小,20C°--22C°為一檔,22C°--24C°為二檔,24C°--26C°為三檔(為了演示方便而設(shè)計(jì)的三檔,在實(shí)際用途中可依據(jù)
5、要求來設(shè)置)。本智能散熱系統(tǒng)根據(jù)環(huán)境溫度智能調(diào)控風(fēng)力的功能可以放置在一些硬件中以達(dá)到降溫的功能。</p><p><b> 2 方案論證</b></p><p> 2.1 設(shè)計(jì)原理及方案選擇</p><p> 通過DS18B20溫度傳感器來采集當(dāng)前環(huán)境的溫度,通過LCD1602液晶顯示屏來顯示溫度以及工作時(shí)間,CPU根據(jù)當(dāng)前溫度來控制電
6、機(jī)的速度。</p><p> 2.2 硬件電路設(shè)計(jì)及原理說明</p><p> 使用P1.1口來連接電機(jī),P0口連接LCD1602,P2.5口為讀/寫選擇端,P2.6為命令/數(shù)據(jù)選擇端,P2.7為使能端,P3.7口為數(shù)據(jù)總線,P3.4口為定時(shí)器0,P3.5為定時(shí)器1.</p><p> 圖為DS18B20原理圖</p><p> 圖
7、為LCD1602原理圖 </p><p> 圖為外部電路接線圖 </p><p><b> 3 設(shè)計(jì)過程論述</b></p><p> 3.1 DS18B20溫度傳感器</p><p> DS18b20采用單總線的結(jié)構(gòu),單總線的特點(diǎn)就是只有一根數(shù)據(jù)線,系統(tǒng)中的數(shù)據(jù)交換都由這根線進(jìn)行。</p>&l
8、t;p> DS18B20的一線工作協(xié)議流程是:</p><p> 初始化→ROM操作指令→存儲器操作指令→數(shù)據(jù)傳輸。</p><p><b> 其工作時(shí)序包括:</b></p><p><b> 1、初始化時(shí)序</b></p><p><b> 2、寫時(shí)序</b>
9、;</p><p><b> 3、讀時(shí)序</b></p><p> DS18B20的初始化</p><p> 主機(jī)首先發(fā)出一個(gè)480-960微秒的低電平脈沖,然后釋放總線變?yōu)楦唠娖剑⒃陔S后的480微秒時(shí)間內(nèi)對總線進(jìn)行檢測,如果有低電平出現(xiàn)說明總線上有器件已做出應(yīng)答。若無低電平出現(xiàn)一直都是高電平說明總線上無器件應(yīng)答。 做為從器件的DS
10、18B20在一上電后就一直在檢測總線上是否有480-960微秒的低電平出現(xiàn),如果有,在總線轉(zhuǎn)為高電平后等待15-60微秒后將總線電平拉低60-240微秒做出響應(yīng)存在脈沖,告訴主機(jī)本器件已做好準(zhǔn)備。若沒有檢測到就一直在檢測等待</p><p><b> 初始化時(shí)序圖</b></p><p><b> 初始化程序</b></p>&
11、lt;p> unsigned char Ds18b20Init()</p><p><b> {</b></p><p> unsigned int i;</p><p> DSIO=0; //將總線拉低480us~960us</p><p><b> i=70;</b>&l
12、t;/p><p> while(i--);//延時(shí)642us</p><p> DSIO=1;//然后拉高總線,若DS18B20做出反應(yīng)會將在15us~60us后將總線拉低</p><p><b> i=0;</b></p><p> while(DSIO)//等待DS18B20拉低總線</p>&l
13、t;p><b> {</b></p><p><b> i++;</b></p><p> if(i>50000)//等待>50MS</p><p> return 0;//初始化失敗</p><p><b> }</b></p>&
14、lt;p> return 1;//初始化成功</p><p><b> }</b></p><p> 主機(jī)發(fā)出各種操作命令都是向DS18B20寫0和寫1組成的命令字節(jié),接收數(shù)據(jù)時(shí)也是從DS18B20讀取0或1的過程。</p><p> 寫周期最少為60微秒,最長不超過120微秒。寫周期一開始做為主機(jī)先把總線拉低1微秒表示寫周期開始
15、。隨后若主機(jī)想寫0,則將總線置為低電平,若主機(jī)想寫1,則將總線置為高電平,持續(xù)時(shí)間最少60微秒直至寫周期結(jié)束,然后釋放總線為高電平至少1微秒給總線恢復(fù) 。而DS18B20則在檢測到總線被拉底后等待15微秒然后從15us到45us開始對總線采樣,在采樣期內(nèi)總線為高電平則為1,若采樣期內(nèi)總線為低電平則為0。</p><p><b> 寫操作時(shí)序圖</b></p><p>
16、; 向DS18B20寫入一個(gè)字節(jié)</p><p> void Ds18b20WriteByte(unsigned char dat)</p><p><b> {</b></p><p> unsigned int i,j;</p><p> for(j=0;j<8;j++)</p><
17、;p><b> {</b></p><p> DSIO=0;//每寫入一位數(shù)據(jù)之前先把總線拉低1us</p><p><b> i++;</b></p><p> DSIO=dat&0x01; //然后寫入一個(gè)數(shù)據(jù),從最低位開始</p><p><b> i=
18、6;</b></p><p> while(i--); //延時(shí)68us,持續(xù)時(shí)間最少60us</p><p> DSIO=1;//然后釋放總線,至少1us給總線恢復(fù)時(shí)間才能接著寫入第二個(gè)數(shù)值</p><p><b> dat>>=1;</b></p><p><b> }&l
19、t;/b></p><p><b> }</b></p><p> 讀周期是從主機(jī)把單總線拉低1微秒之后就得釋放單總線為高電平,以讓DS18B20把數(shù)據(jù)傳輸?shù)絾慰偩€上。作為從機(jī)DS18B20在檢測到總線被拉低1微秒后,便開始送出數(shù)據(jù),若是要送出0就把總線拉為低電平直到讀周期結(jié)束。若要送出1則釋放總線為高電平。主機(jī)在一開始拉低總線1微秒后釋放總線,然后在包括前
20、面的拉低總線電平1微秒在內(nèi)的15微秒時(shí)間內(nèi)完成對總線進(jìn)行采樣檢測,采樣期內(nèi)總線為低電平則確認(rèn)為0。采樣期內(nèi)總線為高電平則確認(rèn)為1。完成一個(gè)讀時(shí)序過程,至少需要60微秒才能完成</p><p><b> 讀操作時(shí)序圖</b></p><p><b> 讀取一個(gè)字節(jié)</b></p><p> unsigned char
21、Ds18b20ReadByte()</p><p><b> {</b></p><p> unsigned char byte,bi;</p><p> unsigned int i,j;</p><p> for(j=8;j>0;j--)</p><p><b>
22、{</b></p><p> DSIO=0;//先將總線拉低1us</p><p><b> i++;</b></p><p> DSIO=1;//然后釋放總線</p><p><b> i++;</b></p><p> i++;//延時(shí)6us等待數(shù)據(jù)
23、穩(wěn)定</p><p> bi=DSIO; //讀取數(shù)據(jù),從最高位開始讀取</p><p> byte=(byte>>1)|(bi<<7); /*將byte右移一位,然后或上左移7位后的bi,注意移動之后移掉那位補(bǔ)0。*/</p><p> i=4;//讀取完之后等待48us再接著讀取下一個(gè)數(shù)</p><p>
24、; while(i--);</p><p><b> }</b></p><p> return byte;</p><p><b> }</b></p><p> DS18B20 內(nèi)部結(jié)構(gòu)主要由四部分組成: 64 位光刻 ROM 、溫度傳感器、非揮發(fā)的溫度報(bào)警觸發(fā)器 TH 和 T
25、L 、配置寄存器。</p><p> 光刻 ROM 中的 64 位序列號是出廠前被光刻好的,它可以看作是該 DS18B20 的地址序列碼。 64 位光刻 ROM 的排列是:開始 8 位(地址: 28H )是產(chǎn)品類型標(biāo)號,接著的 48 位是該 DS18B20 自身的序列號,并且每個(gè) DS18B20 的序列號都不相同,因此它可以看作是該 DS18B20 的地址序列碼;最后 8 位則是前面 56 位的循環(huán)冗余校驗(yàn)碼(
26、 CRC=X8+X5+X4+1 )。由于每一個(gè) DS18B20 的 ROM 數(shù)據(jù)都各不相同,因此微控制器就可以通過單總線對多個(gè) DS18B20 進(jìn)行尋址,從而實(shí)現(xiàn)一根總線上掛接多個(gè) DS18B20 的目的。</p><p> DS18B20的存儲器由一個(gè)高速暫存RAM和一個(gè)非易失性、電可擦除(E2)RAM組成。</p><p> DS18B20經(jīng)轉(zhuǎn)換所得的溫度值以二字節(jié)補(bǔ)碼形式存放在高
27、速暫存存儲器的第0和第1個(gè)字節(jié)。所以當(dāng)我們只想簡單的讀取溫度值的時(shí)候,只用讀取暫存器中的第0和第1個(gè)字節(jié)就可以了。</p><p> 簡單的讀取溫度值的步驟如下:</p><p><b> 1、跳過ROM操作</b></p><p> 2、發(fā)送溫度轉(zhuǎn)換命令</p><p><b> 3、跳過ROM操作&
28、lt;/b></p><p> 4、發(fā)送讀取溫度命令</p><p><b> 5、讀取溫度值</b></p><p><b> 開始轉(zhuǎn)換溫度</b></p><p> void Ds18b20ChangTemp()</p><p><b> {&
29、lt;/b></p><p> Ds18b20Init();</p><p> Delay1ms(1);</p><p> Ds18b20WriteByte(0xcc);//跳過ROM操作命令 </p><p> Ds18b20WriteByte(0x44); //溫度轉(zhuǎn)換命令</p><p>
30、; Delay1ms(100);</p><p><b> }</b></p><p><b> 發(fā)送讀取溫度命令</b></p><p> void Ds18b20ReadTempCom()</p><p><b> {</b></p><p
31、> Ds18b20Init();</p><p> Delay1ms(1);</p><p> Ds18b20WriteByte(0xcc); //跳過ROM操作命令</p><p> Ds18b20WriteByte(0xbe); //發(fā)送讀取溫度命令</p><p><b> }</b></
32、p><p><b> 讀取溫度</b></p><p> int Ds18b20ReadTemp()</p><p><b> {</b></p><p> unsigned int temp=0;</p><p> unsigned char tmh,tml;<
33、/p><p> Ds18b20ChangTemp();//先寫入轉(zhuǎn)換命令</p><p> Ds18b20ReadTempCom();//然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令</p><p> tml=Ds18b20ReadByte();//讀取溫度值共16位,先讀低字節(jié)</p><p> tmh=Ds18b20ReadByte();/
34、/再讀高字節(jié)</p><p><b> temp=tmh;</b></p><p><b> temp<<=8;</b></p><p> temp|=tml;</p><p> return temp;</p><p> }3.2 LCD1602液晶
35、顯示屏</p><p> LCD1602的引腳</p><p><b> 操作步驟:</b></p><p><b> 1、初始化</b></p><p> 2、寫命令(RS=L)設(shè)置顯示坐標(biāo)</p><p> 3、寫數(shù)據(jù)(RS=H)</p><
36、p><b> 寫入一個(gè)字節(jié)命令</b></p><p> void LcdWriteCom(unsigned char com) //寫入命令</p><p><b> {</b></p><p><b> RS=0;</b></p><p><b>
37、; RW=0;</b></p><p> GPIO_LCD=com;</p><p> Delay1ms(10);</p><p><b> LCDE=1;</b></p><p> Delay1ms(10);</p><p><b> LCDE=0;</b
38、></p><p><b> }</b></p><p><b> 寫入一個(gè)字節(jié)數(shù)據(jù)</b></p><p> void LcdWriteData(unsigned char dat)//寫入數(shù)據(jù)</p><p><b> {</b></p>
39、<p><b> RS=1;</b></p><p><b> RW=0;</b></p><p> GPIO_LCD=dat;</p><p> Delay1ms(10);</p><p><b> LCDE=1;</b></p><p
40、> Delay1ms(10);</p><p><b> LCDE=0;</b></p><p><b> }</b></p><p><b> 初始化</b></p><p> void LcdInit() //LCD初始化子程序</p>&l
41、t;p><b> {</b></p><p> LcdWriteCom(0x38); //設(shè)置顯示模式</p><p> LcdWriteCom(0x0c); //開顯示不顯示光標(biāo),光標(biāo)不閃爍</p><p> LcdWriteCom(0x06); //寫一個(gè)指針加1</p><p> LcdWri
42、teCom(0x01); //清屏</p><p> LcdWriteCom(0x80); //設(shè)置數(shù)據(jù)指針起點(diǎn)</p><p><b> }</b></p><p><b> 1602的指令碼</b></p><p><b> DL:</b></p>
43、<p> 0時(shí):選擇4位數(shù)據(jù)總線模式。</p><p> 1時(shí):選擇8位數(shù)據(jù)總線模式。</p><p><b> N:</b></p><p> 0時(shí):選擇顯示一行。</p><p> 1時(shí):選擇顯示兩行。</p><p> F:0選擇5*7模式,1選擇5*10模式。一般只
44、有5*7模式。</p><p> 顯示開/關(guān)及按鍵顯示</p><p><b> RAM地址映射圖</b></p><p> 3.3編程調(diào)試過程出現(xiàn)的問題</p><p> 當(dāng)控制電機(jī)速度的程序放在定時(shí)器1的中斷中則會導(dǎo)致液晶顯示屏出現(xiàn)閃爍,這是因?yàn)槊恐袛嘁淮尉瓦M(jìn)入中斷程序,則讀取溫度的程序就沒有運(yùn)行,所欲顯示就
45、會出錯,而當(dāng)控制電機(jī)的程序放在主程序中,則電機(jī)的速度則無法控制,只有轉(zhuǎn)或不轉(zhuǎn)。這個(gè)問題無法突破就無法實(shí)現(xiàn)調(diào)節(jié)風(fēng)力大小以及正確顯示溫度的功能,嘗試了多種辦法后發(fā)現(xiàn)在讀取溫度的時(shí)候先將定時(shí)器關(guān)閉,讀取溫度結(jié)束后就開啟定時(shí)器。</p><p><b> 4、程序清單</b></p><p> #include<reg51.h></p><
46、p> void Time1Config();</p><p> /*相關(guān)字符的重定義*/</p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p><p> #define LCD1602_DATAPINS P0</p>
47、<p> sbit LCD1602_E=P2^7; //定義P2.7口為使能端</p><p> sbit LCD1602_RW=P2^5; //定義P2.5口為讀/寫選擇端(H/L)</p><p> sbit LCD1602_RS=P2^6; //定義P2.6口為數(shù)據(jù)/命令選擇端(H/L)</p><p> sbit DSPOR
48、T=P3^7; //定義P3.7口為總線</p><p> sbit PWM=P1^1; //定義P1.1為電機(jī)電壓輸出端</p><p> /*定義一些相關(guān)變量*/</p><p> unsigned char timer1;</p><p><b> float tp;</b></p&g
49、t;<p> int temp,speed;</p><p> unsigned char table[]={'0','1','2','3','4','5','6','7','8','9'};</p><p>
50、int i1=0,n1=0,j1=0,a1,k1=0,m1=0,flag=0,o1=0,p1=0,z1=0;</p><p> /*LCD1602延時(shí)函數(shù)*/</p><p> void Lcd1602_Delay1ms(uint c) //誤差 0us</p><p><b> {</b></p><
51、p> uchar a,b;</p><p> for (; c>0; c--)</p><p><b> {</b></p><p> for (b=199;b>0;b--)</p><p><b> {</b></p><p> for(a=1
52、;a>0;a--);</p><p><b> } </b></p><p><b> }</b></p><p><b> }</b></p><p> /*向LCD1602寫入一個(gè)字節(jié)命令*/</p><p> void L
53、cdWriteCom(uchar com) //寫入命令</p><p><b> {</b></p><p> LCD1602_E = 0; //使能</p><p> LCD1602_RS = 0; //選擇發(fā)送命令</p><p> LCD1602_RW = 0; //選擇寫入<
54、;/p><p> LCD1602_DATAPINS = com; //放入命令</p><p> Lcd1602_Delay1ms(1);//等待數(shù)據(jù)穩(wěn)定</p><p> LCD1602_E = 1; //寫入時(shí)序</p><p> Lcd1602_Delay1ms(5); //保持時(shí)間</p&
55、gt;<p> LCD1602_E = 0;</p><p><b> }</b></p><p> /*向LCD1602寫入一個(gè)字節(jié)數(shù)據(jù)*/ </p><p> void LcdWriteData(uchar dat)//寫入數(shù)據(jù)</p><p><b> {&
56、lt;/b></p><p> LCD1602_E = 0;//使能清零</p><p> LCD1602_RS = 1;//選擇輸入數(shù)據(jù)</p><p> LCD1602_RW = 0;//選擇寫入</p><p> LCD1602_DATAPINS = dat; //寫入數(shù)據(jù)</p><p>
57、 Lcd1602_Delay1ms(1);</p><p> LCD1602_E = 1; //寫入時(shí)序</p><p> Lcd1602_Delay1ms(5); //保持時(shí)間</p><p> LCD1602_E = 0;</p><p><b> }</b></p><p>
58、 /*初始化LCD屏*/</p><p> void LcdInit() //LCD初始化子程序</p><p><b> {</b></p><p> LcdWriteCom(0x38); //開顯示</p><p> LcdWriteCom(0x0c)
59、; //開顯示不顯示光標(biāo)</p><p> LcdWriteCom(0x06); //寫一個(gè)指針加1</p><p> LcdWriteCom(0x01); //清屏</p><p> LcdWriteCom(0x80); //設(shè)置數(shù)據(jù)指針起點(diǎn)</p><p><b> }</b></p>
60、<p> /*DS18B20的延時(shí)函數(shù)*/</p><p> void Delay1ms(uint y)</p><p><b> {</b></p><p><b> uint x;</b></p><p> for( ; y>0; y--)</p><
61、;p><b> {</b></p><p> for(x=110; x>0; x--);</p><p><b> }</b></p><p><b> }</b></p><p> /*DS18B20的初始化*/</p><p>
62、 uchar Ds18b20Init()</p><p><b> {</b></p><p><b> uchar i;</b></p><p> DSPORT = 0; //將總線拉低480us~960us</p><p><b> i = 70;</b>
63、</p><p> while(i--);//延時(shí)642us</p><p> DSPORT = 1;//然后拉高總線,如果DS18B20做出反應(yīng)會將在15us~60us后總線拉低</p><p><b> i = 0;</b></p><p> while(DSPORT)//等待DS18B20拉低總線&
64、lt;/p><p><b> {</b></p><p><b> i++;</b></p><p> if(i>5)//等待>5MS</p><p><b> {</b></p><p> return 0;//初始化失敗</p
65、><p><b> }</b></p><p> Delay1ms(1);</p><p><b> }</b></p><p> return 1;//初始化成功</p><p><b> }</b></p><p>
66、 /*向DS18B20寫入一個(gè)字節(jié)*/</p><p> void Ds18b20WriteByte(uchar dat)</p><p><b> {</b></p><p> uint i, j;</p><p> for(j=0; j<8; j++)</p><p><b
67、> {</b></p><p> DSPORT = 0; //每寫入一位數(shù)據(jù)之前先把總線拉低1us</p><p><b> i++;</b></p><p> DSPORT = dat & 0x01; //然后寫入一個(gè)數(shù)據(jù),從最低位開始</p><p><b&g
68、t; i=6;</b></p><p> while(i--); //延時(shí)68us,持續(xù)時(shí)間最少60us</p><p> DSPORT = 1;//然后釋放總線,至少1us給總線恢復(fù)時(shí)間才能接著寫入第二個(gè)數(shù)值</p><p> dat >>= 1;</p><p><b> }</b>
69、;</p><p><b> }</b></p><p> /*讀取一個(gè)字節(jié)*/</p><p> uchar Ds18b20ReadByte()</p><p><b> {</b></p><p> uchar byte, bi;</p><
70、p> uint i, j;</p><p> for(j=8; j>0; j--)</p><p><b> {</b></p><p> DSPORT = 0;//先將總線拉低1us</p><p><b> i++;</b></p><p> D
71、SPORT = 1;//然后釋放總線</p><p><b> i++;</b></p><p> i++;//延時(shí)6us等待數(shù)據(jù)穩(wěn)定</p><p> bi = DSPORT; //讀取數(shù)據(jù),從最高位開始讀取</p><p> /*將byte右移一位,然后與上左移7位后的bi,注意移動之后移掉那位補(bǔ)0。*/&
72、lt;/p><p> byte = (byte >> 1) | (bi << 7); </p><p> i = 4;//讀取完之后等待48us再接著讀取下一個(gè)數(shù)</p><p> while(i--);</p><p><b> }</b></p>&
73、lt;p> return byte;</p><p><b> }</b></p><p> /*開始轉(zhuǎn)換溫度*/</p><p> void Ds18b20ChangTemp()</p><p><b> {</b></p><p> Ds18b20In
74、it();</p><p> Delay1ms(1);</p><p> Ds18b20WriteByte(0xcc);//跳過ROM操作命令 </p><p> Ds18b20WriteByte(0x44); //溫度轉(zhuǎn)換命令</p><p> //Delay1ms(100);//等待轉(zhuǎn)換成功,而如果你是一直刷著的
75、話,就不用這個(gè)延時(shí)了</p><p><b> }</b></p><p> /*發(fā)送讀取溫度命令*/</p><p> void Ds18b20ReadTempCom()</p><p><b> {</b></p><p> Ds18b20Init();&l
76、t;/p><p> Delay1ms(1);</p><p> Ds18b20WriteByte(0xcc); //跳過ROM操作命令</p><p> Ds18b20WriteByte(0xbe); //發(fā)送讀取溫度命令</p><p><b> }</b></p><p><b&
77、gt; /*讀取溫度*/</b></p><p> int Ds18b20ReadTemp()</p><p><b> {</b></p><p> int temp = 0;</p><p> uchar tmh, tml;</p><p><b> TR1=
78、0;</b></p><p> Ds18b20ChangTemp(); //先寫入轉(zhuǎn)換命令</p><p> Ds18b20ReadTempCom();//然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令</p><p> tml = Ds18b20ReadByte();//讀取溫度值共16位,先讀低字節(jié)</p><p>
79、 tmh = Ds18b20ReadByte();//再讀高字節(jié)</p><p> temp = tmh;</p><p> temp <<= 8;</p><p> temp |= tml;</p><p><b> TR1=1;</b></p><p> retur
80、n temp;</p><p><b> }</b></p><p> /*定時(shí)器1的中斷函數(shù)*/</p><p> void Time1(void) interrupt 3 </p><p><b> {</b></p><p> TH1 = 0xfe;
81、</p><p> TL1 = 0x0c;</p><p><b> timer1++;</b></p><p> if(timer1>100) //PWM周期為100*0.5ms</p><p> timer1=0; </p><p> if(ti
82、mer1 < speed)//直流電機(jī)的速度與speed的變化成正比</p><p><b> PWM=1;</b></p><p><b> else</b></p><p><b> PWM=0;</b></p><p><b> } &l
83、t;/b></p><p> /*設(shè)置定時(shí)器1*/</p><p> void Time1Config()</p><p><b> {</b></p><p> TMOD|= 0x10; //設(shè)置定時(shí)計(jì)數(shù)器工作方式1為定時(shí)器</p><p> //--定時(shí)器賦初始值,12MH
84、Z下定時(shí)0.5ms--// </p><p> TH1 = 0xfe; </p><p> TL1 = 0x0c;</p><p> ET1 = 1; //開啟定時(shí)器1中斷</p><p><b> EA = 1;</b></p><p> TR1 = 1; //開啟定時(shí)器&l
85、t;/p><p><b> }</b></p><p> /*LCD顯示讀取到的溫度*/</p><p> void LcdDisplay(int temp) //lcd顯示</p><p><b> {</b></p><p> unsigned char dat
86、as[] = {0, 0, 0, 0, 0}; //定義數(shù)組 </p><p> if(temp< 0)//當(dāng)溫度值為負(fù)數(shù)</p><p><b> {</b></p><p> LcdWriteCom(0xC1);//寫地址 80表示初始地址</p><p> LcdWriteData(
87、39;-'); //顯示負(fù)</p><p> //因?yàn)樽x取的溫度是實(shí)際溫度的補(bǔ)碼,所以減1,再取反求出原碼</p><p> temp=temp-1;</p><p> temp=~temp;</p><p><b> tp=temp;</b></p><p> temp=
88、tp*0.0625*100+0.5;</p><p> //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)</p><p> //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就</p><p> //算由?.5,還是在小數(shù)點(diǎn)后面。</p><p><
89、;b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> LcdWriteCom(0xC6);//寫地址 80表示初始地址</p><p> LcdWriteData('+');
90、//顯示正</p><p> tp=temp;//因?yàn)閿?shù)據(jù)處理有小數(shù)點(diǎn)所以將溫度賦給一個(gè)浮點(diǎn)型變量</p><p> //如果溫度是正的那么,那么正數(shù)的原碼就是補(bǔ)碼它本身</p><p> temp=tp*0.0625*100+0.5;</p><p> if(temp>=2000 && temp<=220
91、0)</p><p><b> speed=30;</b></p><p> else if(temp>=2200 && temp<=2400)</p><p><b> speed=50;</b></p><p> else if(temp>2400)&l
92、t;/p><p><b> speed=70;</b></p><p><b> else</b></p><p><b> speed=0;</b></p><p> //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)</p&g
93、t;<p> //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就</p><p> //算加上0.5,還是在小數(shù)點(diǎn)后面。</p><p><b> }</b></p><p> datas[0] = temp / 10000;</p><p> data
94、s[1] = temp % 10000 / 1000;</p><p> datas[2] = temp % 1000 / 100;</p><p> datas[3] = temp % 100 / 10;</p><p> datas[4] = temp % 10;</p><p> LcdWriteCom(0xC8); &l
95、t;/p><p> LcdWriteData('0'+datas[0]); </p><p> LcdWriteCom(0xC9); </p><p> LcdWriteData('0'+datas[1]); </p><p> LcdWriteCom(0xCa);</p><
96、p> LcdWriteData('0'+datas[2]); </p><p> LcdWriteCom(0xCb);</p><p> LcdWriteData('.'); </p><p> LcdWriteCom(0xCc); </p><p> LcdWriteData(&
97、#39;0'+datas[3]); </p><p> LcdWriteCom(0xCd); </p><p> LcdWriteData('0'+datas[4]);</p><p> LcdWriteCom(0xC0); //寫地址 80表示初始地址</p><p> LcdWriteData(
98、't');</p><p> LcdWriteCom(0xC1); //寫地址 80表示初始地址</p><p> LcdWriteData('e');</p><p> LcdWriteCom(0xC2); //寫地址 80表示初始地址</p><p> LcdWriteData('m
99、');</p><p> LcdWriteCom(0xC3); //寫地址 80表示初始地址</p><p> LcdWriteData('p');</p><p> LcdWriteCom(0xC4); //寫地址 80表示初始地址</p><p> LcdWriteData(':')
100、;</p><p><b> }</b></p><p> /*lCD上一行顯示時(shí)間*/</p><p> void Lcddisplay()</p><p><b> {</b></p><p> LcdWriteCom(0x8f); </p>
101、<p> LcdWriteData(table[i1]); </p><p> LcdWriteCom(0x8e); </p><p> LcdWriteData(table[j1]); </p><p> LcdWriteCom(0x8d); </p><p> LcdWriteData(':'
102、;); </p><p> LcdWriteCom(0x8c); </p><p> LcdWriteData(table[k1]);</p><p> LcdWriteCom(0x8b); </p><p> LcdWriteData(table[m1]); </p><p> LcdWriteCo
103、m(0x8a);</p><p> LcdWriteData(':'); </p><p> LcdWriteCom(0x89); </p><p> LcdWriteData(table[o1]); </p><p> LcdWriteCom(0x88); </p><p> L
104、cdWriteData(table[p1]); </p><p> LcdWriteCom(0x87); </p><p> LcdWriteData(':');</p><p> LcdWriteCom(0x86); </p><p> LcdWriteData(table[z1]);</p>
105、<p> LcdWriteCom(0x85); </p><p> LcdWriteData('D');</p><p> LcdWriteCom(0x80); </p><p> LcdWriteData('t'); </p><p> LcdWriteCom(0x81); &
106、lt;/p><p> LcdWriteData('i'); </p><p> LcdWriteCom(0x82); </p><p> LcdWriteData('m'); </p><p> LcdWriteCom(0x83); </p><p> LcdWriteDa
107、ta('e'); </p><p> LcdWriteCom(0x84);</p><p> LcdWriteData(':');</p><p><b> }</b></p><p> /*定時(shí)器0的中斷程序*/</p><p> void mb()
108、interrupt 1</p><p><b> { </b></p><p> TH0=a1/256;</p><p> TL0=a1%256; //中斷頻率為50ms</p><p><b> n1++; </b></p><p> if(n1==20)
109、 //當(dāng)n1=20的時(shí)候則為1s</p><p><b> {</b></p><p> n1=0; //重新讓n1=0</p><p><b> i1++;</b></p><p> if(i1==10)// 當(dāng)秒的個(gè)位為10時(shí)則十位進(jìn)一,個(gè)位變?yōu)?</p><
110、p><b> {</b></p><p><b> j1++;</b></p><p><b> i1=0;</b></p><p><b> }</b></p><p> if(j1==6) //當(dāng)秒的十位為6時(shí)則分的個(gè)位進(jìn)一,秒的
111、十位變?yōu)?</p><p><b> {</b></p><p><b> k1++;</b></p><p><b> j1=0;</b></p><p><b> }</b></p><p> if(k1==10)
112、 //當(dāng)分的個(gè)位為10時(shí),分的十位進(jìn)一,個(gè)位變?yōu)?</p><p><b> {</b></p><p><b> m1++;</b></p><p><b> k1=0;</b></p><p><b> }</b></p><
113、;p> if(m1==6) //當(dāng)分的十位為6時(shí),時(shí)的個(gè)位進(jìn)一,分的十位變?yōu)?,標(biāo)志位進(jìn)一</p><p><b> {</b></p><p><b> flag++;</b></p><p><b> o1++;</b></p><p><b>
114、; m1=0;</b></p><p><b> }</b></p><p> if(flag==24) //當(dāng)標(biāo)志位為24時(shí),時(shí)的十位變0,時(shí)的個(gè)位變0,天的個(gè)數(shù)加1</p><p><b> {</b></p><p><b> o1=0;</b>
115、</p><p><b> p1=0;</b></p><p><b> z1++;</b></p><p><b> }</b></p><p> if(o1==10) //當(dāng)時(shí)的個(gè)位為10時(shí),十位進(jìn)一,個(gè)位變?yōu)?</p><p><b
116、> {</b></p><p><b> o1=0;</b></p><p><b> p1++;</b></p><p><b> }</b></p><p><b> }</b></p><p>&l
117、t;b> }</b></p><p> /*定時(shí)器0的設(shè)置*/</p><p> void Time0Config()</p><p><b> {</b></p><p> TMOD=00000001;</p><p> a1=-50000;</p>
118、<p> TH0=a1/256;</p><p> TL0=a1%256;</p><p><b> EA=1;</b></p><p><b> ET0=1;</b></p><p><b> TR0=1;</b></p><p>
119、<b> }</b></p><p><b> /*主函數(shù)*/</b></p><p> void main()</p><p><b> {</b></p><p> Time0Config(); //定時(shí)器0的初始化</p><p>
120、Time1Config();//定時(shí)器1的初始化</p><p> LcdInit(); //初始化LCD1602</p><p> LcdWriteCom(0xCf);</p><p> LcdWriteData('C'); </p><p><b> while(1)</b><
121、/p><p><b> {</b></p><p> LcdDisplay(Ds18b20ReadTemp()); //顯示溫度</p><p> Lcddisplay(); //顯示時(shí)間</p><p><b> }</b></p><p><b> }&
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 智能交通燈系統(tǒng)課程設(shè)計(jì)報(bào)告
- 智能電扇-課程設(shè)計(jì)報(bào)告
- 智能儀器課程設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)報(bào)告--智能電梯控制系統(tǒng)
- 課程設(shè)計(jì)報(bào)告---智能照明控制系統(tǒng)設(shè)計(jì)
- 課程設(shè)計(jì)—智能風(fēng)扇設(shè)計(jì)報(bào)告
- 智能儀器設(shè)計(jì)課程設(shè)計(jì)報(bào)告
- 智能樓宇課程設(shè)計(jì)---樓宇智能化系統(tǒng)課程設(shè)計(jì)
- 智能儀表課程設(shè)計(jì)報(bào)告
- 智能儀表課程設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)報(bào)告--基于labview智能交通燈系統(tǒng)設(shè)計(jì)
- 智能裝置課程設(shè)計(jì)報(bào)告--空調(diào)控制系統(tǒng)
- 《人工智能》課程設(shè)計(jì)報(bào)告--動物識別系統(tǒng)
- led智能臺燈系統(tǒng)課程設(shè)計(jì)
- 智能點(diǎn)餐系統(tǒng)課程設(shè)計(jì)
- led智能臺燈系統(tǒng)課程設(shè)計(jì)
- 人工智能掃雷課程設(shè)計(jì)報(bào)告
- 智能交通燈課程設(shè)計(jì)報(bào)告
- labview課程設(shè)計(jì)報(bào)告---基于labview智能交通燈系統(tǒng)設(shè)計(jì)
- 課程設(shè)計(jì)---衛(wèi)生間智能燈光控制系統(tǒng)設(shè)計(jì)報(bào)告
評論
0/150
提交評論