亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ds18x20.c

?? proteus仿真實例大全
?? C
字號:
/*********************************************************************************
Title:    DS18X20-Functions via One-Wire-Bus
Author:   Martin Thomas <eversmith@heizung-thomas.de>   
          http://www.siwawi.arubi.uni-kl.de/avr-projects
Software: avr-gcc 3.4.1 / avr-libc 1.0.4 
Hardware: any AVR - tested with ATmega16/ATmega32 and 3 DS18B20

Partly based on code from Peter Dannegger and others

changelog:
20041124 - Extended measurements for DS18(S)20 contributed by Carsten Foss (CFO)
200502xx - function DS18X20_read_meas_single
20050310 - DS18x20 EEPROM functions (can be disabled to save flash-memory)
           (DS18X20_EEPROMSUPPORT in ds18x20.h)

**********************************************************************************/

#include <avr/io.h>

#include "ds18x20.h"
#include "onewire.h"
#include "crc8.h"

#ifdef DS18X20_EEPROMSUPPORT
// for 10ms delay in copy scratchpad
#include "delay.h"
#endif

/*----------- start of "debug-functions" ---------------*/
#ifdef DS18X20_VERBOSE
/* functions for debugging-output - undef DS18X20_VERBOSE in .h
   if you run out of program-memory */
#include <string.h>
#include "uart.h"

void DS18X20_uart_put_temp(const uint8_t subzero, 
   const uint8_t cel, 	const uint8_t cel_frac_bits)
 { uint8_t buffer[sizeof(int)*8+1];
   int i;

   uart_putc((subzero)?'-':'+');
   uart_puti((int)cel);
   uart_puts_P(".");
   itoa(cel_frac_bits*DS18X20_FRACCONV,buffer,10);
   for (i=0;i<4-strlen(buffer);i++) uart_puts_P("0");
   uart_puts(buffer);
   uart_puts_P("癈");
 }

void DS18X20_show_id_uart( uint8_t *id, size_t n )
 { size_t i;
   for( i = 0; i < n; i++ ) 
    { if ( i == 0 ) uart_puts_P( "FC:" );
      else if ( i == n-1 ) uart_puts_P( "CRC:" );
      if ( i == 1 ) uart_puts_P( "SN: " );
      uart_puthex_byte(id[i]);
      uart_puts_P(" ");
      if ( i == 0 ) 
       { if ( id[0] == DS18S20_ID ) uart_puts_P ("(18S)");
         else if ( id[0] == DS18B20_ID ) uart_puts_P ("(18B)");
         else uart_puts_P ("( ? )");
       }
    }
   if ( crc8( id, OW_ROMCODE_SIZE) )
      uart_puts_P( " CRC FAIL " );
   else 
      uart_puts_P( " CRC O.K. " );
 }

void show_sp_uart( uint8_t *sp, size_t n )
 { size_t i;
   uart_puts_P( "SP:" );
   for( i = 0; i < n; i++ ) 
    {	if ( i == n-1 ) uart_puts_P( "CRC:" );
      uart_puthex_byte(sp[i]);
      uart_puts_P(" ");
    }
 }

/* verbose output rom-search follows read-scratchpad in one loop */
uint8_t DS18X20_read_meas_all_verbose( void )
 { uint8_t id[OW_ROMCODE_SIZE], sp[DS18X20_SP_SIZE], diff;
   uint8_t i;
   uint16_t meas;
   uint8_t subzero, cel, cel_frac_bits;

   for( diff = OW_SEARCH_FIRST; diff != OW_LAST_DEVICE; )
    { diff = ow_rom_search( diff, &id[0] );
      if( diff == OW_PRESENCE_ERR ) 
       { uart_puts_P( "No Sensor found\r" );
         return OW_PRESENCE_ERR;
       }
      if( diff == OW_DATA_ERR ) 
       { uart_puts_P( "Bus Error\r" );
         return OW_DATA_ERR;
       }

      DS18X20_show_id_uart( id, OW_ROMCODE_SIZE );

      if( id[0] == DS18B20_ID || id[0] == DS18S20_ID ) 
       { // temperature sensor
         uart_putc ('\r');
         ow_byte_wr( DS18X20_READ );			// read command
         for ( i=0 ; i< DS18X20_SP_SIZE; i++ )
            sp[i]=ow_byte_rd();

         show_sp_uart( sp, DS18X20_SP_SIZE );

         if ( crc8( &sp[0], DS18X20_SP_SIZE ) )
            uart_puts_P( " CRC FAIL " );
         else 
            uart_puts_P( " CRC O.K. " );
         
         uart_putc ('\r');
         meas = sp[0]; // LSB Temp. from Scrachpad-Data
         meas |= (uint16_t) (sp[1] << 8); // MSB

         uart_puts_P(" T_raw=");
         uart_puthex_byte((uint8_t)(meas>>8));
         uart_puthex_byte((uint8_t)meas);
         uart_puts_P(" ");

         if( id[0] == DS18S20_ID ) 
          { // 18S20
            uart_puts_P( "S20/09" );
          }
         else if ( id[0] == DS18B20_ID ) 
          { // 18B20
            i=sp[DS18B20_CONF_REG];
            if ( (i & DS18B20_12_BIT) == DS18B20_12_BIT ) 
               uart_puts_P( "B20/12" );
             
            else if ( (i & DS18B20_11_BIT) == DS18B20_11_BIT ) 
               uart_puts_P( "B20/11" );
             
            else if ( (i & DS18B20_10_BIT) == DS18B20_10_BIT ) 
               uart_puts_P( " B20/10 " );
				 
            else 
               // if ( (i & DS18B20_9_BIT) == DS18B20_9_BIT ) { 
               uart_puts_P( "B20/09" );
          } 			
         uart_puts_P(" ");
         DS18X20_meas_to_cel(id[0], sp, &subzero, &cel, &cel_frac_bits);
         DS18X20_uart_put_temp(subzero, cel, cel_frac_bits);
         uart_puts("\r");
       } // if meas-sensor
    } // loop all sensors

   uart_puts_P( "\r" );
	return DS18X20_OK;
 }
#endif

/*----------- end of "debug-functions" ---------------*/

/* 
   convert raw value from DS18x20 to Celsius
   input is: 
   - familycode fc (0x10/0x28 see header)
   - scratchpad-buffer
   output is:
   - cel full celsius
   - fractions of celsius in millicelsius*(10^-1)/625 (the 4 LS-Bits)
   - subzero =0 positiv / 1 negativ
   always returns  DS18X20_OK
   TODO invalid-values detection (but should be covered by CRC)
*/
uint8_t DS18X20_meas_to_cel( uint8_t fc, uint8_t *sp, 
   uint8_t* subzero, uint8_t* cel, uint8_t* cel_frac_bits)
 { uint16_t meas;
   uint8_t  i;

   meas = sp[0];  // LSB
   meas |= ((uint16_t)sp[1])<<8; // MSB
   //meas = 0xff5e; meas = 0xfe6f;

   //  only work on 12bit-base
   if( fc == DS18S20_ID ) 
    { // 9 -> 12 bit if 18S20
      /* Extended measurements for DS18S20 contributed by Carsten Foss */
      meas &= (uint16_t) 0xfffe;	// Discard LSB , needed for later extended precicion calc
      meas <<= 3;					// Convert to 12-bit , now degrees are in 1/16 degrees units
      meas += (16 - sp[6]) - 4;	// Add the compensation , and remember to subtract 0.25 degree (4/16)
    }
	// check for negative 
	if ( meas & 0x8000 )  
    { *subzero=1;      // mark negative
		meas ^= 0xffff;  // convert to positive => (twos complement)++
		meas++;
	 }
	else *subzero=0;

	// clear undefined bits for B != 12bit
   if ( fc == DS18B20_ID ) 
    { // check resolution 18B20
      i = sp[DS18B20_CONF_REG];
      if ( (i & DS18B20_12_BIT) == DS18B20_12_BIT ) 
         ;
      else if ( (i & DS18B20_11_BIT) == DS18B20_11_BIT ) 
         meas &= ~(DS18B20_11_BIT_UNDF);
      else if ( (i & DS18B20_10_BIT) == DS18B20_10_BIT ) 
         meas &= ~(DS18B20_10_BIT_UNDF);
      else 
         // if ( (i & DS18B20_9_BIT) == DS18B20_9_BIT ) { 
         meas &= ~(DS18B20_9_BIT_UNDF);
    }			

   *cel  = (uint8_t)(meas >> 4); 
   *cel_frac_bits = (uint8_t)(meas & 0x000F);
   return DS18X20_OK;
 }

