⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ww.c

📁 ds18b20的温度显示程序
💻 C
字号:
#include <REG51.H>
#include <INTRINS.h>
#define uchar unsigned char 
sbit DataLine =P0^0;
sbit PJIaRe=P3^4;
sbit P07=P0^7;
sbit P35=P3^5;
sbit P36=P3^6;

unsigned char XiaoShuWei,GeiWei,ShiWei;
unsigned char TempNow;
unsigned char BaoJingTem=80;
unsigned char JiaReTep=30;
unsigned char TimeCount;

bit Huang;
void  Delay500ms(void);
void  Delay2ms(void);
void  Delay(uchar  a);//按键延时程序
void  Display(void);
void  Cotrol(void);
void KeyScan(void);
uchar  code XiaoShu[]={0,0,1,1,2,3,3,4,5,5,6,6,7,8,8,9};
unsigned char DisplayTab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x58};
unsigned char DisplayBit[]={0xef,0xdf,0xbf,0x7f};
unsigned char DisplayBuff[4];

//timer init
void initTimer(void)
{
 TMOD=0x1;
 TH0=0x3c;
 TL0=0xb0;
}

//timer0/counter0 interrupt
void timer0(void) interrupt 1
{
 TH0=0x3c;
 TL0=0xb0;
 if(++TimeCount==60)
 {
  TimeCount=0;
  Huang=!Huang;
 
 }
 //add your code here.
}
bit ResetPluse(void)
{  
    uchar  i ;
    bit TempDataLine ;
    DataLine=0 ;
    
    for(i=255;i>0;i--);//510us
    DataLine=1 ;
    
    for(i=50;i>0;i--);//100us
	TempDataLine=DataLine ;

    for(i=190;i>0;i--);//400US
	return(TempDataLine);
}
//写命令
void WriteCommandtoDS18b20(uchar  command)
{
    uchar  i ,j;
    for(i=8;i>0;i--)
    {  
		DataLine=0 ;
        _nop_();
        _nop_();
        _nop_();
        
        DataLine=(command&0x01);
        for(j=30;j>0;j--);
        command>>=1 ;
        DataLine=1 ;
   }
}  
//读取1820送出地数据
uchar  ReadDatafromDS18b20(void)
{
  uchar  i,j,temp ;
    TR0=0;
    EA=0;
  for(i=8;i>0;i--)
    {
        temp>>=1 ;
        DataLine=0 ;
        _nop_();
        _nop_();
        DataLine=1 ;
        for(j=4;j>0;j--);
        if(DataLine)
          {	
          	temp|=0x80 ;
          }
        else 
        {
         temp|=0x00 ;
        }
 for(j=20;j>0;j--);
    }
    return(temp);
	TR0=1;
	EA=1;
}  	
//读温度并转换
void TemptureReadAndConvert(void)
{	 
    uchar  TempL,TempH,TempX ;
	EA=0;
    TempL=ReadDatafromDS18b20();//低位
    TempH=ReadDatafromDS18b20();//高位
    if(TempH&0xf0) //如果温度为负 
    	{
        TempH=~TempH ; //取反
        TempL=~TempL ;
        TempL++;
        if(!TempL)
		TempH++;
    	}
else  //温度转换  //获得温度值最小单位为0.1摄氏度.
  {	
		TempX=TempL&0x0f;
        TempH<<=4 ;
        TempL>>=4 ;
        TempH |=TempL ;
       
    	   }
	//转换成数码管显示值
   
    
	XiaoShuWei=XiaoShu[TempX];//小数处理  
    ShiWei=TempH/10 ;//整数十位
    GeiWei=TempH%10 ;//整数个位
	TempNow=ShiWei*10+GeiWei;
	if(JiaReTep>TempNow)
	   PJIaRe=0;
	else
	   PJIaRe=1;
	if(TempNow>=BaoJingTem)
		P07=0;
	else
	    P07=1;
} 
void main(void)
{ 	
  initTimer();
  TR0=1;
  ET0=1;
  EA=1;
  Delay500ms();
  while(1)
    {  
 	  Delay500ms();
	  while(ResetPluse());//复位并检测1820成功与否。
	    WriteCommandtoDS18b20(0xcc);//跳过序列号检查
        Delay2ms();//延时2ms,准备发送下一个指令
        WriteCommandtoDS18b20(0x44);//温度转换命令
        Delay500ms();
        Delay500ms();
       	Delay500ms();
     while(ResetPluse());//再次复位
       	WriteCommandtoDS18b20(0xcc); //跳过序列号检查
        Delay2ms();//延时2ms,准备读取温度
        WriteCommandtoDS18b20(0xBE); //读取温度直到第九字节
		Delay2ms();//读取温度命令
        TemptureReadAndConvert(); //读取并转换温度
  }
 }
//延时500 ms
void Delay500ms(void)
{
   uchar  i=20 ;
   while(--i)
	{
	 Display();
	 KeyScan();
   	}
}  
	void Delay(uchar  a)
{
 unsigned char m;
  while(--a)
  for(m=200;m>0;m--);
 
 }

//延时2ms
void Delay2ms(void)
{  
 uchar  i ;
 while(--i);
   	
}
 
void Display(void)
{
 unsigned char i;
 for(i=0;i<4;i++)
 {
  P1= DisplayTab[DisplayBuff[i]];
  P2= DisplayBit[i];
  Delay(3);
  if(Huang)
  {
  	DisplayBuff[0] = 10;
  	DisplayBuff[1] = XiaoShuWei;
  	DisplayBuff[2] = GeiWei;
  	DisplayBuff[3] = ShiWei;
  }
 else
  {
    DisplayBuff[0] = 8;
 DisplayBuff[1] = 0;
  	DisplayBuff[2] = JiaReTep/10;
  	DisplayBuff[3] = JiaReTep%10;
  }
}
}
void KeyScan(void)
{
   if(P35==0)
     Delay(5);
   if(P35==0)
   {
	EA=0;
	TR0=0;
	while(P35==0)
	  Display();
   	if(++JiaReTep==99)
	   JiaReTep=0;
	EA=1;
	TR0=1;
	Huang=0;
   }

  if(P36==0)
    Delay(5);
  if(P36==0)
  {
    EA=0;
	TR0=0;
    while(P36==0)
     Display();
  	if(--JiaReTep==0)
	 JiaReTep=30;
	 EA=1;
	 TR0=1;
	 Huang=0;
   }
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -