| 
 
| 下面是个历程太复杂,不易懂;有没简单,通俗,易懂的,DQ定义为P0.2 
 #define DS18b20_PORT PORTB        (不懂是什么意识)
 #define DS18b20_DDR  DDRB        (不懂是什么意识)
 #define DS18b20_PIN  PINB          (不懂是什么意识)
 
 
 #define DS18b20      PB4      (不懂是什么意识)
 
 #define SETBIT(x,y) (x|=(1<<y))
 #define CLRBIT(x,y) (x&=(~(1<<y)))
 #define CHKBIT(x,y) (x&(1<<y))
 
 #define  BIT_INV(x,y)    x^=(1<<y)
 /********************************************************************************
 DS18B20操作定义
 ********************************************************************************/
 #define  CLR_DS18B20  CLRBIT(DS18b20_PORT,DS18b20)  //数据线强制拉低
 #define  SET_DS18B20  SETBIT(DS18b20_PORT,DS18b20)  //数据线强制拉高,上拉
 #define  HLD_DS18B20  SETBIT(DS18b20_DDR,DS18b20)  //Mega16控制总线
 #define  RLS_DS18B20  CLRBIT(DS18b20_DDR,DS18b20)      //释放总线
 #define  STU_DS18B20  CHKBIT(DS18b20_PIN,DS18b20)  //数据线的状态
 
 
 /*********************************************************************************************
 延时函数
 **********************************************************************************************/
 
 void delay_1us(void)                 //1us延时函数
 {
 asm("nop");
 }
 
 void delay_nus(unsigned int n)       //N us延时函数
 {
 unsigned int i=0;
 for (i=0;i<n;i++)
 delay_1us();
 }
 void delay_1ms(void)                 //1ms延时函数
 {
 unsigned int i;
 for (i=0;i<400;i++);
 }
 
 void delay_nms(unsigned int n)       //N ms延时函数
 {
 unsigned int i=0;
 for (i=0;i<n;i++)
 delay_1ms();
 }
 
 void init_1820(void)  //复位程序
 {
 HLD_DS18B20;      //设置PC2 为输出
 SET_DS18B20;
 CLR_DS18B20;
 delay_nus(180);    //480us以上
 SET_DS18B20;
 RLS_DS18B20;
 delay_nus(10);     //15~60us
 while(STU_DS18B20);
 HLD_DS18B20;
 SET_DS18B20;
 delay_nus(40);   //60~240us
 }
 | 
 |