/* converts to decicelsius
   input is ouput from meas_to_cel
   returns absolute value of temperatur in decicelsius
	i.e.: sz=0, c=28, frac=15 returns 289 (=28.9癈)
0	0	0	
1	625	625	1
2	1250	250	
3	1875	875	3
4	2500	500	4
5	3125	125	
6	3750	750	6
7	4375	375	
8	5000	0	
9	5625	625	9
10	6250	250	
11	6875	875	11
12	7500	500	12
13	8125	125	
14	8750	750	14
15	9375	375	*/
uint16_t DS18X20_temp_to_decicel(uint8_t subzero, uint8_t cel, 
   uint8_t cel_frac_bits)

 { uint16_t h;
   uint8_t  i;
   uint8_t need_rounding[] = { 1, 3, 4, 6, 9, 11, 12, 14 };

   h = cel_frac_bits*DS18X20_FRACCONV/1000;
   h += cel*10;
   if (!subzero) 
    { for (i=0; i<sizeof(need_rounding); i++) 
       { if ( cel_frac_bits == need_rounding[i] ) 
          { h++;
            break;
          }
       }
    }
   return h;
 }

/* compare temperature values (full celsius only)
   returns -1 if param-pair1 < param-pair2 
         0 if == 
         1 if >  */
int8_t DS18X20_temp_cmp(uint8_t subzero1, uint16_t cel1, 
   uint8_t subzero2, uint16_t cel2)

 { int16_t t1 = (subzero1) ? (cel1*(-1)) : (cel1);
   int16_t t2 = (subzero2) ? (cel2*(-1)) : (cel2);

   if (t1<t2) return -1;
   if (t1>t2) return 1;
   return 0;
 }

/* find DS18X20 Sensors on 1-Wire-Bus
   input/ouput: diff is the result of the last rom-search
   output: id is the rom-code of the sensor found */
void DS18X20_find_sensor(uint8_t *diff, uint8_t id[])
 { for (;;) 
    { *diff = ow_rom_search( *diff, &id[0] );
      if ( *diff==OW_PRESENCE_ERR || *diff==OW_DATA_ERR ||
      *diff == OW_LAST_DEVICE ) return;
      if ( id[0] == DS18B20_ID || id[0] == DS18S20_ID ) return;
    }
 }

/* get power status of DS18x20 
   input  : id = rom_code 
   returns: DS18X20_POWER_EXTERN or DS18X20_POWER_PARASITE */
uint8_t	DS18X20_get_power_status(uint8_t id[])
 { uint8_t pstat;
   ow_reset();
   ow_command(DS18X20_READ_POWER_SUPPLY, id);
   pstat=ow_bit_io(1); // pstat 0=is parasite/ !=0 ext. powered
   ow_reset();
   return (pstat) ? DS18X20_POWER_EXTERN: DS18X20_POWER_PARASITE;
 }

/* start measurement (CONVERT_T) for all sensors if input id==NULL 
   or for single sensor. then id is the rom-code */
