资源描述:
《DS18B20程序-超详细注释》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、#include#include#defineucharunsignedchar#defineuintunsignedintsbitDQ=P2^2; //数据口defineinterfacesbitdula=P2^6; //数码管段选sbitwela=P2^7; //数码管位选uinttemp; //温度值variableoftemperature//不带小数点
2、unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//带小数点unsignedcharcodetable1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};/*************精确延时函数*****************/voiddelay(unsignedchari){while(--i);}/***********
3、*******************************此延时函数针对的是12Mhz的晶振delay(0):延时518us误差:518-2*256=6delay(1):延时7us (原帖写"5us"是错的)delay(10):延时25us 误差:25-20=5delay(20):延时45us 误差:45-40=5delay(100):延时205us误差:205-200=5delay(200):延时405us误差:405-400=5*******************************************//****************
4、*DS18B20******************/voidInit_Ds18b20(void) //DS18B20初始化sendresetandinitializationcommand{DQ=1; //DQ复位,不要也可行。delay(1); //稍做延时DQ=0; //单片机拉低总线delay(250); //精确延时,维持至少480usDQ=1; //释放总线,即拉高了总线dela
5、y(100); //此处延时有足够,确保能让DS18B20发出存在脉冲。}ucharRead_One_Byte() //读取一个字节的数据readabytedate //读数据时,数据以字节的最低有效位先从总线移出{uchari =0;uchardat=0;for(i=8;i>0;i--){ DQ=0; //将总线拉低,要在1us之后释放总线 //单片机要在此下降沿后的15us内读数据才会有效
6、。 _nop_(); //至少维持了1us,表示读时序开始 dat>>=1; //让从总线上读到的位数据,依次从高位移动到低位。 DQ=1; //释放总线,此后DS18B20会控制总线,把数据传输到总线上 delay(1); //延时7us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us内的最后部分 if(DQ) //控制器进行采样 { dat
7、=0x80;
8、//若总线为1,即DQ为1,那就把dat的最高位置1;若为0,则不进行处理,保持为0 } delay(10); //此延时不能少,确保读时序的长度60us。}return(dat);}voidWrite_One_Byte(uchardat){uchari=0;for(i=8;i>0;i--){ DQ=0; //拉低总线 _nop_(); //至少维持了1us,表示写时序(包括写0时序或写1时序)开始 DQ=dat&0x01;
9、