版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 單片機(jī)應(yīng)用技術(shù)</b></p><p><b> 課程設(shè)計</b></p><p> 學(xué) 生 姓 名: </p><p> 學(xué) 號: </p><p> 年級/
2、專業(yè)/班: 2012級機(jī)電2班 </p><p> 學(xué) 院: 應(yīng)用技術(shù)學(xué)院 </p><p> 指 導(dǎo) 教 師: </p><p><b> 2014年1月</b></p><p><b> 目 錄</b&g
3、t;</p><p><b> 任務(wù)書</b></p><p> 1 單片機(jī)多功能測量儀的設(shè)計1</p><p> 1.1 主要功能1</p><p> 1.2 電路總體方案1</p><p> 1.3 各個功能模塊的說明1</p><p> 1
4、.3.1 STC89C52的主要特點1</p><p> 1.3.2 LCM1602顯示電路2</p><p> 1.3.3 鍵盤電路3</p><p> 1.3.4 光電計數(shù)電路3</p><p> 1.3.5 直流電壓測量電路3</p><p> 1.3.6 溫度測量電路4<
5、/p><p> 1.4 電路原理圖(SCH)4</p><p> 2 應(yīng)用程序設(shè)計5</p><p> 2.1 程序的總體設(shè)計5</p><p> 2.1.1 程序結(jié)構(gòu)框圖5</p><p> 2.1.2 所需要的程序模塊5</p><p> 2.2 主程序的設(shè)計
6、6</p><p> 3 仿真及實際效果圖9</p><p> 3.1 Protues仿真效果圖9</p><p> 4 總結(jié)與致謝11</p><p> 參 考 文 獻(xiàn)11</p><p><b> 附 程序清單</b></p><p> 1 單
7、片機(jī)多功能測量儀的設(shè)計</p><p><b> 1.1 主要功能</b></p><p><b> 主要功能如下:</b></p><p> ?。?) 測量0-5V的直流電壓;用LCM1602液晶顯示電壓值(小數(shù)點后一位);</p><p> ?。?) 測量-30-100℃溫度;用LCM16
8、02液晶顯示溫度值(整數(shù));</p><p> (3) 對光電傳感器的遮擋次數(shù)進(jìn)行計數(shù)(000-255)。 </p
9、><p> (4) 按下鍵key1、key2、key3分別顯示電壓、溫度、計數(shù)值。</p><p> 1.2 電路總體方案</p><p> 根據(jù)以上功能,設(shè)計的電路總體方案框圖如下:</p><p> 采用增強(qiáng)型51系列單片機(jī)STC89c52為核心控制器;字符型LCM1602液晶顯示模塊;三個獨立鍵盤;光電計數(shù)單元;一線制的DS18B
10、20集成測溫芯片測量溫度;TLC549為AD,采集直流的0-5v電壓值。</p><p> 1.3 各個功能模塊的說明</p><p> 以下分別描述各功能模塊的電路設(shè)計。</p><p> 1.3.1 STC89C52的主要特點</p><p> STC89C52是STC公司生產(chǎn)的一種低功耗、高性能CMOS8位微控制器,具有 8
11、K 在系統(tǒng)可編程Flash存儲器。STC89C52使用經(jīng)典的MCS-51內(nèi)核,但做了很多的改進(jìn)使得芯片具有傳統(tǒng)51單片機(jī)不具備的功能。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得STC89C52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。 </p><p><b> 主要特性如下:</b></p><p> 增強(qiáng)型8051
12、單片機(jī),6時鐘/機(jī)器周期和12時鐘/機(jī)器周期可以任意選擇,指令代碼完全兼容傳統(tǒng)8051;</p><p> 工作電壓:5.5V~3.3V(5V單片機(jī))/3.8V~2.0V(3V單片機(jī));</p><p> 工作頻率范圍:0~40MHz,相當(dāng)于普通8051的0~80MHz,實際工作頻率可達(dá)48MHz;</p><p> 用戶應(yīng)用程序空間為8K字節(jié);</p&
13、gt;<p> 片上集成512字節(jié)RAM;</p><p> 通用I/O口(32個),復(fù)位后為:P1/P2/P3/P4是準(zhǔn)雙向口/弱上拉,P0口是漏極開路輸出,作為總線擴(kuò)展用時,不用加上拉電阻,作為I/O口用時,需加上拉電阻。</p><p> ISP(在系統(tǒng)可編程)/IAP(在應(yīng)用可編程),無需專用編程器,無需專用仿真器,可通過串口(RxD/P3.0,TxD/P3.1
14、)直接下載用戶程序,數(shù)秒即可完成一片;</p><p> 具有EEPROM功能;</p><p><b> 具有看門狗功能;</b></p><p> 共3個16位定時器/計數(shù)器。即定時器T0、T1、T2;</p><p> 外部中斷2個,下降沿中斷或低電平觸發(fā)電路,Power Down模式可由外部中斷低電平觸發(fā)
15、中斷方式喚醒;</p><p> 通用異步串行口(UART),還可用定時器軟件實現(xiàn)多個UART;</p><p> 工作溫度范圍:-40~+85℃(工業(yè)級)/0~75℃(商業(yè)級)。</p><p> 1.3.2 LCM1602顯示電路</p><p><b> 顯示電路如下;</b></p>&l
16、t;p> 這是一種四線數(shù)據(jù)、2根控制線的接口方法,它與單片機(jī)需要六線連接。</p><p> 1.3.3 鍵盤電路</p><p> 這是一種獨立式鍵盤的電路。</p><p> 1.3.4 光電計數(shù)電路</p><p><b> 電路原理如右;</b></p><p> 采
17、用的是反射式光電開關(guān),如圖OP。74LS14為施密特觸發(fā)器,起整形作用。</p><p> 整形后的信號進(jìn)入89c52的T1計數(shù)器進(jìn)行計數(shù)。</p><p> 1.3.5 直流電壓測量電路</p><p><b> 電路原理圖如下;</b></p><p> 采用TLC549作為AD轉(zhuǎn)換器,TLC549是美國德
18、州儀器公司生產(chǎn)的8位串行A/D轉(zhuǎn)換器芯片,可與通用微處理器、控制器通過CLK、CS、DATA OUT三條口線進(jìn)行串行接口。具有4MHz片內(nèi)系統(tǒng)時鐘和軟、硬件控制電路,轉(zhuǎn)換時間最長17μs, TLC549為40 000次/s。總失調(diào)誤差最大為±0.5LSB,典型功耗值為6mW。</p><p> TLC549均有片內(nèi)系統(tǒng)時鐘,該時鐘與I/O CLOCK是獨立工作的,無須特殊的速度或相位匹配。</p
19、><p> 仿真時,用一個10k的可調(diào)電阻獲取0-5V的直流電壓。如在實際應(yīng)用中,這個電壓來源于實際被測的直流電壓。</p><p> 1.3.6 溫度測量電路</p><p> DS18B20是DALLAS公司生產(chǎn)的單總線式數(shù)字溫度傳感器,它具有微型化、低功耗、高性能、抗干擾能力強(qiáng)、易配處理器等優(yōu)點,特別適用于構(gòu)成多點溫度測控系統(tǒng),可直接將溫度轉(zhuǎn)化成串行數(shù)字信
20、號(提供9位二進(jìn)制數(shù)字)給單片機(jī)處理,且在同一總線上可以掛接多個傳感器芯片。它具有3引腳TO-92小體積封裝形式,溫度測量范圍為-55℃~+125℃,可編程為9位~12位A/D轉(zhuǎn)換精度,測溫分辨率可達(dá)0.0625℃ ,被測溫度用符號擴(kuò)展的16位數(shù)字量方式串行輸出,其工作電源既可在遠(yuǎn)端引人,也可采用寄生電源方式產(chǎn)生,多個DS18B20可以并聯(lián)到3根或2根線上,CPU只需一根端口線就能與多個DS18B20通信,占用微處理器的端口較少,可節(jié)省
21、大量的引線和邏輯電路。本儀器采用P3.4作為接口。如左圖。</p><p> 1.4 電路原理圖(SCH)</p><p><b> 2 應(yīng)用程序設(shè)計</b></p><p> 2.1 程序的總體設(shè)計</p><p> 2.1.1 程序結(jié)構(gòu)框圖</p><p> 2.1.2 所
22、需要的程序模塊</p><p> LCD1602-4.H</p><p><b> 3KEY.H</b></p><p><b> TLC595.H</b></p><p><b> DS18B20.H</b></p><p> 2.2 主程
23、序的設(shè)計</p><p> #include"key.h"</p><p> #include<lcd1602.h></p><p> #include<tlc549.h></p><p> #include<ds18b20.h></p><p> sb
24、it guangdian=P3^5;</p><p> uchar i,num1,nummm=2;</p><p> void Guangdian(void) //光電計數(shù)子程序</p><p><b> {</b></p><p> uchar DispBuffer[4];</p><p&g
25、t; uchar num;</p><p> num=TH1*256+TL1;</p><p> DispBuffer[0]=TL1/100+0x30;</p><p> DispBuffer[1]=TL1%100/10+0x30;</p><p> DispBuffer[2]=TL1%10+0x30;</p><
26、;p> DispBuffer[3]='\0';</p><p> LCD_Prints(6,1," ");</p><p> LCD_Prints(8,1,DispBuffer);</p><p><b> }</b></p><p> void DianYa(voi
27、d) //測量電壓和A/D轉(zhuǎn)換子程序</p><p><b> {</b></p><p> uchar bis[6];</p><p><b> uchar DA;</b></p><p> DA= AD_TLC549()*50.5/255;</p><p>
28、bis[0]=DA/10+0x30;</p><p> bis[1]='.';</p><p> bis[2]=DA%10+0x30;</p><p> bis[3]=' ';</p><p> bis[4]='V';</p><p> bis[5]='
29、\0';</p><p> LCD_Prints(6,1,bis);</p><p><b> }</b></p><p> void wendu(void)//溫度測量子程序</p><p><b> {</b></p><p> char DB[6];
30、 </p><p> uchar wd=0;</p><p> Init_DS18B20();</p><p> wd=ReadTemp();</p><p> if(wd>128)</p><p> {wd=256-wd;</p><p> DB[0]='-'
31、;</p><p><b> }</b></p><p> else DB[0]=wd/100+0x30;</p><p> DB[1]=wd%100/10+0x30;</p><p> DB[2]=wd%10+0x30;</p><p> DB[3]=0xdf;</p>
32、<p> DB[4]='C';</p><p> DB[5]='\0';</p><p> LCD_Prints(6,1,DB);</p><p><b> }</b></p><p> void caidan (uchar num1)</p><p
33、><b> {</b></p><p> switch(num1)</p><p><b> {</b></p><p> case 0:{Guangdian();}break;</p><p> case 1:{DianYa();}break;</p><p&g
34、t; case 2:{wendu();}break;</p><p><b> } </b></p><p><b> }</b></p><p> void KeyProc(void) //按鍵處理程序</p><p><b> {</b></p>
35、<p> uchar key;</p><p> key=KeyScanNUM();</p><p> if(key==UP||key==DOWN||key==ENTER)</p><p><b> {</b></p><p> switch(key)</p><p>&l
36、t;b> {</b></p><p> case UP:{nummm=0;LCD_Prints(1,0,"Photoelectric ");}break;</p><p> case DOWN:{nummm=1;LCD_Prints(1,0,"Voltage ");}break;</p>&l
37、t;p> case ENTER:{nummm=2;LCD_Prints(1,0,"Temperature ");}break;</p><p><b> }</b></p><p><b> }</b></p><p> caidan(nummm);</p>&l
38、t;p><b> }</b></p><p> void main(void)</p><p><b> {</b></p><p> TMOD=0x50;</p><p><b> TL1=0;</b></p><p><b>
39、; TH1=0;</b></p><p><b> TR1=1;</b></p><p> LCD_Init();</p><p> LCD_Prints(1,0,"Temperature ");</p><p><b> while(1)</b>
40、;</p><p><b> {</b></p><p> KeyProc();</p><p><b> }</b></p><p><b> }</b></p><p> 3 仿真及實際效果圖 </p><p>
41、 3.1 Protues仿真效果圖</p><p><b> 課程設(shè)計總結(jié)</b></p><p> 這個學(xué)期的單片機(jī)課已經(jīng)早早的上完了,但是理論純屬理論,沒有與實踐的結(jié)合總讓我們學(xué)的不踏實,感覺沒有達(dá)到學(xué)以致用的效果。所慶幸的是在課程介紹考試完之后,老師給我們安排了這次單片機(jī)課程設(shè)計,給了我們學(xué)以致用的做好的實踐。 關(guān)于這次課程設(shè)計,我們花費了比較多的心思,既
42、是對課程理論內(nèi)容的一次復(fù)習(xí)和鞏固,還讓我們豐富了更多與該專業(yè)相關(guān)的其他知識,比如軟件應(yīng)用等,在摸索中學(xué)習(xí),在摸索中成長,在學(xué)習(xí)的過程中帶著問題去學(xué)我發(fā)現(xiàn)效率很高,這是我做這次課程設(shè)計的又一收獲,在真正設(shè)計之前我們做了相當(dāng)豐富的準(zhǔn)備,首先鞏固一下課程理論,再一遍熟悉課程知識的構(gòu)架,然后結(jié)合加以理論分析、總結(jié),有了一個清晰的思路和一個完整的的軟件流程圖之后才著手設(shè)計。在設(shè)計程序時,我們不能妄想一次就將整個程序設(shè)計好,反復(fù)修改、不斷改進(jìn)是程序
43、設(shè)計的必經(jīng)之路;養(yǎng)成注釋程序的好習(xí)慣是非常必要的,一個程序的完美與否不僅僅是實現(xiàn)功能,而應(yīng)該讓人一看就能明白你的思路,這樣也能為資料的保存和交流提供了方便;我覺得在設(shè)計課程過程中遇到問題是很正常,但我們應(yīng)該將每次遇到的問題記錄下來,并分析清楚,以免下次再碰到同樣的問題的課程設(shè)計又出錯了。 除了</p><p><b> 參考文獻(xiàn)</b></p><p> 黃惟公
44、等《單片機(jī)原理及接口技術(shù)》 西安電子科大出版社 2007</p><p> 周景潤等 《基于PROTEUS的電路及單片機(jī)系統(tǒng)設(shè)計與仿真》 北航出版社 2006.5</p><p> ]韓曉東等《Pretel電路設(shè)計入門與應(yīng)用》 中國鐵道出版社 </p><p><b> 附
45、程序清單 </b></p><p><b> 綜合測量儀程序</b></p><p><b> 主程序</b></p><p> #include"key.h"</p><p> #include<lcd1602.h></p>&l
46、t;p> #include<tlc549.h></p><p> #include<ds18b20.h></p><p> sbit LED1=P1^4;</p><p> sbit LED2=P1^5;</p><p> sbit LED3=P1^6;</p><p> sb
47、it guangdian=P3^5;</p><p> sbit E1 = P2^4;</p><p> sbit E2 = P2^5;</p><p><b> uchar i;</b></p><p> void KeyProc(void) //紅黃燈亮子程序</p><
48、;p><b> {</b></p><p> uchar key;</p><p> key=KeyScanNUM();</p><p> switch(key)</p><p><b> {</b></p><p> case UP:{LED1=1;LED
49、2=1;LED3=0;}break;</p><p> case DOWN:{LED1=1;LED2=0;LED3=1;}break;</p><p> case ENTER:{LED1=0;LED2=1;LED3=1;}break;</p><p><b> }</b></p><p><b> ke
50、y=0;</b></p><p><b> }</b></p><p> void Guangdian(void) //光電計數(shù)子程序</p><p><b> {</b></p><p> uchar code dis[]={0xc0,0xf3,0x98,0x92,0xa3,0
51、x86,0x84,0xd3,0x80,0x82,0xff};</p><p> uchar num;</p><p> num=TH1*256+TL1;</p><p><b> switch(i)</b></p><p><b> {</b></p><p> c
52、ase 0:P0=dis[num/10];E1=1;E2=0;i=1;break;</p><p> case 1:P0=dis[num%10];E1=0;E2=1;i=0;break;</p><p><b> }</b></p><p><b> }</b></p><p> void
53、DianYa(void) //測量電壓和A/D轉(zhuǎn)換子程序</p><p><b> {</b></p><p> uchar bis[6];</p><p><b> uchar DA;</b></p><p> DA= AD_TLC549()*50.5/255;</p>&
54、lt;p> bis[0]=DA/10+0x30;</p><p> bis[1]='.';</p><p> bis[2]=DA%10+0x30;</p><p> bis[3]=' ';</p><p> bis[4]='V';</p><p> bi
55、s[5]='\0';</p><p> LCD_Prints(0,1,bis);</p><p><b> }</b></p><p> void wendu(void)//溫度測量子程序</p><p><b> {</b></p><p> c
56、har DB[6]; </p><p> uchar wd=0;</p><p> Init_DS18B20();</p><p> wd=ReadTemp();</p><p> if(wd>127)</p><p> {i=256-wd;</p><p> DB[0]=&
57、#39;-';</p><p><b> }</b></p><p> else DB[0]=i/100+0x30;</p><p> DB[1]=wd%100/10+0x30;</p><p> DB[2]=wd%10+0x30;</p><p> DB[3]=0xdf;<
58、;/p><p> DB[4]='C';</p><p> DB[5]='\0';</p><p> LCD_Prints(10,1,DB);</p><p><b> }</b></p><p> void main(void)</p><
59、p><b> {</b></p><p> TMOD=0x50;</p><p><b> TL1=0;</b></p><p><b> TH1=0;</b></p><p><b> TR1=1;</b></p><
60、p> LCD_Init();</p><p> LCD_Prints(0,0,"DianYa");</p><p> LCD_Prints(10,0,"WenDu");</p><p><b> while(1)</b></p><p><b> {<
61、;/b></p><p> KeyProc();</p><p> Guangdian();</p><p><b> DianYa();</b></p><p><b> wendu();</b></p><p><b> }</b>&
62、lt;/p><p><b> }</b></p><p> LCM1602驅(qū)動函數(shù):LCD1602.h</p><p> #ifndef __LCD1602_H__</p><p> #define __LCD1602_H__</p><p> #include<reg52.h>
63、</p><p> #define uint unsigned int</p><p> #define uchar unsigned char</p><p> sfr LCD_DATA=0x90;</p><p> sbit LCD_RS=P2^6;</p><p> sbit LCD_EN=P2^7
64、;</p><p> void LCD_Init(void);</p><p> void LCD_Prints(uchar x,uchar y,uchar *str);</p><p><b> #endif</b></p><p> LCM1602驅(qū)動程序:LCD1602.c</p><p
65、> #include"lcd1602.h"</p><p> void LCD_Delay(uchar x)</p><p><b> {</b></p><p> while(--x);</p><p><b> }</b></p><p&g
66、t; void LCD_En(void)</p><p><b> {</b></p><p><b> LCD_EN=1;</b></p><p> LCD_Delay(4);</p><p><b> LCD_EN=0;</b></p><p&
67、gt;<b> }</b></p><p> void LCD_cmd(uchar cmd)</p><p><b> {</b></p><p> uchar cmd1;</p><p><b> cmd1=cmd;</b></p><p>
68、<b> cmd1>>=4;</b></p><p> LCD_Delay(18);</p><p><b> LCD_RS=0;</b></p><p> LCD_DATA &=0xf0;</p><p> LCD_DATA |=cmd1&0x0f;</
69、p><p><b> LCD_En();</b></p><p> LCD_DATA &=0xf0;</p><p> LCD_DATA |=cmd&0x0f;</p><p><b> LCD_En();</b></p><p><b> }
70、</b></p><p> void LCD_Clr(void)</p><p><b> {</b></p><p> LCD_cmd(0x01);</p><p> LCD_Delay(255);</p><p> LCD_Delay(255);</p>&
71、lt;p> LCD_Delay(255);</p><p> LCD_Delay(200);</p><p><b> }</b></p><p> void LCD_Init(void)</p><p><b> {</b></p><p> LCD_cm
72、d(0x28);</p><p><b> LCD_En();</b></p><p> LCD_cmd(0x28);</p><p> LCD_cmd(0x0c);</p><p> LCD_Clr();</p><p><b> }</b></p>
73、<p> void LCD_Dat(uchar dat)</p><p><b> {</b></p><p> uchar dat1;</p><p><b> dat1=dat;</b></p><p><b> dat1>>=4;</b>
74、</p><p> LCD_Delay(18);</p><p><b> LCD_RS=1;</b></p><p> LCD_DATA &=0xf0;</p><p> LCD_DATA |=dat1&0x0f;</p><p><b> LCD_En();
75、</b></p><p> LCD_DATA &=0xf0;</p><p> LCD_DATA |=dat&0x0f;</p><p><b> LCD_En();</b></p><p><b> }</b></p><p> voi
76、d LCD_Pos(uchar x,uchar y)</p><p><b> {</b></p><p> if(y)LCD_cmd(x|0xc0);</p><p> else LCD_cmd(x|0x80);</p><p><b> }</b></p><p>
77、; void LCD_Prints(uchar x,uchar y,uchar *str)</p><p><b> {</b></p><p> LCD_Pos(x,y);</p><p> while(*str)</p><p><b> {</b></p><p&
78、gt; LCD_Dat(*str);</p><p><b> str++;</b></p><p><b> }</b></p><p><b> }</b></p><p> 按鍵驅(qū)動函數(shù)及程序KEY.h</p><p> #ifndef
79、 _KEY_H_</p><p> #define _KEY_H_</p><p> #include<reg52.h></p><p> #define uchar unsigned char</p><p> #define UP 0x01</p><p> #define DOWN 0x02
80、</p><p> #define ENTER 0x03</p><p> sbit UP_key=P2^2;</p><p> sbit DOWN_key=P2^1;</p><p> sbit ENTER_key=P2^0;</p><p> void ys (unsigned int x)</p&
81、gt;<p><b> {</b></p><p> unsigned char j;</p><p> while (x--)</p><p><b> {</b></p><p> for (j=0;j<123;j++){;}</p><p>
82、;<b> }</b></p><p><b> }</b></p><p> uchar KeyScanNUM(void)</p><p><b> {</b></p><p> uchar key=0;</p><p> UP_key=1
83、;DOWN_key=1;ENTER_key=1;</p><p> if(UP_key==0){ys(10);if(UP_key==0)key=UP;else key=0;}</p><p> if(DOWN_key==0){ys(10);if(DOWN_key==0)key=DOWN;else key=0;}</p><p> if(ENTER_key==0
84、){ys(10);if(ENTER_key==0)key=ENTER;else key=0;}</p><p> return key;</p><p><b> }</b></p><p> TCL549驅(qū)動函數(shù)及程序TCL549.h /*-------------------------------------------------
85、-----------</p><p> 功能:TCL549的頭文件</p><p> ------------------------------------------------------------*/</p><p> #ifndef __TCL549_H__</p><p> #define __TCL549_H__&l
86、t;/p><p> #include<reg52.h></p><p> #define uint unsigned int</p><p> #define uchar unsigned char</p><p> //ADC0832引腳與51單片機(jī)的連接</p><p> sbit AD_CS
87、 =P3^3; </p><p> sbit AD_DAT =P3^7; </p><p> sbit AD_CLK =P3^6; </p><p> void delay(uint x)</p><p><b> {</b></p><p> while(x--);</p&g
88、t;<p><b> }</b></p><p> uchar AD_TLC549()</p><p><b> {</b></p><p> uchar value=0,i=0;</p><p><b> AD_CS=0;</b></p>
89、<p><b> AD_DAT=1;</b></p><p> for (i=0;i<8;i++)</p><p><b> {</b></p><p> if(AD_DAT)value|=(0x80)>>i;</p><p><b> AD_CLK
90、=1;</b></p><p><b> AD_CLK=0;</b></p><p> delay(10);</p><p><b> }</b></p><p><b> AD_CS=1;</b></p><p> delay(5
91、0);</p><p> return value;</p><p><b> }</b></p><p><b> #endif</b></p><p> 智能溫度傳感器DS18B20驅(qū)動函數(shù)DS18B20.h</p><p> #ifndef _DS18B20_
92、</p><p> #define _DS18B20_</p><p> #include<reg52.h></p><p> #define uint unsigned int</p><p> #define uchar unsigned char</p><p> sbit DQ = P
93、3^4; //溫度傳送數(shù)據(jù)接口,根據(jù)實際電路修改</p><p> //unsigned char temp_value; //存放溫度數(shù)據(jù)</p><p> //unsigned char TempBuffer[6]; //存放轉(zhuǎn)換成液晶字符的數(shù)組 ××注意此數(shù)組的定義</p><p> void
94、Init_DS18B20(void); //初始化DS18B20,</p><p> uchar ReadTemp(void); //讀DS18B20溫度,存入temp_valu</p><p> //轉(zhuǎn)換結(jié)果正溫度為3位整數(shù),負(fù)溫度為兩位整數(shù);都無小數(shù)部分</p><p> //void temp_to_str(void);
95、 //溫度數(shù)據(jù)轉(zhuǎn)換成液晶顯示字符(ASIC碼)</p><p><b> #endif</b></p><p> 智能溫度傳感器DS18B20驅(qū)動程序DS18B20.c</p><p> #include <REG52.H></p><p> #include "ds18b20.h&quo
96、t;</p><p> //sbit DQ = P1^0; //溫度傳送數(shù)據(jù)IO口</p><p> unsigned char temp_value; //存放溫度數(shù)據(jù)</p><p> unsigned char TempBuffer[3]; //volatile存放轉(zhuǎn)換成液晶字符的數(shù)組
97、 ××注意此數(shù)組的定義</p><p> void delay_18B20(unsigned int i)</p><p><b> {</b></p><p> while(i--);</p><p><b> }</b></p><p> v
98、oid Init_DS18B20(void)</p><p><b> {</b></p><p> unsigned char x=0;</p><p> DQ = 1; //DQ復(fù)位</p><p> delay_18B20(8); //稍做延時</p><p>
99、 DQ = 0; //單片機(jī)將DQ拉低</p><p> delay_18B20(80); //精確延時 大于 480us</p><p> DQ = 1; //拉高總線</p><p> delay_18B20(14);</p><p> x=DQ; //稍做延時后 如果x=
100、0則初始化成功 x=1則初始化失敗</p><p> delay_18B20(20);</p><p><b> }</b></p><p> /***********ds18b20讀一個字節(jié)**************/ </p><p> unsigned char ReadOneChar(void)<
101、;/p><p><b> {</b></p><p> uchar i=0;</p><p> uchar dat = 0;</p><p> for (i=8;i>0;i--)</p><p><b> {</b></p><p> D
102、Q = 0; // 給脈沖信號</p><p><b> dat>>=1;</b></p><p> DQ = 1; // 給脈沖信號</p><p><b> if(DQ)</b></p><p> dat|=0x80;</p><p> delay_
103、18B20(4);</p><p><b> }</b></p><p> return(dat);</p><p><b> }</b></p><p> /*************ds18b20寫一個字節(jié)****************/ </p><p>
104、 void WriteOneChar(uchar dat)</p><p><b> {</b></p><p> unsigned char i=0;</p><p> for (i=8; i>0; i--)</p><p><b> {</b></p><p&g
105、t;<b> DQ = 0;</b></p><p> DQ = dat&0x01;</p><p> delay_18B20(5);</p><p><b> DQ = 1;</b></p><p><b> dat>>=1;</b></p
106、><p><b> }</b></p><p><b> }</b></p><p> /**************讀取ds18b20當(dāng)前溫度************/</p><p> uchar ReadTemp(void)</p><p><b> {
107、</b></p><p> unsigned char a=0;</p><p> unsigned char b=0;</p><p> unsigned char t=0;</p><p> Init_DS18B20();</p><p> WriteOneChar(0xCC); //
108、 跳過讀序號列號的操作</p><p> WriteOneChar(0x44); // 啟動溫度轉(zhuǎn)換</p><p> delay_18B20(100); // this message is wery important</p><p> Init_DS18B20();</p><p> WriteOneChar(0x
109、CC); //跳過讀序號列號的操作</p><p> WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度</p><p> delay_18B20(100);</p><p> a=ReadOneChar(); //讀取溫度值低位</p><p> b=ReadOneChar(
110、); //讀取溫度值高位</p><p> temp_value=b<<4;</p><p> temp_value+=(a&0xf0)>>4; </p><p> return temp_value;</p><p><b> }</b></p><p
111、> /*void temp_to_str(void) //溫度數(shù)據(jù)轉(zhuǎn)換成液晶字符顯示</p><p><b> {</b></p><p> //TempBuffer=temp_value; //百位</p><p> TempBuffer[0]=temp_value%100/10+48; //十位</p>
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 機(jī)電單片機(jī)應(yīng)用技術(shù)課程設(shè)計--單片機(jī)多功能測量儀的設(shè)計
- 單片機(jī)課程設(shè)計-多功能時鐘
- 單片機(jī)課程設(shè)計---多功能時鐘
- 單片機(jī)課程設(shè)計--多功能系統(tǒng)
- 壓力測量儀的設(shè)計led顯示-單片機(jī)應(yīng)用課程設(shè)計
- 單片機(jī)課程設(shè)計----多功能秒表
- 單片機(jī)課程設(shè)計--單片機(jī)轉(zhuǎn)速測量系統(tǒng)
- 單片機(jī)數(shù)字時鐘課程設(shè)計--單片機(jī)多功能電子鐘設(shè)計
- 單片機(jī)課程設(shè)計---多功能時鐘設(shè)計
- 單片機(jī)課程設(shè)計---多功能時鐘設(shè)計
- 單片機(jī)課程設(shè)計-基于單片機(jī)的多功能電子鐘的設(shè)計
- 單片機(jī)課程設(shè)計---基于單片機(jī)溫度測量系統(tǒng)設(shè)計
- 單片機(jī)課程設(shè)計--基于單片機(jī)的多功能綜合應(yīng)用系統(tǒng)的設(shè)計
- 基于單片機(jī)的多功能功率因數(shù)測量儀設(shè)計開題報告
- 基于單片機(jī)的脈搏測量儀的設(shè)計
- 多功能數(shù)字時鐘 單片機(jī)課程設(shè)計
- 基于單片機(jī)的多功能功率因數(shù)測量儀設(shè)計開題報告
- 基于avr單片機(jī)的風(fēng)速測量儀設(shè)計
- 基于單片機(jī)多功能秒表課程設(shè)計
- 基于avr單片機(jī)的風(fēng)速測量儀設(shè)計
評論
0/150
提交評論