




已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
歡迎光臨我的學(xué)習(xí)交流博客:上面有很多我個人的嵌入式開發(fā)經(jīng)驗總結(jié)、程序源碼及詳細注釋。郵箱:電路實物圖如下圖所示:電路原理圖如下圖所示:C語言程序如下所示:/* 程序名; 基于DS18B20的測溫系統(tǒng)* 功 能: 實時測量溫度,超過上下限報警,報警溫度可手動調(diào)整。K1是用來* 進入上下限調(diào)節(jié)模式的,當按一下K1進入上限調(diào)節(jié)模式,再按一下進入下限* 調(diào)節(jié)模式。在正常模式下,按一下K2進入查看上限溫度模式,顯示1s左右自動* 退出;按一下K3進入查看下限溫度模式,顯示1s左右自動退出;在調(diào)節(jié)上下限* 溫度模式下,K2是實現(xiàn)加1功能,K1是實現(xiàn)減1功能,K3是用來設(shè)定上下限溫* 度正負的。 * 編程者:ZPZ* 編程時間:2009/10/2 */#include#include#define uint unsigned int #define uchar unsigned charuchar max_int=0x00,max_dot=0x00,min_int=0x00,min_dot=0x00;bit s=0,s1=0; #includeds18b20.h#includekeyscan.h#includedisplay.h/*主函數(shù)*/void main() beer=0; led=1; IT1=1; EX1=0; EA=1; timer1_init(0); get_temperature(1); while(1) keyscan(); get_temperature(0); keyscan(); display(temp,temp_d*0.625); alarm(); keyscan(); /* 程序名; _ds18b20_h_* 功 能: DS18B20的c51編程頭文件 * 編程者:ZPZ* 編程時間:2009/10/2 * 說 明:用到的全局變量是:無符號字符型變量temp(測得的溫度整數(shù)部分),temp_d * (測得的溫度小數(shù)部分),標志位f(測量溫度的標志位0表示“正溫度”1表* 示“負溫度”),標志位f_max(上限溫度的標志位0表示“正溫度”、1表* 示“負溫度”),標志位f_min(下限溫度的標志位0表示“正溫度”、1表* 示“負溫度”),標志位w(報警標志位1啟動報警0關(guān)閉報警)。 */#ifndef _ds18b20_h_#define _ds18b20_h_#define uint unsigned int #define uchar unsigned charsbit DQ= P23;sbit beer=P30; sbit led=P31;uchar temp=0; /溫度的整數(shù)部分uchar temp_d=0; /溫度的小數(shù)部uchar n;bit f=0,f_max=0,f_min=0;w=0;/*延時子函數(shù)*/void ds18b20_delayus(uint t) while(t-);void ds18b20_delayms(uint t)uint i,j;for(i=t;i0;i-) for(j=120;j0;j-);/*ds18b20初始化函數(shù)*(*/void ds18b20_init()/ DS18B20初始化 DQ=1;DQ=0; /控制器向DS18B20發(fā)低電平脈沖ds18b20_delayus(30); /延時480sDQ=1;/控制器拉高總線,while(DQ); /等待DS18B20拉低總線,在60-240s之間ds18b20_delayus(20);/延時,等待上拉電阻拉高總線DQ=1;/提升數(shù)據(jù)線,準備數(shù)據(jù)傳輸;/*ds18b20字節(jié)讀函數(shù)*/uchar ds18b20_read() /DS18B20 字節(jié)讀取uchar i;uchar d = 0;DQ = 1;/準備讀;for(i=8;i0;i-) d = 1; /低位先發(fā);DQ = 0;_nop_();_nop_();_nop_();DQ = 1;/必須寫1,否則讀出來的將是不預(yù)期的數(shù)據(jù);if(DQ)/在12us處讀取數(shù)據(jù);d |= 0x80;ds18b20_delayus(10);return d;/*ds18b20字節(jié)寫函數(shù)*/void ds18b20_write(uchar d)/ ds18b20字節(jié)寫 uchar i; for(i=8;i0;i-) DQ=0; _nop_(); _nop_(); _nop_(); DQ=d&0x01; ds18b20_delayus(5); DQ=1; d = 1; /*獲取溫度函數(shù)*/ void get_temperature(bit f) /得到整數(shù)的溫度值uchar a=0,b=0,c=0,d=0; uint i;ds18b20_init(); /DS18B20初始化ds18b20_write(0xcc);/向DS18B20發(fā)SKIP ROM命令ds18b20_write(0x44);/啟動DS18B20進行溫度轉(zhuǎn)換,結(jié)果存入內(nèi)部RAMds18b20_delayms(1);ds18b20_init(); /DS18B20初始化ds18b20_write(0xcc); /向DS18B20發(fā)SKIP ROM命令ds18b20_write(0xbe);/讀內(nèi)部RAM中9字節(jié)的內(nèi)容命令a=ds18b20_read();/讀內(nèi)部RAM (LSB)b=ds18b20_read();/讀內(nèi)部RAM (MSB)if(f=1) max_int=ds18b20_read();/讀內(nèi)部RAM (LSB) min_int=ds18b20_read();if(max_int&0x80)=0x80)f_max=1;max_int=(max_int-0x80); if(min_int&0x80)=0x80)f_min=1;min_int=(min_int-0x80); i=b;i=4;if (i=0) f=0; /i為0,正溫度,設(shè)立正溫度標記 temp=(a4)|(b4)|(b4);/整數(shù)部分 a=(a&0x0f);/小數(shù)部分 temp_d=a; void store_t() if(f_max=1)max_int=max_int+0x80;if(f_min=1)min_int=min_int+0x80; ds18b20_init(); /DS18B20初始化ds18b20_write(0xcc); /向DS18B20發(fā)SKIP ROM命令ds18b20_write(0x4e);ds18b20_write(max_int);ds18b20_write(min_int);ds18b20_write(0xff);ds18b20_init(); /DS18B20初始化ds18b20_write(0xcc); /向DS18B20發(fā)SKIP ROM命令ds18b20_write(0x48); /*溫度超限報警函數(shù)*/ void alarm() if(f_max=0) if(f_min=0) if(f=0) if(temp+temp_d*0.0625)=max_int) w=1;TR1=1; if(temp+temp_d*0.0625)min_int) w=0; if(f=1)w=1;TR1=1; if(f_min=1) if(f=0) if(temp+temp_d*0.0625)=max_int) w=1;TR1=1; if(temp+temp_d*0.0625)=min_int) w=1;TR1=1; if(temp+temp_d*0.0625)min_int ) w=0; if(f_max=1) if(f_min=1) if(f=1) if(temp+temp_d*0.0625)=min_int) w=1;TR1=1; if(temp+temp_d*0.0625)max_int) w=0; if(f=0)w=1;TR1=1; #endif/* 程序名; _keyscan_H_ * 功 能: ds18b20鍵盤頭文件,通過鍵盤設(shè)定設(shè)定上下限報警溫度* 編程者:ZPZ* 編程時間:2009/10/2 */#ifndef _keyscan_H_#define _keyscan_H_sbit key1=P22; sbit key2=P21; sbit key3=P20;sbit key4=P33;uchar a=0,i=0;bit k4=0,v=0,v1=0,v2=0;/*讀鍵盤延時子函數(shù)*/void keyscan_delay(uint z) uint i,j; for(i=z;i0;i-)for(j=120;j0;j-);/*溫度調(diào)節(jié)函數(shù)*/int temp_change(int count,bit f) if(key2=0)keyscan_delay(10);if(key2=0) if(f=0) count+; if(a=1)if(count125) count=125; if(a=2)if(count125) count=125; if(f!=0) count+; if(a=1)if(count55) count=55; if(a=2)if(count55) count=55; while(key2=0);keyscan_delay(10);if(key3=0)keyscan_delay(10);if(key3=0) count-;if(a=1)if(count0) count=0;if(a=2)if(count2)i=0;TR1=0;k4=0;v=0;store_t();get_temperature(1); switch(i) case 0:a=0;break; case 1:a=1;break; case 2:a=2;break; default:break; while(key1=0);keyscan_delay(10);if(a=1&v=1)led=0;max_int=temp_change(max_int,f_max);else if(a=2&v=1)led=1;min_int=temp_change(min_int,f_min);else;if(k4=1)if(key4=0)keyscan_delay(5);if(key4=0) if(a=1) if(max_int55) f_max=0;else f_max=f_max; if(a=2) if(min_int55) f_max=0;else f_min=f_min; while(key4=0);keyscan_delay(10);if(v=0)if(key2=0)keyscan_delay(10);if(key2=0) a=1; TR1=1; s1=1; while(key2=0);keyscan_delay(10);if(key3=0)keyscan_delay(10);if(key3=0) a=2; TR1=1; s1=1; while(key3=0);keyscan_delay(10);if(v1=1)a=0;v1=0;TR1=0; #endif/* 程序名; _ds18b20_display_H_ * 功 能: ds18b20數(shù)碼管動態(tài)顯示頭文件,通過定時器0延時實現(xiàn)數(shù)碼管動態(tài)顯示* 編程者:ZPZ* 編程時間:2009/10/2 */#ifndef _ds18b20_display_H_#define _ds18b20_display_H_#define uint unsigned int #define uchar unsigned charsbit wei1=P24; sbit wei2=P25; sbit wei3=P26; sbit wei4=P27;uchar num=0;uchar code temperature1= 0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f;uchar code temperature2= 0xbf,0x86,0xdb,0xcf,0xe6, 0xed,0xfd,0x87,0xff,0xef;uchar code temperature3= 0x00,0x80,0x40,0x76,0x38;/*延時子函數(shù)*/void display_delay(uint t)uint i,j;for(i=t;i0;i-) for(j=20;j0;j-);/*定時器1初始化函數(shù)*/void timer1_init(bit t) TMOD=0x10; TH0=0x3c; TL0=0xb0; EA=1; ET1=1; TR1=t;/*定時器1中斷函數(shù)*/void timer1() interrupt 3 TH0=0x3c; TL0=0xb0;num+; if(num25) num=0; s1=0; v1=1; /*調(diào)節(jié)選擇函數(shù)*/void selsct_1(uchar f,uchar k) if(f=0) if(k/100=0) P0=temperature30; else P0=temperature1k/100; if(f=1) if(k%100/10=0) P0=temperature30; else P0=temperature32; void selsct_2(bit f,uchar k) if(f=0) if(k/100=0)&(k%100/10=0) P0=temperature30; else P0=temperature1k%100/10; if(f=1) if(k%100/10=0) P0=temperature32; else P0=temperature1k%100/10; /*顯示函數(shù)*/void display(uchar t,uchar t_d) uchar i; for(i=0;i4;i+) switch(i) case 0: if(a=0)selsct_1(f,t); if(a=1) if(s=0) selsct_1(f_max,max_int); else P0=temperature30; if(s1=1) selsct_1(f_max,max_int); if(a=2) if(s=0) selsct_1(f_min,min_int); else P0=temperature30; if(s1=1) selsct_1(f_min,min_int); wei2=0; wei3=0; wei4=0; wei1=1; break; case 1: if(a=0)selsct_2(f,t); if(a=1) if(s=0) selsct_2(f_max,max_int); else P0=temperature30; if(s1=1) selsct_2(f_max,max_int); if(a=2) if(s=0) selsct_2(f_min,min_int); else P0=temperature30; if(s1=1) selsct_2(f_min,min_int); wei1=0; wei3=0; wei4=0; wei2=1; break; case 2: if(a=0)P0=temperature2t%10; if(a=1) if(s=0) P0=temperature2max_int%10; else P0=temperature30; if(s1=1) P0=temperature2max_int%10; if(a=2) if(s=0) P0=temperature2min_int%10; else P0=temperature30; if(s1=1) P0=temperature2min_int%10; wei1=0; wei2=0; wei4=0; wei3=1; break; case 3: if(a=0)P0=temperature1t_d; if(a=1) if(s=0)P0=temperature10;else P0=temperature30;if(s1=1) P0=temperature10; if(a=2) if(s=0)P0=temperature10;else P0=temperature30;if(s1=1) P0=temperature10; wei1=0; wei2=0; wei3=0; wei4=1; break; display_delay(16);#endif袁節(jié)膅薂羄肅蒃薁蚃芀荿薀螆肅芅蕿袈羋膁蚈羀肁蒀蚇蝕襖莆蚇螂肀莂蚆羅袂羋蚅蚄膈膄蚄螇羈蒂蚃衿膆莈螞羈罿芄螁蟻膄膀螁螃羇葿螀裊膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃螞肂莈蒂螄羋芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羈莀蒈羃膇芆蕆蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃蠆羆艿薃袁節(jié)膅薂羄肅蒃薁蚃芀荿薀螆肅芅蕿袈羋膁蚈羀肁蒀蚇蝕襖莆蚇螂肀莂蚆羅袂羋蚅蚄膈膄蚄螇羈蒂蚃衿膆莈螞羈罿芄螁蟻膄膀螁螃羇葿螀裊膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃螞肂莈蒂螄羋芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羈莀蒈羃膇芆蕆蚃羀膂蒆螅膅蒁薅袇羈莇襖羋蕆袇螀芇蕿蝕聿芆艿蒃肅芅蒁螈羈芄薃薁袆芃芃螆螂芃蒞蕿肁節(jié)蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈螞螂羂薁袈肀肁芀蟻羆肁莃袆袂肀薅蠆袈聿蚇蒂膇肈莇螇肅肇葿薀罿肆薂螆裊肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羈膂莈蚅袇膁蒀袀螃膀薂蚃肂腿節(jié)衿羈腿莄螞襖羋蕆袇螀芇蕿蝕聿芆艿蒃肅芅蒁螈羈芄薃薁袆芃芃螆螂芃蒞蕿肁節(jié)蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈螞螂羂薁袈肀肁芀蟻羆肁莃袆袂肀薅蠆袈聿蚇蒂膇肈莇螇肅肇葿薀罿肆薂螆裊肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羈膂莈蚅袇膁蒀袀螃膀薂蚃肂腿節(jié)衿羈腿莄螞襖羋蕆袇螀芇蕿蝕聿芆艿蒃肅芅蒁螈羈芄薃薁袆芃芃螆螂芃蒞蕿肁節(jié)蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈螞螂羂薁袈肀肁芀蟻羆肁莃袆袂肀薅蠆袈聿蚇蒂膇肈莇螇肅肇葿薀罿肆薂螆裊肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羈膂莈蚅袇膁蒀袀螃膀薂蚃肂腿節(jié)衿羈腿莄螞襖羋蕆袇螀芇蕿蝕聿芆艿蒃肅芅蒁螈羈芄薃薁袆芃芃螆螂芃蒞蕿肁節(jié)蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈螞螂羂薁袈肀肁芀蟻羆肁莃袆袂肀薅蠆袈聿蚇蒂膇肈莇螇肅肇葿薀罿肆薂螆裊肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羈膂莈蚅袇膁蒀袀螃膀薂蚃肂腿節(jié)衿羈腿莄螞襖羋蕆袇螀芇蕿蝕聿芆艿蒃肅芅蒁螈羈芄薃薁袆芃芃螆螂芃蒞蕿肁節(jié)蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈螞螂羂薁袈肀肁芀蟻羆肁莃袆袂肀薅蠆袈聿蚇蒂膇肈莇螇肅肇葿薀罿肆薂螆裊肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羈膂莈蚅袇膁蒀袀螃膀薂蚃肂腿節(jié)衿羈腿莄螞襖羋蕆袇螀芇蕿蝕聿芆艿蒃肅芅蒁螈羈芄薃薁袆芃芃螆螂芃蒞蕿肁節(jié)蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈螞螂羂薁袈肀肁芀蟻羆肁莃袆袂肀薅蠆袈聿蚇蒂膇肈莇螇肅肇葿薀罿肆薂螆裊肅芁薈螁膅莃螄聿膄蒆薇袁節(jié)膅薂羄肅蒃薁蚃芀荿薀螆肅芅蕿袈羋膁蚈羀肁蒀蚇蝕襖莆蚇螂肀莂蚆羅袂羋蚅蚄膈膄蚄螇羈蒂蚃衿膆莈螞羈罿芄螁蟻膄膀螁螃羇葿螀裊膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃螞肂莈蒂螄羋芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羈莀蒈羃膇芆蕆蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃蠆羆艿薃袁節(jié)膅薂羄肅蒃薁蚃芀荿薀螆肅芅蕿袈羋膁蚈羀肁蒀蚇蝕襖莆蚇螂肀莂蚆羅袂羋蚅蚄膈膄蚄螇羈蒂蚃衿膆莈螞羈罿芄螁蟻膄膀螁螃羇葿螀裊膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃螞肂莈蒂螄羋芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羈莀蒈羃膇芆蕆蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃蠆羆艿薃袁節(jié)膅薂羄肅蒃薁蚃芀荿薀螆肅芅蕿袈羋膁蚈羀肁蒀蚇蝕襖莆蚇螂肀莂蚆羅袂羋蚅蚄膈膄蚄螇羈蒂蚃衿膆莈螞羈罿芄螁蟻膄膀螁螃羇葿螀裊膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃螞肂莈蒂螄羋芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羈莀蒈羃膇芆蕆蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃蠆羆艿薃袁節(jié)膅薂羄肅蒃薁蚃芀荿薀螆肅芅蕿袈羋膁蚈羀肁蒀蚇蝕襖莆蚇螂肀莂蚆羅袂羋蚅蚄膈膄蚄螇羈蒂蚃衿膆莈螞羈罿芄螁蟻膄膀螁螃羇葿螀裊膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃螞肂莈蒂螄羋芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羈莀蒈羃膇芆蕆蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃蠆羆艿薃袁節(jié)膅薂羄肅蒃薁蚃芀荿薀螆肅芅蕿袈羋膁蚈羀肁蒀蚇蝕襖莆蚇螂肀莂蚆羅袂羋蚅蚄膈膄蚄螇羈蒂蚃衿膆莈螞羈罿芄螁蟻膄膀螁螃羇葿螀裊膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃螞肂莈蒂螄羋芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羈莀蒈羃膇芆蕆蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃蠆羆艿薃袁節(jié)膅薂羄肅蒃薁蚃芀荿薀螆肅芅蕿袈羋膁蚈羀肁蒀蚇蝕襖莆蚇螂肀莂蚆羅袂羋蚅蚄膈膄蚄螇羈蒂蚃衿膆莈螞羈罿芄螁蟻膄膀螁螃羇葿螀裊膃螈聿蒄葿
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 學(xué)校電視家管理制度
- 學(xué)校課程與管理制度
- 安全與環(huán)保管理制度
- 安吉縣物業(yè)管理制度
- 完美代理商管理制度
- 定量給料機管理制度
- 客戶簽收單管理制度
- 德云社人事管理制度
- 救護隊培訓(xùn)管理制度
- 教官隊日常管理制度
- 耳鼻咽喉科臨床診療指南
- 2022年人教版二年級數(shù)學(xué)(下冊)期末試卷及答案(匯編)
- YSJ 007-1990 有色金屬選礦廠 試驗室、化驗室及技術(shù)檢查站工藝設(shè)計標準(試行)(附條文說明)
- (完整版)學(xué)生課堂學(xué)習(xí)自我評價表
- 麗聲英語百科分級讀物第一級Legs課件
- 義務(wù)教育《化學(xué)》課程標準(2022年版)
- 新通用大學(xué)英語綜合教程2(第2冊)U3課后答案及課件(第三單元unit03)高等教育出版社
- 暑假托管班課程表
- 梁俊嬌稅收籌劃課后思考題
- DTLDTC帶式輸送機工藝流程圖
- 五年級下冊語文第七單元復(fù)習(xí)(人物描寫復(fù)習(xí))(課堂PPT)
評論
0/150
提交評論