查看文章 |
DS18B20程序
2007-04-17 15:01
#include #include #define Seck 20 //1秒中的主程序的系数 #define NOP_1uS _nop_();_nop_();_nop_();_nop_();_nop_();_nop_() //*********************************** sbit DQ=P2^0; //*********************************** static unsigned char Power=0; unsigned char Temper=0; //---------------------------------- //功能:10us 级别延时 //---------------------------------- void Delay10us(unsigned char n) { while(n--) { NOP_1uS;NOP_1uS;NOP_1uS; NOP_1uS;NOP_1uS;NOP_1uS; NOP_1uS; } } //----------------------------------- //功能:写18B20 //----------------------------------- void Write_18B20(unsigned char n) { unsigned char i; for(i=0;i<8;i++) { DQ=0; Delay10us(1);//延时13us 左右 DQ=n & 0x01; n=n>>1; Delay10us(5);//延时50us 以上 DQ=1; } } //------------------------------------ //功能:读取18B20 //------------------------------------ unsigned char Read_18B20(void) { unsigned char i; unsigned char temp; for(i=0;i<8;i++) { temp=temp>>1; DQ=0; NOP_1uS;//延时1us DQ=1; NOP_1uS;NOP_1uS;//延时5us NOP_1uS;NOP_1uS;NOP_1uS; if(DQ==0) { temp=temp&0x7F; }else { temp=temp|0x80; } Delay10us(5);//延时40us DQ=1; } return temp; } //----------------------------------- void Init (void) { DQ=0; Delay10us(50);//延时500us DQ=1; Delay10us(9);//延时90us if(DQ==1) //0001 1111b=1f { Power =0; //失败0 }else { Power++; DQ=1; } } //---------------------------------- void Skip(void) { Write_18B20(0xcc); Power++; } //---------------------------------- void Convert (void) { Write_18B20(0x44); Power++; } //---------------------------------- void Delay1S (void) { static unsigned int i=0; if (i++==Seck) {i=0;Power++;} } //---------------------------------- void ReadDo (void) { Write_18B20(0xbe); Power++; } //---------------------------------- void ReadTemp (void) { union { unsigned char Temp[2]; //单字节温度 int Tt; //2字节温度 }T; T.Temp[1]=Read_18B20(); //读低位 T.Temp[0]=Read_18B20(); //读高位 //----------------------------------- Power=0; T.Tt <<= 4; Temper=T.Temp[0]; } /********************************** 函数指针定义 ***********************************/ code void (code *SubTemp[])()= { Init,Skip,Convert,Delay1S,Init,Skip,ReadDo,ReadTemp }; //***************************** void GetTemp(void) { (*SubTemp[Power])(); } //************************************** |
最近读者: