• 赞助网站
  • 您的位置:  首页 >> 技术交流区 >> MCU技术 >> 用来读取DS18B20内部64位ROM 直接上程序 电路自己搞
    用来读取DS18B20内部64位ROM 直接上程序 电路自己搞
    2014年05月07日 点击: 编辑: zhlzhlok
    //用来读取DS18B20 内部ROM序列号
    #include<reg52.h>
    #include<intrins.h>
    #define uint unsigned int
    #define uchar unsigned char
    #define LCD_Data P0    //P0口做数据口
    sbit LCD_RS=P3^5;//并口选择
    sbit LCD_E=P3^4;
    sfr WDT_CONTR=0XE1;//看门狗寄存器地址
    sbit led1=P1^0;
    sbit led2=P1^1;
    sbit DULA=P2^6;
    sbit WELA=P2^7;
    sbit s1=P3^0;
    sbit s2=P3^1;
    sbit s3=P3^2;
    sbit lowcs=P3^7; //矩阵键盘分离出独立键盘
    sbit beep=P2^3;
    //DS18B20 PORT
    sbit DS18B20=P2^2;//DS18B20端口选择
    uchar fCode[8];


    void delay(unsigned int z) //延时函数
    {
       unsigned int x,y;
       for(x=z;x>0;x--)
        for(y=110;y>0;y--);
    }

    void delayb(unsigned int count)     //延时函数
      {
          while(count--);
    }
    /***********DS18B20************/
    unsigned char DS18B20Init()    //18B20初始化 晶振22.1184 指令周期大约0.5微秒
    {
      unsigned char x;
      DS18B20=1;
      delayb(5);
      DS18B20=0;
      delayb(200);
      DS18B20=1;
      delayb(10); //等待18B20响应
      x=DS18B20;
      delayb(100);
      return x;
    }
    unsigned char TempRead(void)
    {
       unsigned char i,dat;
       DS18B20=1;
       delayb(1);


       for(i=0;i<8;i++)
        {
          DS18B20=0;
          dat=dat>>1;
          DS18B20=1;
          if(DS18B20)
          dat=dat|0x80;
          delayb(4);
          }
    return dat;

    }
    void TempWriteByte(unsigned char dat)
    {
      unsigned int i;
      DS18B20=1;
      delayb(5);
      for(i=0;i<8;i++)
      {
        DS18B20=0;
          DS18B20=dat&0x01;
          delayb(8);
          DS18B20=1;
        dat=dat>>1;
        delayb(5);
          }
    }

    /*******12864lcd*******/
    /***液晶写数据***/
    void WriteDataLCD(unsigned char dat)
    {
    LCD_RS=1;
    LCD_E=0;
    delay(2);
    LCD_Data=dat;
    delay(2);
    LCD_E=1;
    delay(2);
    LCD_E=0;
    delay(2);
    }
    /***液晶写指令***/
    void WriteCommandLCD(unsigned char com)
    {
    LCD_RS=0;
    LCD_E=0;
    delay(2);
    LCD_Data=com;
    delay(2);
    LCD_E=1;
    delay(2);
    LCD_E=0;
    delay(2);
    }

    void init_lcd()
    {
      LCD_E=0;
       WriteCommandLCD(0x38);//设置lcd1602为每个字符5×7显示    
       WriteCommandLCD(0x0f); //开显示,光标显示并闪烁
       WriteCommandLCD(0x06);//光标移动设置,每写一个数,光标自动加一
       WriteCommandLCD(0x01); //清屏
    }
    void init_all()
    {

      beep=0;//蜂鸣器关闭
      lowcs=0;//置低一列分离出独立键盘
      DULA=WELA=0;//关闭数码管显示
      DS18B20Init();
      init_lcd();

    }

    void DispCode()
    {
       unsigned char i,temp;

         DS18B20Init();
         TempWriteByte(0x33);
       delay(500);
         for (i=0;i<8;i++)
       {
             fCode=TempRead();
       }
       WriteCommandLCD(0x80);
       for (i=0;i<8;i++)
         {
         temp = fCode/16;   //高8位
             if (temp<10)        
             WriteDataLCD(temp + 0x30);
             else
             WriteDataLCD(temp + 0x37);
             temp = fCode%16;    //低8位
             if (temp<10)          
             WriteDataLCD(temp+ 0x30);    
             else
             WriteDataLCD(temp + 0x37);
         }
    }


    void main()//主函数
    {

    init_all();

       while(1)
           DispCode();


    }