uint8_t DS18X20_start_meas( uint8_t with_power_extern, uint8_t id[])
 { ow_reset(); //**
   if( ow_input_pin_state() ) 
    { // only send if bus is "idle" = high
      ow_command( DS18X20_CONVERT_T, id );
      if (with_power_extern != DS18X20_POWER_EXTERN)
         ow_parasite_enable();

      return DS18X20_OK;
    } 
   else 
    { //
      #ifdef DS18X20_VERBOSE
      uart_puts_P( "DS18X20_start_meas: Short Circuit !\r" );
      #endif
      return DS18X20_START_FAIL;
    }
 }

/* reads temperature (scratchpad) of sensor with rom-code id
   output: subzero==1 if temp.<0, cel: full celsius, mcel: frac 
   in millicelsius*0.1
   i.e.: subzero=1, cel=18, millicel=5000 = -18,5000癈 */
uint8_t DS18X20_read_meas(uint8_t id[], uint8_t *subzero, 
   uint8_t *cel, uint8_t *cel_frac_bits)

 { uint8_t i;
   uint8_t sp[DS18X20_SP_SIZE];

   ow_reset(); //**
   ow_command(DS18X20_READ, id);
   for ( i=0 ; i< DS18X20_SP_SIZE; i++ ) sp[i]=ow_byte_rd();
   if ( crc8( &sp[0], DS18X20_SP_SIZE ) ) 
      return DS18X20_ERROR_CRC;
   DS18X20_meas_to_cel(id[0], sp, subzero, cel, cel_frac_bits);
   return DS18X20_OK;
 }

/* reads temperature (scratchpad) of a single sensor (uses skip-rom)
   output: subzero==1 if temp.<0, cel: full celsius, mcel: frac 
   in millicelsius*0.1
   i.e.: subzero=1, cel=18, millicel=5000 = -18,5000癈 */
uint8_t DS18X20_read_meas_single(uint8_t familycode, uint8_t *subzero, 
   uint8_t *cel, uint8_t *cel_frac_bits)

 { uint8_t i;
   uint8_t sp[DS18X20_SP_SIZE];

   ow_command(DS18X20_READ, NULL);
   for ( i=0 ; i< DS18X20_SP_SIZE; i++ ) sp[i]=ow_byte_rd();
   if ( crc8( &sp[0], DS18X20_SP_SIZE ) ) 
      return DS18X20_ERROR_CRC;
   DS18X20_meas_to_cel(familycode, sp, subzero, cel, cel_frac_bits);
   return DS18X20_OK;
 }

#ifdef DS18X20_EEPROMSUPPORT

uint8_t DS18X20_write_scratchpad( uint8_t id[], 
   uint8_t th, uint8_t tl, uint8_t conf)

 { ow_reset(); //**
   if( ow_input_pin_state() ) 
    { // only send if bus is "idle" = high
      ow_command( DS18X20_WRITE_SCRATCHPAD, id );
      ow_byte_wr(th);
      ow_byte_wr(tl);
      if (id[0] == DS18B20_ID) ow_byte_wr(conf); // config avail. on B20 only
      return DS18X20_OK;
    } 
   else 
    { //
      #ifdef DS18X20_VERBOSE
      uart_puts_P( "DS18X20_write_scratchpad: Short Circuit !\r" );
      #endif
      return DS18X20_ERROR;
	 }
 }

uint8_t DS18X20_read_scratchpad( uint8_t id[], uint8_t sp[] )
 { uint8_t i;

   ow_reset(); //**
   if( ow_input_pin_state() ) 
    { // only send if bus is "idle" = high
      ow_command( DS18X20_READ, id );
      for ( i=0 ; i< DS18X20_SP_SIZE; i++ )	sp[i]=ow_byte_rd();
      return DS18X20_OK;
    } 
   else 
    { //
      #ifdef DS18X20_VERBOSE
      uart_puts_P( "DS18X20_read_scratchpad: Short Circuit !\r" );
      #endif
      return DS18X20_ERROR;
    }
 }


