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

📄 main.c

📁 采用PROTEUS软件仿真DS18B20温度传感器
💻 C
字号:
#include<reg51.h>
#include"Globals.h"
sbit BUS = P2^6;
sbit BUZZ = P3^7;
sbit MAX_T = P2^4;
sbit MIN_T = P2^5;
sbit LED_ONE = P2^0;
sbit LED_TWO = P2^1;
sbit LED_THREE = P2^2;
sbit LED_FOUR = P2^3;
///////////////////////////////////////////
////////////////////////////////////////////
void DS18B20_Recover();
void SendProc(uchar proc);
uchar ReadOneByte();
void LED_DATE_Convert(uchar T_L,uchar T_H);
void LED_Show();
//////////////////////////////////////////
void Delay_4xN_US(uchar us)
{
    while(--us);
}
//////////////////////////////////////////
void Timer0_Init()
{
 TMOD = 0x01;//定时器0模式1-16位定时器-
 TCON = 0x00;//清零TCON
 ET0  = 1;   //允许定时器0中断
 TH0  = 0x3c;//定时100ms
 TL0  = 0xb0;
 TR0  = 1;   //启动定时器0
}
//////////////////////////////////////////
volatile uchar GeWei,ShiWei,BaiWei,_Geiwei,_ShiWei;
volatile bit Convert_yes_not=0;
volatile char Negative = 0;
//////////////////////////////////////////
void main(void)
{
  P0=0x00;
  P2=0xff;
  DS18B20_Recover();//复位
  Timer0_Init();
  EA =1;//开放中断
  BUZZ = 1;
  while(1)
  {
   LED_Show();
  }
}
void DS18B20_Recover()
{
  BUS = 1;
  Delay_4xN_US(200);//4us
  BUS = 0;
  Delay_4xN_US(200);//800us
  BUS = 1;
  //while(0!=BUS);//等待握手
  Delay_4xN_US(200);//800us
  BUS = 1;
}
void SendProc(uchar proc)
{
  bit T_bit;
  uchar i=0;
  for(;i<8;i++)
  {
  T_bit = (proc>>i)&0x01;//单位数据
  BUS = 1;
  Delay_4xN_US(1);//4us
  BUS = 0;
  BUS = T_bit;//单位数据
  Delay_4xN_US(15);//60us等待时间
  BUS = 1;
  }
}
uchar ReadOneByte()
{
  uchar i;
  bit T_bit;
  uchar dat=0;
  for(i=0;i<8;i++)
  {
   BUS = 1;
   Delay_4xN_US(1);//4us
   BUS = 0;
   BUS = 1;
   T_bit = BUS;
   Delay_4xN_US(15);//60us
   BUS = 1;
   dat |= ((uchar)T_bit)<<i;
   } 
   return dat;
}
void LED_DATE_Convert(uchar T_L,uchar T_H)
{
  	uchar ZhengShu,MiddleShu;
	uint XiaoShu;
	if((T_H>>4)>0)//负数
	{
	     Negative = 0xff;
		 MiddleShu =((~(T_L&0x0f))&0x0f)+1;
		 if(MiddleShu>>4>0)//有进位
		 {
		  ZhengShu = (~T_H)*16+((~T_L)>>4)+1;
		  XiaoShu =(MiddleShu&0x0f)*625;
		 }
		 else
		 {
		  ZhengShu = (~T_H)*16+((~T_L)>>4);
		  XiaoShu =(MiddleShu&0x0f)*625;
		 }
		 GeWei  = ZhengShu%10;
		 ShiWei = (ZhengShu/10)%10;
		 _Geiwei= XiaoShu/1000;
		 _ShiWei= (XiaoShu/100)%10;
		 ///////////////////////////////
		 MIN_T = 0;
		 MAX_T = 1;
		 BUZZ  = 1;
	
	}
	else//正数
    {
		Negative = 0x00;
		ZhengShu = T_H*16+(T_L>>4);
		XiaoShu =(T_L&0x0f)*625;
		GeWei  = ZhengShu%10;
		ShiWei = (ZhengShu/10)%10;
		BaiWei = ZhengShu/100;
		_Geiwei= XiaoShu/1000;
		_ShiWei= (XiaoShu/100)%10;
		/////////////////////////
		if(ZhengShu>50)
		{
		  MAX_T = 0;BUZZ = 1;
		}
		else
		{
		   MAX_T = 1;
		   if(ZhengShu<10)
		   { 
		    MIN_T = 0;BUZZ = 1;
		   }
		   else
		   {MIN_T = 1;BUZZ = 0;} 
	    }
	}	
} 
void LED_Show()
{
	switch(Negative)
  {
	case 0x00://正数
	    if(BaiWei!=0)
		{
		 P0 = NumberData[BaiWei];
		 LED_ONE = 0;
		 Delay_4xN_US(100);//400us
		 LED_ONE = 1;
		 P0 = NumberData[ShiWei];
		 LED_TWO = 0;
		 Delay_4xN_US(100);//400us
		 LED_TWO = 1;
		 P0 = NumberData[GeWei]|NumberData[10];
		 LED_THREE = 0;
		 Delay_4xN_US(100);//400us
		 LED_THREE = 1;
		 P0 = NumberData[_Geiwei];
		 LED_FOUR = 0;
		 Delay_4xN_US(100);//400us
		 LED_FOUR = 1;
		}
		else
		{
		 P0 = NumberData[ShiWei];
		 LED_ONE = 0;
		 Delay_4xN_US(100);//400us
		 LED_ONE = 1;
		 P0 = NumberData[GeWei]|NumberData[10];
		 LED_TWO = 0;
		 Delay_4xN_US(100);//400us
		 LED_TWO = 1;
		 P0 = NumberData[_Geiwei];
		 LED_THREE = 0;
		 Delay_4xN_US(100);//400us
		 LED_THREE = 1;
		 P0 = NumberData[_ShiWei];
		 LED_FOUR = 0;
		 Delay_4xN_US(100);//400us
		 LED_FOUR = 1;
		}
	break;
	case 0xff://负数
	     if(ShiWei!=0)
		{
		 P0 = NumberData[11];
		 LED_ONE = 0;
		 Delay_4xN_US(100);//400us
		 LED_ONE = 1;
		 P0 = NumberData[ShiWei];
		 LED_TWO = 0;
		 Delay_4xN_US(100);//400us
		 LED_TWO = 1;
		 P0 = NumberData[GeWei]|NumberData[10];
		 LED_THREE = 0;
		 Delay_4xN_US(100);//400us
		 LED_THREE = 1;
		 P0 = NumberData[_Geiwei];
		 LED_FOUR = 0;
		 Delay_4xN_US(100);//400us
		 LED_FOUR = 1;
		}
		else
		{
		 P0 = NumberData[11];
		 LED_ONE = 0;
		 Delay_4xN_US(100);//400us
		 LED_ONE = 1;
		 P0 = NumberData[GeWei]|NumberData[10];
		 LED_TWO = 0;
		 Delay_4xN_US(100);//400us
		 LED_TWO = 1;
		 P0 = NumberData[_Geiwei];
		 LED_THREE = 0;
		 Delay_4xN_US(100);//400us
		 LED_THREE = 1;
		 P0 = NumberData[_ShiWei];
		 LED_FOUR = 0;
		 Delay_4xN_US(100);//400us
		 LED_FOUR = 1;
		}
	break;
  }
}
void Timer_Interrupt() interrupt 1
{
    uchar T_dat_L,T_dat_H;
	P0=0x00;
	TH0  = 0x3c;//定时100ms
    TL0  = 0xb0;
	if(Convert_yes_not==0)
	{
	DS18B20_Recover();//复位
	SendProc(0xcc);//ROM跳过指令
	SendProc(0x44);//数据转换指令
	Convert_yes_not=1;
	}
	else
	{
	DS18B20_Recover();//复位
	SendProc(0xcc);//ROM跳过指令
	SendProc(0xbe);//数据读取指令
	T_dat_L = ReadOneByte();//读取数据
	T_dat_H = ReadOneByte();//读取数据
	LED_DATE_Convert(T_dat_L,T_dat_H);
	Convert_yes_not=0;
	}
}	

⌨️ 快捷键说明

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