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

📄 main.c

📁 基于51系列单片机的DS18B20测量温度系统. 正在学习单片机
💻 C
字号:
#include<reg52.h>
code unsigned char seg7code[11]={0x3f,0x06,0x5b,0x4f,0x66,
                                 0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //显示段码
void Delay(unsigned int tc)     //显示延时程序
{while( tc != 0 )	
	{unsigned int i;	
	 for(i=0; i<100; i++);
	 tc--;}
}
sbit TMDAT =P3^1; //DS18B20的数据输入/输出脚DQ,根据情况设定
unsigned int sdata;//测量到的温度的整数部分
unsigned char xiaoshu1;//小数第一位
unsigned char xiaoshu2;//小数第二位
unsigned char xiaoshu;//两位小数
bit  fg=1;        //温度正负标志
void dmsec (unsigned int count)       //延时部分
 {   
	unsigned char i;
	while(count--)
	{for(i=0;i<115;i++);} 
 }         
void tmreset (void)       //发送复位
{                               
	unsigned char i;
	TMDAT=0;     
	for(i=0;i<103;i++); 
	TMDAT = 1;       
	for(i=0;i<4;i++); 
}         
bit tmrbit (void)       //读一位//
 {                           
	 unsigned int i;       
	 bit dat;      
	 TMDAT = 0;
	 i++;       
	 TMDAT = 1; 
	 i++; i++;  //微量延时   //
	 dat = TMDAT;     
	for(i=0;i<8;i++); 
	 return (dat);      
 }         
unsigned char tmrbyte (void)        //读一个字节
  {                 
	 unsigned char i,j,dat;      
	 dat = 0;       
	 for (i=1;i<=8;i++)      
	 {        
	  j = tmrbit();      
	  dat = (j << 7) | (dat >> 1);    
	 }        
	 return (dat);       
  }         
void tmwbyte (unsigned char dat)     //写一个字节
{                       
	 unsigned char j,i;      
	 bit testb;       
	 for (j=1;j<=8;j++)      
	 {       
	  testb = dat & 0x01;     
	  dat = dat >> 1;      
	  if (testb)     
	  {     TMDAT = 0;         //写0  
		   i++; i++;                              
		   TMDAT = 1;    
		for(i=0;i<8;i++); 
	  }       
	  else       
	 {  TMDAT = 0;         //写0 
	    for(i=0;i<8;i++); 
		TMDAT = 1;     
	    i++; i++;                              
	  }       
   }        
}  
void tmstart (void)       //发送ds1820 开始转换
  {                          
 	tmreset();  //复位     
 	dmsec(1);  //延时    
 	tmwbyte(0xcc);  //跳过序列号命令   
 	tmwbyte(0x44);  //发转换命令 44H,
  }         
//********温度存在全局变量 sdata中.小数存在xiaoshu中********
void tmrtemp (void)       //读取温度
    {                          
		unsigned char a,b; 
		tmreset ();  //复位     
		dmsec (1);  //延时     
		tmwbyte (0xcc);  //跳过序列号命令   
		tmwbyte (0xbe);  //发送读取命令     
		a = tmrbyte ();  //读取低位温度    
		b = tmrbyte ();   //读取高位温度           
		if(b>0x7f)      //最高位为1时温度是负
		{
		 a=~a;         //补码转换,取反加一
		 b=~b+1;       
		 fg=0;      //读取温度为负时fg=0
       }
		sdata = a/16+b*16;      //整数部分
		xiaoshu1 = (a&0x0f)*10/16; //小数第一位
		xiaoshu2 = (a&0x0f)*100/16%10;//小数第二位
		xiaoshu=xiaoshu1*10+xiaoshu2; //小数两位
}  
//*********对外接口函数void DS18B20PRO(void);**************
void DS18B20PRO(void)         
{    
  tmstart();      
  //dmsec(5); 	//如果是不断地读取的话可以不延时 //
  tmrtemp(); 	//读取温度,执行完毕温度将存于TMP中 //
}									  
void Led()
{ 
   if(fg==1)   //温度为正时显示的数据
   {
	   P2=P2&0xef; 
	   P0=seg7code[sdata/10];           //输出十位数
	   Delay(8); P2=P2|0xf0; P2=P2&0xdf;  
	   P0=seg7code[sdata%10]|0x80; //输出个位和小数点
	   Delay(8); P2=P2|0xf0; P2=P2&0xbf; 
	   P0=seg7code[xiaoshu1];   //输出小数点后第一位
	   Delay(8); P2=P2|0xf0; P2=P2&0x7f; 
	   P0=seg7code[xiaoshu2];       //输出小数点后第二位
	   Delay(4); P2=P2|0xf0;
   }
   if(fg==0)  //温度为负时显示的数据
   {
	   P2=P2&0xef; 
	   P0=seg7code[11];           //负号
	   Delay(8); P2=P2|0xf0; P2=P2&0xdf;  
	   P0=seg7code[sdata/10]|0x80; //输出十位数
	   Delay(8); P2=P2|0xf0; P2=P2&0xbf; 
	   P0=seg7code[sdata%10];   //输出个位和小数点
	   Delay(8); P2=P2|0xf0; P2=P2&0x7f; 
	   P0=seg7code[xiaoshu1];       //输出小数点后第一位
	   Delay(4); P2=P2|0xf0;
   }
}
main()
{
 fg=1;
 while(1)
 {
  DS18B20PRO();
  Led();
 }
}

⌨️ 快捷键说明

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