專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

DS18B20和ADC0832共同使用

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2013年12月07日   【字體:
#include<reg52.h>
#define  uchar  unsigned char
sbit DQ=P1^4;
uchar data    temp_data[2]={0x00,0x00};
uchar data    display[5]={0x00,0x00,0x00,0x00,0x00};
unsigned char code  ditab[16] ={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
                                                          0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;
//共陰數(shù)碼管
uchar code table[11] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};// 0,1,2,3,4,5 ,6,7,8,9,百位或當(dāng)最高位十位為0時(shí)不顯示
uchar code table1[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};// 0.,1.,2.,3.,4.,5.,6.,7.,8.,9.各位帶有小數(shù)點(diǎn)的顯示

    //以下為水位顯示區(qū)域
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define _rrca_()          CY   = ACC & 0x01           //產(chǎn)生RRC A指令
#define _rlca_()          CY   = ACC & 0x80           //產(chǎn)生RLC A指令
sbit bADcs=P1^7;
sbit bADcl=P1^6;
sbit bADda=P1^5;
sbit flag=P1^3;
//sbit str=P2^7;
//sbit d=P2^6;
//sbit clk=P2^5;
bit choose=0;
unsigned char data1;
unsigned char count;
unsigned char cycle;
uint ge,xiao1,xiao2;
unsigned long data2;
unsigned char  code tablewe[]=
{
 0xFE,0xFD,0xFB,0xF7,
 0xEF,0xDF,0xBF,0x7F
};//自己寫的
void delay_18b20(unsigned int i)
{
while(i--);
}
//函數(shù)區(qū)域水位
void Delayus(uchar i)
 {
  while(--i);
 }
void ad(void)
{    uchar i;
     //data1=0;
     bADcs = 0;//當(dāng)ADC0832未工作時(shí)其CS輸入端應(yīng)為高電平,此時(shí)芯片禁用.
  bADcl=0;
  bADda=1;
  bADcl=1;
  bADcl=0;//i down
  bADda=1;
  bADcl=1;
  bADcl=0; //   2 down
  bADda=0;
  bADcl=1;
  bADcl=0; //   3 down
  bADda=1;
  bADcl=1;
  bADcl=0; //   4 down

  for(i=8;i>0;i--)
   {
  
   data1<<=1;
   bADcl=0;
  bADcl=1;
  if(bADda==1) data1|=0x01;
      bADda=1;
   }
   bADcs=1;
 
}
void cal()
{
data2=((ulong)data1*493)/252.5;
ge=data2/100;
xiao1=(data2%100)/10;
xiao2=data2%10;

}

display2()
{
      P2=tablewe[4];                     //P2口低四位位選
      P0=0x00;        //P0口數(shù)碼管段選第五個(gè)數(shù)碼管不用
   delay_18b20(50);

           P2=tablewe[5];
      P0=table1[ge];
   delay_18b20(50);
           P2=tablewe[6];
      P0=table[xiao1];
      delay_18b20(50);
           P2=tablewe[7];
     P0=table[xiao2];

 

}

//以上為水位函數(shù)

 


//初始化函數(shù)
Init_DS18B20(void)
{
unsigned char x=0;
DQ=1;     //DQ復(fù)位
delay_18b20(8);   //稍做延時(shí)
DQ=0;     //單片機(jī)將DQ拉低
delay_18b20(80);  //精確延時(shí) 大于 480us
DQ=1;     //拉高總線
delay_18b20(14);
x=DQ;       //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
delay_18b20(20);
}

 


ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat=0;

for(i=8;i>0;i--)
    {
      DQ=0; // 給脈沖信號(hào)
      dat>>=1;
      DQ=1; // 給脈沖信號(hào)

      if(DQ)
       dat|=0x80 ;
      delay_18b20(4) ;
    }

      return (dat) ;
}

 

WriteOneChar(unsigned char dat)
{
    unsigned char i=0;
    for(i=8;i>0;i--)
    {
      DQ=0;
      DQ=dat&0x01;
      delay_18b20(5);

      DQ=1;
      dat>>=1;
    }
}

 

Read_Temperature(void)
{
       Init_DS18B20() ;
 
       WriteOneChar(0xCC) ;    // 跳過讀序號(hào)列號(hào)的操作
       WriteOneChar(0x44) ;    // 啟動(dòng)溫度轉(zhuǎn)換

       Init_DS18B20() ;
       WriteOneChar(0xCC) ;    //跳過讀序號(hào)列號(hào)的操作
       WriteOneChar(0xBE) ;    //讀取溫度寄存器
       temp_data[0] = ReadOneChar();     //溫度低8位
       temp_data[1] = ReadOneChar();     //溫度高8位
}

 


Disp_Temperature()
{
    display[4]=temp_data[0]&0x0f;
    display[0]=ditab[display[4]];       //查表得小數(shù)位的值
 
    display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
    display[3]=display[4]/100 ;
    display[1]=display[4]%100 ;
    display[2]=display[1]/10;
    display[1]=display[1]%10;

     if(display[3]==0)          //高位為0,不顯示
     {
       display[3]=10 ;            
       if(display[2]==0)        //次高位為0,不顯示
       display[2]=10 ;
     }
}

display1()
{

      P2=tablewe[0];                     //P2口低四位位選
      P0=table[display[3]];        //P0口數(shù)碼管段選
   delay_18b20(50);

           P2=tablewe[1];
      P0=table[display[2]];
   delay_18b20(50);
           P2=tablewe[2];
      P0=table1[display[1]];
      delay_18b20(50);
           P2=tablewe[3];
     P0=table[display[0]];

}

void main()
{
   while(1)
    { Read_Temperature();
   Disp_Temperature();
 display1();
       ad();
          cal();
  display2();
   
    }
}

這個(gè)程序可以使用,但是就是沒有辦法顯示低溫零度以下的,求修改!
關(guān)閉窗口

相關(guān)文章