1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | #include"reg51.h" #include"d1820.h" int t; uint num; uchar dat; //讀寫數(shù)據(jù)變量 uchar a=0; uchar b=0; float tep=0; //讀一個溫度時的溫度轉換中間間 uchar data tempbuf[4]=0;//溫度字型顯示中間變量 /****************************************************** 函數(shù)名稱:delay(uint num) 返回值:無 參數(shù):uint num 延時數(shù)據(jù)值 作用:延時 *******************************************************/ void delay(uint num) { while(num--); } /****************************************************** 函數(shù)名稱:void Init_DS18B20(void) 返回值:無 參數(shù):無 作用:初始化18B20 *******************************************************/ void Init_DS18B20(void) { char x=0; DQ=1; delay(10);//稍作延時 DQ=0; delay(80);//延時>480us 540us DQ=1; //拉高總線 15-60us delay(20); x=DQ;//讀總線狀態(tài) 為0復位成功,為1則不成功 delay(30); DQ=1;//釋放總線 } /****************************************************** 函數(shù)名稱:uchar ReadOneChar(void) 返回值:uchar dat 參數(shù): 無 作用:讀取1820一個字節(jié) *******************************************************/ uchar ReadOneChar(void) { uchar i; uchar dat=0; for(i=0;i<8;i++) { DQ=0; dat>>=1; DQ=1;//給脈沖 if(DQ) {dat|=0x80;}//讀1 /// 讀0右移處理 delay(8);//15us內(nèi)讀完一個數(shù) } return(dat); } /****************************************************** 函數(shù)名稱:void WriteOneChar(uchar dat) 返回值:無 參數(shù): uchar dat 作用:向1820寫一個字節(jié) *******************************************************/ /////****寫DS18B20***/ //寫0 60us讀完,寫1 30us 內(nèi)讀完 void WriteOneChar(uchar dat) { uchar i=0; for(i=0;i<8;i++) { DQ=0; DQ=dat&0x01;//寫所給數(shù)據(jù)最低位 delay(10); /////////// DQ=1;//給脈沖 dat>>=1; } delay(8); } /****************************************************** 函數(shù)名稱:int ReadOneTemperature(void) 返回值:int t 參數(shù): 無 作用:讀溫度值 *******************************************************/ int ReadOneTemperature(void) ////////***讀取溫度值***********/ //// 每次讀寫均要先復位 { Init_DS18B20(); WriteOneChar(0xcc);//發(fā)跳過ROM命令 WriteOneChar(0x44);//發(fā)讀開始轉換命令 Init_DS18B20(); WriteOneChar(0xcc);//發(fā)跳過ROM命令 WriteOneChar(0xbe);//讀寄存器,共九字節(jié),前兩字節(jié)為轉換值 a=ReadOneChar(); //a存低字節(jié) b=ReadOneChar(); //b存高字節(jié) t=b; t<<=8;//高字節(jié)轉換為10進制 t=t|a; tep=t*0.0625;//轉換精度為0.0625/LSB t=tep*10+0.5;//保留1位小數(shù)并四舍五入****后面除10還原正確溫度值) return(t); } /****************************************************** 函數(shù)名稱:uint Temperaturepro(void) 返回值:void 參數(shù): void 作用:溫度處理 *******************************************************/ void Temperaturepro(void) { int temp; temp=ReadOneTemperature(); tempbuf[3]=temp/1000;//百位 tempbuf[2]=temp/100%10;//十位 tempbuf[1]=temp%100/10; //個位 tempbuf[0]=temp%10; //小數(shù) } |
Powered by 單片機教程網(wǎng)