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

📄 t.c

📁 ds18b20的测温源程序
💻 C
字号:
#include<reg52.h>
#include<intrins.h>


void delay(unsigned int t);


unsigned char DisBuff[4];
unsigned char COM; 

sbit COM1=P2^7;	   //定义通信端口		
sbit COM2=P2^4;
sbit COM3=P2^5;
sbit COM4=P2^6;
sbit   DQ=P3^7;  


#define	a 0x04                  //  AAAA
#define	b 0x01					// F    B
#define	c 0x10					// F    B
#define	d 0x40					//  GGGG
#define	e 0x80					// E    C
#define	f 0x02					// E    C
#define g 0x08					//  DDDD    H
#define	h 0x20 			

unsigned char code LED_table[]={
a+b+c+d+e+f,				   //"0"
b+c,						   //"1"
a+b+d+e+g,					   //"2"
a+b+c+d+g,					   //"3"
b+c+f+g,					   //"4"
a+c+d+f+g,					   //"5"
a+c+d+e+f+g,				   //"6"
a+b+c,						   //"7"
a+b+c+d+e+f+g,				   //"8"
a+b+c+d+f+g,				   //"9"
b+c+e+f+g,					   //"H"
a+f+e+g,					   //"C"
d+e+f,						   //"L"
g,							   //"-"
0x00						   //black
};

#undef a
#undef b
#undef c
#undef d
#undef e
#undef f
#undef g

#define SP 14									
/********************************************************/
/*		             初始化系统					        */
/********************************************************/
void Sys_Init()			
{
  TMOD=0x01;
  TH0=(65536-1000)/256;		 //1ms
  TL0=(65536-1000)%256; 
  EA=1;
  ET0=1;
  TR0=1;
}

/*********************************************************/
/*		          初始化DS18B20					         */
/*********************************************************/ 
void Init_DS18B20(void)		//初始化函数
{
  unsigned char x=0;
  DQ = 1;         //DQ复位
  delay(8);       //稍做延时
  DQ = 0;         //pull DQ line low
  delay(80);      //leave it low for 480~960us
  DQ = 1;         //allow line to return high
  delay(14);	  //wait for presence 15~60us
  x=DQ;           //稍做延时后 如果x=0则初始化成功
  delay(20);	  //			   x=1则初始化失败
}
/*********************************************************/
/*		            读一个字节					         */
/*********************************************************/ 
unsigned char Read_byte(void)
{
unsigned char i=0;
unsigned char dat=0;
for (i=8;i>0;i--)
{
  DQ = 0;         // 给脉冲信号
  dat>>=1;
  DQ = 1;         // 给脉冲信号
  if(DQ)
   dat|=0x80;	  // 取数据最高位
  delay(4);
}
return(dat);
}

/*********************************************************/
/*		              写一个字节				         */
/*********************************************************/
void Write_byte(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
  DQ = 0;
  DQ = dat&0x01;		   //取数据最低位
  delay(5);
  DQ = 1;
  dat>>=1;
}
delay(4);
}

/*********************************************************/
/*		                读取温度			   	         */
/*********************************************************/
ReadTemperature(void)				 
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;

Init_DS18B20();

Write_byte(0xCC); // 跳过读序号列号的动作  因为只有一个器件
Write_byte(0x44); // 启动温度转换

Init_DS18B20();

Write_byte(0xCC); //跳过读序号列号的动作
Write_byte(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=Read_byte();    //读取温度值低位
b=Read_byte();    //读取温度值高位
//a=a>>4;         //低位右移4位,舍弃小数部分
//b=b<<4;         //高位左移4位,舍弃符号位
//t=b|a;
//return(t);
return((b*256+a)*10/16); //	b*256+a  把两个8位温度变成16位
}						 // *10      扩大10倍从而保留小数位
						 // /16      把18b20的输出换算成实际温度,
						 //          显示时的小数点视情况而定

/*********************************************************/
/*		                温度显示函数		   	         */
/*********************************************************/
void DisplayNumber(unsigned int Num)	
{
	unsigned char i;
	EA=0;
	for(i=0;i<4;i++)
	{
 	DisBuff[i]=Num%10;
	Num/=10;
	}
/*	  if(DisBuff[3]==0)
	  {
	     DisBuff[3]=0xff;	
	     if(DisBuff[2]==0)
	      {
	        DisBuff[2]=0xff;	
	        if(DisBuff[1]==0)
			  DisBuff[1]=0xff;
	      }
	  }	  */
for(i=3;i>=0;i--)						    //消隐无效"0"
   {
	 if(DisBuff[i]==0) DisBuff[i]=SP;
	 else break;
   }
   	delay(100);	
	EA=1;

} 
/*********************************************************/
/*		              数码管扫描选通			   	     */
/*********************************************************/
void Display_Scan() interrupt 1	       //中断1触发时,就会指向该函数执行
{ 									   //并且保留现场,该函数完成后,回到入口,
TR0=0;								   //从原现场继续执行,等待下次中断发生
  TH0=(65536-1000)/256;				   //1ms
  TL0=(65536-1000)%256;  
TR0=1;
	
	if(COM>3) COM=0;
	COM1=1;COM2=1;COM3=1;COM4=1;
    switch(COM)
    {
	case 0:	P0=LED_table[DisBuff[0]]; COM1=0; break;
    case 1: P0=LED_table[DisBuff[1]]|0x20; COM2=0; break;	 //在数码管第二位上点亮小数点
	case 2:	P0=LED_table[DisBuff[2]]; COM3=0; break;
	case 3:	P0=LED_table[DisBuff[3]]; COM4=0; break;
    }
	COM++;					 
}

/*********************************************************/
/*		                 延时子程序			   	         */
/*********************************************************/
void delay(unsigned int i)
{
     while(i--);
    
}
/*********************************************************/
/*		                 主函数  			   	         */
/*********************************************************/
void main(void)
{
   unsigned int temp;
   Sys_Init();
   while(1)                         //死循环
   {
    temp=ReadTemperature();
    DisplayNumber(temp);
   }
}


⌨️ 快捷键说明

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