uint8_t DS18X20_copy_scratchpad( uint8_t with_power_extern, 
   uint8_t id[] )

 { ow_reset(); //**
   if( ow_input_pin_state() ) 
    { // only send if bus is "idle" = high
      ow_command( DS18X20_COPY_SCRATCHPAD, id );
      if (with_power_extern != DS18X20_POWER_EXTERN)
         ow_parasite_enable();
		
      delay_ms(DS18X20_COPYSP_DELAY); // wait for 10 ms 
      if (with_power_extern != DS18X20_POWER_EXTERN)
         ow_parasite_disable();

      return DS18X20_OK;
    } 
   else 
    { // 
      #ifdef DS18X20_VERBOSE
      uart_puts_P( "DS18X20_copy_scratchpad: Short Circuit !\r" );
      #endif
      return DS18X20_START_FAIL;
    }
 }

uint8_t DS18X20_recall_E2( uint8_t id[] )
 { ow_reset(); //**
   if( ow_input_pin_state() ) 
    { // only send if bus is "idle" = high
      ow_command( DS18X20_RECALL_E2, id );
      // TODO: wait until status is "1" (then eeprom values
      // have been copied). here simple delay to avoid timeout 
      // handling
      delay_ms(DS18X20_COPYSP_DELAY);
      return DS18X20_OK;
    } 
   else 
    { //
      #ifdef DS18X20_VERBOSE
      uart_puts_P( "DS18X20_recall_E2: Short Circuit !\r" );
      #endif
      return DS18X20_ERROR;
    }
 }
