基于PIC單片機(jī)的實(shí)時(shí)溫度控制系統(tǒng)方案_第1頁(yè)
基于PIC單片機(jī)的實(shí)時(shí)溫度控制系統(tǒng)方案_第2頁(yè)
基于PIC單片機(jī)的實(shí)時(shí)溫度控制系統(tǒng)方案_第3頁(yè)
基于PIC單片機(jī)的實(shí)時(shí)溫度控制系統(tǒng)方案_第4頁(yè)
基于PIC單片機(jī)的實(shí)時(shí)溫度控制系統(tǒng)方案_第5頁(yè)
已閱讀5頁(yè),還剩6頁(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)介

1、 PAGE11 / NUMPAGES11基于PIC單片機(jī)的實(shí)時(shí)溫度控制系統(tǒng)/ 實(shí)現(xiàn)的功能:數(shù)碼管顯示實(shí)時(shí)溫度,支持負(fù)溫度/ 芯片PIC16F877/ XT:4MHZ/*#include /包含單片機(jī)部資源預(yù)定義#define LVP 0 x3f39/ 晶振:XT;代碼:沒(méi)有代碼保護(hù);上電延時(shí)定時(shí)器關(guān)閉;/ 低電壓復(fù)位禁止;看門狗關(guān)閉 ;低電壓編程禁止_CONFIG (XT & UNPROTECT & PWRTDIS & BORDIS & WDTDIS & LVP);#define uch unsigned char /給unsigned char起別名 uch#define DQ RA2 /定

2、義18B20數(shù)據(jù)端口 #define DQ_DIR TRISA2 /定義18B20D口方向寄存器 #define DQ_HIGH() DQ_DIR =1 /設(shè)置數(shù)據(jù)口為輸入#define DQ_LOW() DQ_DIR = 0;DQ = 0 /設(shè)置數(shù)據(jù)口為輸出const unsigned char ledcode12=0 x3F,0 x06,0 x5B,0 x4F,0 x66,0 x6D,0 x7D,0 x07,0 x7F,0 x6F,0 x00,0 x40;/不帶小數(shù)點(diǎn)的共陰極數(shù)碼管0123456789段碼,正負(fù)符號(hào)位const unsigned char ledcode112=0 xBF,

3、0 x86,0 xDB,0 xCF,0 xE6,0 xED,0 xFD,0 x87,0 xFF,0 xEF,0 x00,0 x40; /帶小數(shù)點(diǎn)的共陰極數(shù)碼管0123456789段碼 ,正負(fù)符號(hào)位void init_port(void);void delay(char x,char y); void delay_1ms(void);void delay_ms(unsigned int time);void interrupt dealtime();void tmint(void);void timetoseg(uch fh_temp,uch bai_temp,uch shi_temp,uch

4、ge_temp,uch sf_temp,uch bf_temp,uch qf_temp,uch wf_temp);void binary_temp(uch TL , signed char TH);void reset(void);void write_byte(uch val);uch read_byte(void);void get_temp(void);unsigned char display_data8;unsigned char intcount=0; uch TLV=0 ; /采集到的溫度高8位uch THV=0; /采集到的溫度低8位union temp /定義一個(gè)聯(lián)合體int

5、 T; uch TV2; temp;signed char TZ=0; /轉(zhuǎn)換后的溫度值整數(shù)部分,有符號(hào)位uch TX=0; /轉(zhuǎn)換后的溫度值小數(shù)部分unsigned int wd; /轉(zhuǎn)換后的溫度值BCD碼形式unsigned char fh; /符號(hào)位unsigned char bai; /整數(shù)百位unsigned char shi; /整數(shù)十位unsigned char ge; /整數(shù)個(gè)位unsigned char shifen; /十分位unsigned char baifen; /百分位unsigned char qianfen; /千分位unsigned char wanfen;

6、/萬(wàn)分位/*/ 主程序/*void main(void)init_port();tmint();while(1) get_temp(); timetoseg(fh,bai,shi,ge,shifen,baifen,qianfen,wanfen); /*/ 端口初始化/ PORTD作為數(shù)碼管段驅(qū)動(dòng)(高有效)/ PORTE作為數(shù)碼管位選擇驅(qū)動(dòng)(低有效)/*void init_port(void)RBPU=0;/ PORTB=0 xFF;TRISB=0 xFF; PORTD=0 x00; /TRISC=0 x00; /C口控制LED指示燈,設(shè)置成輸出TRISD=0; /D口當(dāng)作數(shù)碼管段,設(shè)置成輸出A

7、DCON1=0 x07; /使A口,E口全為數(shù)字I/O口TRISE=0 x00; /E口當(dāng)作數(shù)碼管位選擇控制腳,設(shè)置成輸出 PORTE=0 x00; /*/ 延時(shí)程序/*void delay(char x,char y) char z;do z=y; do;while(-z); while(-x);/其指令時(shí)間為:7+(3*(Y-1)+7)*(X-1)如果再加上函數(shù)調(diào)用的call 指令、頁(yè)面設(shè)定、傳遞參數(shù)花掉的7 個(gè)指令。/則是:14+(3*(Y-1)+7)*(X-1)。/*/ 延遲程序/*void delay_1ms(void)unsigned int n;for(n=0;n0;time-)

8、 delay_1ms(); /復(fù)位DS18B20函數(shù)void reset(void)uch presence=1;while(presence) DQ_LOW() ; /主機(jī)拉至低電平 delay(2,90); /延時(shí)480503us DQ_HIGH(); /釋放總線等電阻拉高總線,并保持1560us delay(2,8); /延時(shí)60us if(DQ=1) presence=1; /沒(méi)有接收到應(yīng)答信號(hào),繼續(xù)復(fù)位 else presence=0; /接收到應(yīng)答信號(hào) delay(2,70); /延時(shí)240us /寫18b20寫字節(jié)函數(shù)void write_byte(uch val)uch i;u

9、ch temp;for(i=8;i0;i-) temp=val&0 x01; /最低位移出 DQ_LOW(); NOP(); NOP(); NOP(); NOP(); NOP(); /從高拉至低電平,產(chǎn)生寫時(shí)間隙 if(temp=1) DQ_HIGH(); /如果寫1,拉高電平 delay(2,7); /延時(shí)63us DQ_HIGH(); NOP(); NOP(); val=val1; /右移一位/18b20讀字節(jié)函數(shù)uch read_byte(void)uch i;uch value=0; /讀出溫度static bit j;for(i=8;i0;i-) value=1; DQ_LOW();

10、 /每次讀時(shí)隙由主機(jī)發(fā)起,拉低總線至少1s。 NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); /6us DQ_HIGH(); /讀時(shí)隙開(kāi)始后的15s釋放總線,拉至高電平,準(zhǔn)備采樣總線。 NOP(); NOP(); NOP(); NOP(); NOP(); /5us j=DQ; /采樣總線 if(j) value|=0 x80; /把采樣到的數(shù)據(jù)放入value delay(2,7); /所有讀時(shí)隙至少60s,這里大約63usreturn(value);/啟動(dòng)溫度轉(zhuǎn)換函數(shù)void get_temp() int i;DQ_HIGH();reset(); /復(fù)位等待

11、從機(jī)應(yīng)答 write_byte(0XCC); /忽略ROM匹配 write_byte(0X44); /發(fā)送溫度轉(zhuǎn)化命令 for(i=10;i0;i-) delay(201,132); reset(); /再次復(fù)位,等待從機(jī)應(yīng)答 write_byte(0XCC); /忽略ROM匹配 write_byte(0XBE); /發(fā)送讀溫度命令TLV=read_byte(); /讀出溫度低8位 THV=read_byte(); /讀出溫度高8位DQ_HIGH(); /釋放總線 TZ=(TLV4)|(THV4); /溫度整數(shù)部分TX=TLV=0) /如果是正溫度 fh=0 x0A; /正數(shù)符號(hào)位 bai=T

12、H/100; /整數(shù)部分百位 shi=(TH%100)/10;/十位 /整數(shù)十位 ge=(TH%100)%10;/個(gè)位 /整數(shù)部分個(gè)位 wd=0; if (TL & 0 x80) wd=wd+5000; if (TL & 0 x40) wd=wd+2500; if (TL & 0 x20) wd=wd+1250; if (TL & 0 x10) wd=wd+625; /以上4條指令把小數(shù)部分轉(zhuǎn)換為BCD碼形式 shifen=wd/1000; /十分位 baifen=(wd%1000)/100; /百分位 qianfen=(wd%100)/10; /千分位 wanfen=wd%10; /萬(wàn)分位

13、NOP(); else /否則,是負(fù)溫度,要求補(bǔ)碼temp.TV0=TL;temp.TV1=TH ;temp.T=(temp.T)+0 x0010; /補(bǔ)碼形式,起反加1 TL=temp.TV0;TH=temp.TV1; fh=0 x0B; /負(fù)數(shù)符號(hào)位 bai=TH/100; /整數(shù)部分百位 shi=(TH%100)/10;/十位 /整數(shù)十位 ge=(TH%100)%10;/個(gè)位 /整數(shù)部分個(gè)位 wd=0; if (TL & 0 x80) wd=wd+5000; if (TL & 0 x40) wd=wd+2500; if (TL & 0 x20) wd=wd+1250; if (TL &

14、0 x10) wd=wd+625; /以上4條指令把小數(shù)部分轉(zhuǎn)換為BCD碼形式 shifen=wd/1000; /十分位 baifen=(wd%1000)/100; /百分位 qianfen=(wd%100)/10; /千分位 wanfen=wd%10; /萬(wàn)分位 NOP();/ 溫度值各位轉(zhuǎn)換成段碼/*void timetoseg(uch fh_temp,uch bai_temp,uch shi_temp,uch ge_temp,uch sf_temp,uch bf_temp,uch qf_temp,uch wf_temp) display_data0 = ledcodewf_temp; d

15、isplay_data1 = ledcodeqf_temp; display_data2 = ledcodebf_temp; display_data3 = ledcodesf_temp; display_data4 = ledcode1ge_temp; display_data5 = ledcodeshi_temp; display_data6 = ledcodebai_temp; display_data7 = ledcodefh_temp;/*/ 定時(shí)中斷初始化(OPTION_REG)/*void tmint(void)T0CS=0; /時(shí)鐘源為部指令周期 PSA=0; /分頻器分配給T

16、MR0 / PS2=0; /TMR0的分頻比為1:16 PS1=1;PS0=1;/GIE=1; /允許總中斷 T0IE=1; /允許定時(shí)器0溢出中斷T0IF=0; /清楚定時(shí)器0中斷標(biāo)志TMR0=0X06; /預(yù)置初值 T=(256-6)x16=4000uS/*void interrupt dealtime() /中斷入口,該中斷完成數(shù)碼管的動(dòng)態(tài)掃描 /每中斷一次的時(shí)間為4毫秒 T0IF=0; TMR0=0X06; PORTD = 0 x00; /先關(guān)閉顯示 if(intcount=0) PORTD = display_data0; PORTE=0 x00; intcount+=1; else if(intcount=1) PORTD = display_data1; PORTE=0 x01; intcount+=1; else if(intcount=2) PORTD = display_data2; PORTE=0 x02; intcount+=1; else if(intcount=3) PORTD = display_data3; PORTE=0 x03; intcount+=1; else if(intcount=

溫馨提示

  • 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)論