|
- uint8_t DS18B20_Crc(uint8_t *addr, uint8_t len)
- {
- uint8_t crc = 0, inbyte, i, mix;
- while(len --)
- {
- inbyte = *addr++;
-
- for(i = 8; i; i--)
- {
- mix = (crc ^ inbyte) & 0x01;
- crc >>= 1;
- if(mix)
- {
- crc ^= 0x8C;
- }
- inbyte >>= 1;
- }
- }
- return crc;
- }
- 序列號CRC可以校驗,溫度值校驗不通過還是
- bool DS18B20_Get_Temp(short *tem)
- {
- u8 temp;
- u8 TL,TH;
- u8 crc;
- u8 i;
- DS18B20_Start (); // ds1820 start convert
- DS18B20_Rst();
- DS18B20_Check();
- DS18B20_Write_Byte(0xcc);// skip rom
- DS18B20_Write_Byte(0xbe);// convert
- for(i = 0; i < 9; i++)
- {
- scrbuf[i] = DS18B20_Read_Byte();
- }
- crc = DS18B20_Crc(scrbuf,8);
- if(scrbuf[8] == crc)
- {
- TL = scrbuf[0]; // LSB
- TH = scrbuf[1]; // MSB
- if(TH>7)
- {
- TH=~TH;
- TL=~TL;
- temp=0;//溫度為負
- }else temp=1;//溫度為正
- *tem=TH; //獲得高八位
- (*tem)<<=8;
- *tem+=TL;//獲得底八位
- *tem=(double)*tem*0.625;//轉換
- if(!temp) *tem =-(*tem); // 負數
- else;
- return true;
- }
- else
- return false;
- }
- bool DS18B20_Read_ID(uint8_t *ID)
- {
- u8 crc;
- u8 i;
- DS18B20_Rst();
- DS18B20_Check();
- DS18B20_Write_Byte(0x33);
- for(i = 0; i < 8; i++)
- {
- ID[i] = DS18B20_Read_Byte();
- }
- crc = DS18B20_Crc(ID,7);
- if( ID[7] == crc )
- {
- return true;
- }
- else
- {
- return false;
- }
- }
復制代碼 |
|