#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人午夜激情在线| 91国偷自产一区二区三区观看| 成人激情视频网站| 欧美色电影在线| 欧美经典三级视频一区二区三区| 亚洲激情图片qvod| 国产99精品国产| 欧美大片在线观看| 亚洲va欧美va人人爽午夜| 成人免费高清在线观看| 欧美mv日韩mv国产网站app| 国产一区二区三区香蕉| 欧美亚洲一区二区在线| 国产精品视频线看| 国产精品77777竹菊影视小说| 欧美三级资源在线| 亚洲美女免费视频| 成人午夜av在线| www久久精品| 激情小说亚洲一区| 欧美高清精品3d| 一卡二卡三卡日韩欧美| 一本久道中文字幕精品亚洲嫩| 久久精品亚洲乱码伦伦中文| 免费人成精品欧美精品| 欧美卡1卡2卡| 青青草国产精品97视觉盛宴| 欧美日韩国产免费| 亚洲宅男天堂在线观看无病毒| 99久久精品免费| 亚洲天堂福利av| caoporen国产精品视频| 一区二区中文视频| 91免费小视频| 亚洲自拍偷拍欧美| 欧美三级韩国三级日本三斤| 五月天丁香久久| 欧美一区二区国产| 捆绑调教美女网站视频一区| 精品女同一区二区| 国产成人a级片| 国产精品久久久久一区二区三区 | 美女视频免费一区| 日韩一区二区三区电影在线观看 | 日韩美女在线视频| 精一区二区三区| 久久久精品黄色| 白白色 亚洲乱淫| 亚洲欧美日韩人成在线播放| 99久久久精品| 爽好多水快深点欧美视频| 欧美一区二区在线免费播放| 蜜桃传媒麻豆第一区在线观看| 欧美mv日韩mv国产网站app| 国产一区二区三区黄视频| 中文字幕一区二区三| 欧美视频一区二区| 激情久久久久久久久久久久久久久久| 国产欧美一区二区精品性色超碰| 成人精品在线视频观看| 亚洲一区二区三区自拍| 精品三级在线观看| 9久草视频在线视频精品| 午夜欧美大尺度福利影院在线看| 日韩欧美在线综合网| 国产成人aaa| 视频一区二区不卡| 亚洲国产精品国自产拍av| 欧美日韩在线不卡| 国产电影一区在线| 亚洲第一福利一区| 亚洲国产高清不卡| 欧美福利一区二区| 成人97人人超碰人人99| 日本一不卡视频| 国产精品国产馆在线真实露脸| 欧美性受xxxx黑人xyx性爽| 毛片av中文字幕一区二区| 国产精品国产a级| 日韩精品一区二区三区中文不卡| 成人一道本在线| 六月丁香婷婷久久| 一区二区三区蜜桃网| 久久久av毛片精品| 日韩精品一区二区三区在线播放| 在线观看区一区二| 国产v日产∨综合v精品视频| 日韩福利电影在线观看| 亚洲视频资源在线| 久久看人人爽人人| 日韩女同互慰一区二区| 欧美亚洲综合一区| 91捆绑美女网站| 成人永久aaa| 国产尤物一区二区| 久久精品国产第一区二区三区| 一区二区激情视频| 国产精品久久久久三级| 欧美精品一区二区三| 在线播放中文一区| 欧美视频在线观看一区二区| 91麻豆国产福利精品| 9久草视频在线视频精品| 懂色av噜噜一区二区三区av| 久久99久久久久| 麻豆国产欧美日韩综合精品二区| 亚洲国产精品久久久久婷婷884 | 奇米在线7777在线精品| 亚洲国产欧美一区二区三区丁香婷| 亚洲国产高清不卡| 国产日产欧产精品推荐色 | 欧美精品丝袜中出| 欧美主播一区二区三区美女| 91网站最新地址| 色悠悠亚洲一区二区| 91在线高清观看| 99re成人精品视频| 欧美综合欧美视频| 欧美丝袜第三区| 欧美精品久久99| 91精品国产91综合久久蜜臀| 69久久夜色精品国产69蝌蚪网| 欧美久久高跟鞋激| 欧美一区二区三区视频在线| 精品国产一二三| 国产精品每日更新在线播放网址| 国产精品福利在线播放| 亚洲欧美日韩国产成人精品影院| 亚洲免费看黄网站| 亚洲一区二区三区四区不卡| 性欧美大战久久久久久久久| 奇米四色…亚洲| 国产白丝精品91爽爽久久| 色综合视频一区二区三区高清| 欧美在线观看视频一区二区| 69堂成人精品免费视频| 久久综合久久综合久久| 亚洲视频中文字幕| 日韩黄色免费电影| 国产精品888| 欧美写真视频网站| 日韩精品一区二区三区在线观看 | 成人精品视频一区| 欧美视频一二三区| 久久久五月婷婷| 亚洲精品视频免费看| 日本少妇一区二区| 国产69精品久久99不卡| 欧美在线看片a免费观看| 欧美www视频| 亚洲欧美日韩一区二区| 久久99国内精品| 色综合天天综合色综合av| 91精品国产综合久久精品麻豆| 国产色产综合产在线视频| 亚洲一区二区三区四区五区中文 | 日韩精品国产欧美| 国产精品夜夜嗨| 欧美性一级生活| 久久精品一区蜜桃臀影院| 一区二区成人在线视频| 国产一区二区中文字幕| 欧美色视频一区| 国产欧美日韩视频一区二区| 日韩经典一区二区| 91一区二区在线| 久久久久久久久久久电影| 亚洲图片欧美色图| 暴力调教一区二区三区| 欧美成人video| 亚洲国产乱码最新视频| 成人av午夜电影| 日韩精品一区二区三区swag| 亚洲乱码精品一二三四区日韩在线 | 美女一区二区久久| 在线观看国产精品网站| 国产欧美视频一区二区| 久久精品国产精品青草| 欧美福利视频导航| 亚洲一级二级在线| 91小视频在线观看| 国产精品久久午夜| 懂色中文一区二区在线播放| 欧美一区在线视频| 一区二区三区不卡在线观看| www.亚洲免费av| 欧美激情一区二区三区全黄| 极品少妇xxxx精品少妇| 欧美一级搡bbbb搡bbbb| 亚洲国产日韩一区二区| 在线中文字幕一区二区| 亚洲少妇最新在线视频| 成人黄色777网| 中文字幕va一区二区三区| 国产高清不卡一区二区| 久久久久久久久久久黄色| 国产激情视频一区二区三区欧美| 久久婷婷久久一区二区三区| 激情综合色综合久久综合| 久久伊人蜜桃av一区二区|