求 at89c51和ds18b20的 led数码显示仿真 图和c语言

2024-12-18 15:44:49
推荐回答(1个)
回答1:

/*******************************************************

 *    DS18B20温度传感器              *

 *    测量范围:-55℃ ~ 125℃             *

 *    共阳极数码管显示              *

 *            *

 *******************************************************/

#include"reg51.h" 

#include"intrins.h"

#include"math.h"

#define uchar unsigned char

sbit seg1=P3^0;

sbit seg2=P3^1;

sbit seg3=P3^2;

sbit seg4=P3^3;

sbit DQ=P3^4;

sbit LED=P1^0;

uchar datal;

uchar datah;

uchar sseg,gseg,dseg;

float dec=888;

uchar buf[]={0,0,0,0xc6};

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff}; // CA 0 1 2 3 4 5 6 7 8 9 - 熄灭

/*******************************************************

 *                *

 *        显示部分         *

 *                *

 *******************************************************/

/*****毫秒延时*****/

void delay_ms(uchar tms)  //一个tms=1ms

{

 uchar j;

 while(tms--)

 {

  for(j=112;j>0;j--); 

 }

}

 

/*****显示设定*****/

void display(dec)

{

 P0=buf[0]; 

 seg1=1;

 seg2=0;

 seg3=0;

 seg4=0;

 delay_ms(1);

 seg1=0;

 delay_ms(1);

 P0=buf[1]; 

 seg1=0;

 seg2=1;

 seg3=0;

 seg4=0;

 delay_ms(2);

 seg2=0;

 delay_ms(2);

 P0=buf[2]; 

 seg1=0;

 seg2=0;

 seg3=1;

 seg4=0;

 delay_ms(2);

 seg3=0;

 delay_ms(2);

 P0=buf[3]; 

 seg1=0;  

 seg2=0;

 seg3=0;

 seg4=1;

 delay_ms(2);

 seg4=0;

 delay_ms(2);

}

/*******************************************************

 *                *

 *         DS18B20部分        *

 *                *

 *******************************************************/

/*****微秒延时*****/

void delayus(uchar tus)  

{

 while(tus>0)

 tus--;

}

/*****毫秒延时*****/

void delayms(uchar tms)  //一个tms=15ms

{

 while(tms--)

 {

  display(dec);

 }

}

/*****秒延时*****/

void delays(uchar ts)  //一个ts=1s

{

 while(ts--)

 {

  delayms(70);

 }

}

/*****18b20初始化*****/

bit ini_1820()

{

 bit re;

 DQ=0;

 delayus(100);

 DQ=1;

 delayus(4);

 re=DQ;

 delayus(200);

 DQ=1;

 return(re);

}

/*****写指令*****/

void wr_1820(uchar dat)

{

 uchar i;

 for(i=0;i<8;i++) 

 { 

  if(dat&0x01) 

  { 

   DQ=0; 

   _nop_();

   DQ=1; 

   delayus(8);

  }  

  else 

  { 

   DQ=0; 

   delayus(8); 

   DQ=1;

   _nop_();

  }

  dat>>=1;        

 } 

}

/*****读数据*****/

bit rd_bit() 

{

 bit rdbit;

 DQ=0;

 _nop_();

 DQ=1;

 _nop_();

 rdbit=DQ;

 delayus(200);

 return rdbit; 

}

uchar rd_1820()

{

     uchar i,dat=0;

     bit rdbit;

     for(i=0;i<8;i++)

     {

  dat>>=1;

  rdbit=rd_bit();

  if(0==rdbit) 

  dat|=0x00;

  else

  dat|=0x80;

     }

     return dat;

}

/*****读取温度*****/

void get_1820()

{

 bit re;

 LED=1;

 display(dec);

 re=ini_1820();

 if(re)

 LED=0;

 wr_1820(0xcc);

 wr_1820(0x44);

 delays(1);

 re=ini_1820();

 if(re)

 LED=0;

  wr_1820(0xcc);

 wr_1820(0xbe);

 datal=rd_1820();

 datah=rd_1820();   

}

/*****真值转换*****/

float chang_1820()

{

 float hex;

 float deci;

 get_1820();

 datah<<=1;

 if(0==CY)

 {

  datah>>=1;

  hex=datah*16*16+datal;

  deci=hex*0.0625;

 } 

 else

 {

  datah>>=1;

  datah=~datah;

  datal=~datal;

  datah<<=5;

  datah>>=5;

  hex=datah*16*16+datal+1;

  deci=-hex*0.0625;

 } 

 return(deci);

}

/*****真值处理*****/

void deal_1820()

{

 float deci;

 deci=chang_1820();

 if(deci<0)

 {

  buf[0]=table[10];

  deci=abs(deci);

  if(deci<10)       //小于0大于-10,典型:-3.33

  { 

   dseg=(deci-(int)deci)*10;

   gseg=(int)deci;

   buf[1]=table[gseg];

   buf[1]&=0x7f;

   buf[2]=table[dseg];

  }

  else        //小于等于-10,典型:-10.99

  {

   dseg=(int)deci%10;

   gseg=(int)deci/10;

   buf[1]=table[gseg];

   buf[2]=table[dseg];

  }

 }

 else

 {

  if(deci<10)       //小于10大于0,典型:3.33

  {

   buf[0]=table[11]; 

   dseg=(deci-(int)deci)*10;

   gseg=(int)deci;

   buf[1]=table[gseg];

   buf[1]&=0x7f;

   buf[2]=table[dseg];

  }

  else if(deci<100)        //大于等于10小于100,典型:10.99

  {

   dseg=(deci-(int)deci)*10;

   gseg=(int)deci%10;

   sseg=(int)deci/10;

   buf[0]=table[sseg];

   buf[1]=table[gseg];

   buf[1]&=0x7f;

   buf[2]=table[dseg]; 

  }

  else 

  {

   dseg=(int)deci%10;

   gseg=(int)deci/10%10;

   sseg=(int)deci/100;

   buf[0]=table[sseg];

   buf[1]=table[gseg];

   buf[2]=table[dseg]; 

  } 

 }   

}

/*******************************************************

 *                *

 *        主函数         *

 *                *

 *******************************************************/

void main()

{

 while(1)

 {

  deal_1820();

  display(dec);

 }

}