赞助论坛
  • 2206阅读
  • 0回复

用来读取DS18B20内部64位ROM 直接上程序 电路自己搞 [复制链接]

楼层直达
发帖
20
精华
0
金币
102
威望
0
贡献
0
好评
0
注册
2014-05-06
楼主    zhlzhlok 发表于: 2014-05-07 22:44:09 
//用来读取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[i]=TempRead();
   }
   WriteCommandLCD(0x80);
   for (i=0;i<8;i++)
     {
     temp = fCode[i]/16;   //高8位
         if (temp<10)        
         WriteDataLCD(temp + 0x30);
         else
         WriteDataLCD(temp + 0x37);
         temp = fCode[i]%16;    //低8位
         if (temp<10)          
         WriteDataLCD(temp+ 0x30);    
         else
         WriteDataLCD(temp + 0x37);
     }
}


void main()//主函数
{

init_all();

   while(1)
       DispCode();


}