1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | #include"reg51.h" #include"d1820.h" int t; uint num; uchar dat; //读写数据变量 uchar a=0; uchar b=0; float tep=0; //读一个温度时的温度转换中间间 uchar data tempbuf[4]=0;//温度字型显示中间变量 /****************************************************** 函数名称:delay(uint num) 返回值:无 参数:uint num 延时数据值 作用:延时 *******************************************************/ void delay(uint num) { while(num--); } /****************************************************** 函数名称:void Init_DS18B20(void) 返回值:无 参数:无 作用:初始化18B20 *******************************************************/ void Init_DS18B20(void) { char x=0; DQ=1; delay(10);//稍作延时 DQ=0; delay(80);//延时>480us 540us DQ=1; //拉高总线 15-60us delay(20); x=DQ;//读总线状态 为0复位成功,为1则不成功 delay(30); DQ=1;//释放总线 } /****************************************************** 函数名称:uchar ReadOneChar(void) 返回值:uchar dat 参数: 无 作用:读取1820一个字节 *******************************************************/ uchar ReadOneChar(void) { uchar i; uchar dat=0; for(i=0;i<8;i++) { DQ=0; dat>>=1; DQ=1;//给脉冲 if(DQ) {dat|=0x80;}//读1 /// 读0右移处理 delay(8);//15us内读完一个数 } return(dat); } /****************************************************** 函数名称:void WriteOneChar(uchar dat) 返回值:无 参数: uchar dat 作用:向1820写一个字节 *******************************************************/ /////****写DS18B20***/ //写0 60us读完,写1 30us 内读完 void WriteOneChar(uchar dat) { uchar i=0; for(i=0;i<8;i++) { DQ=0; DQ=dat&0x01;//写所给数据最低位 delay(10); /////////// DQ=1;//给脉冲 dat>>=1; } delay(8); } /****************************************************** 函数名称:int ReadOneTemperature(void) 返回值:int t 参数: 无 作用:读温度值 *******************************************************/ int ReadOneTemperature(void) ////////***读取温度值***********/ //// 每次读写均要先复位 { Init_DS18B20(); WriteOneChar(0xcc);//发跳过ROM命令 WriteOneChar(0x44);//发读开始转换命令 Init_DS18B20(); WriteOneChar(0xcc);//发跳过ROM命令 WriteOneChar(0xbe);//读寄存器,共九字节,前两字节为转换值 a=ReadOneChar(); //a存低字节 b=ReadOneChar(); //b存高字节 t=b; t<<=8;//高字节转换为10进制 t=t|a; tep=t*0.0625;//转换精度为0.0625/LSB t=tep*10+0.5;//保留1位小数并四舍五入****后面除10还原正确温度值) return(t); } /****************************************************** 函数名称:uint Temperaturepro(void) 返回值:void 参数: void 作用:温度处理 *******************************************************/ void Temperaturepro(void) { int temp; temp=ReadOneTemperature(); tempbuf[3]=temp/1000;//百位 tempbuf[2]=temp/100%10;//十位 tempbuf[1]=temp%100/10; //个位 tempbuf[0]=temp%10; //小数 } |