-
-
wzlxg02113
丨Lv 4
#include"reg52.h"#define uchar unsigned char#define uint unsigned int#define jump_ROM 0xCC //写跳过读ROM指令。因为只对一个DB18B20操作。#define start 0x44 // 写温度转换指令。#define read_EEROM 0xBE //读暂存器,读内部RAM中9字节的温度sbit DQ=P2^3; //DS18B02唯一与单片机连接的 数据端uchar TMPH ,TMPL; //用于读取高低 8位数据。uchar code tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //不带小数点uchar code table1[11]={0XBF,0X86,0XDB,0XCF,0XE6,0XED,0XFD,0X87,0XFF,0XEF,0x39}; //带点的 //0x39是Cuchar code LED_W[8] = {0,1,2,3,4,5,6,7}; //)为不加小数点的, 后10个(0~9)为加小数点的,/**************************************************************************************** 以下为延时函数,晶振为11.0592的时候,延时一次大约为:16us。*******************************************************************************************/void delay(uint us){ uint s; for(s=0;s<us;s++);}/****************************************************************************************** 一下为复位函数。resert() 并且读取它的信号。 注意:一个delay(1)=16us********************************************************************************************/uchar resert(void){ uchar receive_ready; DQ=0; delay(32) ; //最好延时时间为480us。 本次为32*16=512us。 DQ=1; delay(3); //延时等待。 receive_ready=DQ; //获取信号。 delay(25); //等待时间隙 完。 不超过480us,本次为400us。 return receive_ready; //返回信号}/********************************************************************* 名称 : read_bit()* 功能 : 从DS18B20读一个位值* 输入 : 无* 输出 : 从DS18B20读出的一个位值***********************************************************************/uchar read_bit(){ uchar i; DQ=0; DQ=1; for(i=0;i<3;i++); //从时间隙开始延时15us。 return DQ; //读出的一个位值返回}/********************************************************************* 名称 : write_bit()* 功能 : 向DS18B20写一位* 输入 : bitval(要对DS18B20写入的位值)* 输出 : 无***********************************************************************/void write_bit(bitval){ DQ=0; //先把数据位置0,开始时间隙。 //delay(1); //延时16us。 if(bitval==1) DQ=1; delay(5); //在其余的时间隙保持值。 DQ=1;}/********************************************************************* 名称 : read_byte()* 功能 : 从DS18B20读一个字节* 输入 : 无* 输出 : 从DS18B20读到的值***********************************************************************/uchar read_byte(){ uchar i; uchar value=0; for(i=0;i<8;i++) { if(read_bit()) //当read_bit()=0时,value=0; 当 read_bit()=1时,执行 value|=0x01<<i;,value=1。 { value|=0x01<<i; //按位或|。 有一个为1则为1 } delay(6) ; //等待剩下时间隙。 } return value;}/********************************************************************* 名称 : write_byte()* 功能 : 向DS18B20写一个字节* 输入 : val(要对DS18B20写入的命令值)* 输出 : 无***********************************************************************/void write_byte(uchar val){ uchar i,temp; for(i=0;i<8;i++) { temp=val>>i; temp=temp&0x01; write_bit(temp); } delay(5);}//**************获取温度的数值************************************************uint get_temp(){ float f_temp; uint temp; P2=0x00; resert(); //通过单总线的所有执行(处理 )都从一个初始化程序开始。其包括总线发出的复位脉冲和{ 从机发出的脉冲。(单机)} //write_byte(jump_ROM) ; //jump_ROM= 0xCC, 写跳过读ROM指令。因为只对一个DB18B20操作。 //write_byte(start); //start 0x44 写温度转换指令。 //resert(); write_byte(jump_ROM); // 写跳过读ROM指令。因为只对一个DB18B20操作。 write_byte(read_EEROM); //read_EEROM =0xBE ,读暂存器,读内部RAM中9字节的温度 TMPL = read_byte(); //读取低字节的8位数据 TMPH = read_byte(); //读取低字节的8位数据 temp = TMPH; //把高位的8字节数据 付给temp。 temp <<= 8; //两个字节为一个字 temp = temp | TMPL; f_temp=temp*0.0625; //温度在寄存器里面是12位,分辨率为:0.0625。 temp=f_temp*10+0.5; //扩大10倍为了保存以为小数点。加0.5是为了四舍五入。 f_temp=f_temp+0.05; return temp;}void display(uint tem) { uchar j; tem=get_temp(); for(j=500; j>0; j--) { P2=LED_W[4]; P0 = tab[tem / 100]; delay(200); P2=LED_W[5]; P0 = table1[tem / 10 % 10]; delay(200); P2=LED_W[6]; P0 = tab[tem % 10]; delay(200); P2=LED_W[7]; P0 = table1[10]; delay(200); }}//*****************温度转换函数****************************void tempchange(){ resert(); delay(50); write_byte(jump_ROM); // 写跳过读ROM指令。因为只对一个DB18B20操作。 write_byte(start); // 写温度转换指令。}/********************************************************************* 名称 : Main()* 功能 : 主函数* 输入 : 无* 输出 : 无***********************************************************************/void main(){ while(1) { tempchange(); //温度转换函数。 display( 0); } }