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

📄 1820.c

📁 51单片机测量多个点的温度值
💻 C
字号:
		   #include <reg52.h>
#include <intrins.h>
#include <string.h>
#include <stdio.h>

#define uchar unsigned char
#define uint unsigned int


/////////////////////////
// 函数声明区
void  init(void);         //复位
void  delay(uchar t); 	  //延时time=(t+2)*5*Tm
void  delay_ms(uchar t);	
void  write(uchar dat);	  //写18b20 子程序
uchar read(void);	      //读18b20 子程序
void  ck(uchar *s, uchar len);           //串口发送程序
uchar readtemp(uchar n);    // 参数是DS18B20的序号
void  display(uchar num);    // 显示一个整数
void  initTimer(void);
void  timerInt(void);      // 中断服务程序

////////////////////////
// 变量定义区
sbit P07 = P0^7;
sbit P10 = P1^4;


sbit P24 = P2^4;
sbit P25 = P2^5;
sbit P26 = P2^6;
sbit P27 = P2^7;

sbit P34 = P3^4;
static uchar rom[8];
uchar nowdsp=0;    // 当前显示温度所对应的传感器编号
uchar timer=0;		// 全局时钟
uchar *out;
uchar  xiaoshu;
uchar  displayvalue[4]={'1','2','3','4'};
static uchar temp[3];
uchar code RomCode[4][8]={40,69,62,167,0,0,0,137 ,40,120,50,194,0,0,0,30,40,134,186,194,0,0,0,138,0x28,0xbb,0x13,0xdf,0x00,0x00,0x00,0x48};	 
						      //3个传感器的64为序列号
uchar ledcode[]={0xC0,0xF9,0xA4,0xB0, 
				0x99, 0x92, 0x82, 0xF8,	  
				0x80, 0x90, 0x88, 0x83,
	   	  	    0xC6,0xA1,0x86, 0x8E};	   // LED显示
   
///////////////////////
// 主函数
main()
{
	uchar i;
	init();
	write(0x33);
	for(i=0;i<8;i++)
	   rom[i]=read();
	ck(rom ,8);	 		     //读序列号

/*	initTimer();
	while(1)
	{
	    init();	
		
		write(0xcc);     // 跳过ROM
		
		write(0x44);      // 启动温度转换
	
		temp[0]=readtemp(nowdsp);
	
		display(temp[0]);

	
	    displayvalue[0]=temp[0]/10+0x30;
		displayvalue[1]=temp[0]%10+0x30;
		displayvalue[2]=xiaoshu+0x30;
		displayvalue[3]=nowdsp+0x31;
	    
		ck(displayvalue,4);
		
	


		
	}		
 

*/	

}




///////////////////////
// 函数定义区
void init(void)	      // 复位
{
	//display(temp[0]);
	EA=0;		// 关闭中断
	P10=0;			 //总线为低电平
	delay(94);	    //总线复位电平保持500us
	P10=1;			//释放总线
	delay(12);		//保持60us
	while(1)
	{
		if(P10==0)  // 等于说明存在
		  {
			
			break;
	   	  }
		
	    else
	      {
		    P0=0x99;
			P2=0x00;
	      }
	}
	/// 检测到后的处理
	delay(80);
	P10=1; 
	EA=1;		// 完成任务后允许中断

}
void write(uchar dat)	   //写一个字节子程序
{
 	uchar i=0;
	bit b;
	EA=0;		// 关闭中断
   for(i=8;i>0;i--)
   {
     //display(temp[0]);
   	 b=dat&0x01;
	 if(b==1)
	 {	 // 写1
	     P10=0;	// 拉低总线6us
		 _nop_();
		 _nop_();
		 _nop_();
		 _nop_();
		 _nop_();
		 _nop_();
		 P10=1;
	 	 delay(11);//64us
	  }
	  else
	  {
	  	// 写0
		P10=0;		   //拉低60us
		delay(10);
		P10=1;
		delay(0);	   //10us
	  }
     dat>>=1;
   } 
   	EA=1;		// 完成任务后允许中断
 
}

uchar read(void)           //读一个字节子程序  
{  
 uchar  dat=0 ;
  uchar  i=0;
	EA=0;		// 关闭中断
  for(i=0;i<8;i++)
    {
  	 P10=0;		 //拉低总线6us
	  _nop_();
	  _nop_();
	  _nop_();
	  _nop_();
	  _nop_();
	  _nop_();
	 P10=1; 	// 释放总线9us
	  _nop_();
	  _nop_();
	  _nop_();
	  _nop_();
	  _nop_();
	  _nop_();
	  _nop_();
	  _nop_();
	  _nop_();
	 
	 dat>>=1;
   	 if(P10)
	 {
	   dat=dat|0x80;
	 }   
	 delay(9); 	
	 		  
    }
	EA=1;		// 完成任务后允许中断
  return(dat);
}



void ck(uchar  *s , uchar len)	  //     串口初始化发送子程序
{   
    uchar j;
    TMOD=0x21;
	SCON=0x50;
//	PCON=0x80;
	TH1=0xF3;
	TL1=0xF3;
	TR1=1;
	if(len==0)len=strlen(s);
	//display(temp[0]);
    for(j=0;j<len;j++   )
	    { SBUF=s[j];
		  while(!TI);
		  TI=0;
		}
}

void delay(uchar t)	  //延时time=(t+2)*5*Tm
{
	while(t--);
}

void delay_ms(uchar t)	  
{  	
   	uchar i, k;
    for(i=0;i<t;i++)
	{
	  k=165;
	  while(k--);
	}
}


uchar readtemp(uchar n)
{

	uchar i=0;
	EA=0;		// 关闭中断
	init();
	write(0x55);	                          // 匹配rom				
	for(i=0;i<8;i++)
	{
		write(RomCode[n][i]);
	}
	write(0xbe);                              // 读入暂存
	for(i=0;i<9;i++)
	{
		temp[i]=read();	
   	}
   
    i = ((temp[0]>>4)|(temp[1]<<4));

	temp[0]=temp[0]&0x0f;
	switch(temp[0])
      {	
	  
	    case 0  :  xiaoshu=0;break;
		case 1  :  xiaoshu=0;break;
		case 2  :  xiaoshu=1;break;
		case 3  :  xiaoshu=1;break;
	    case 4  :  xiaoshu=2;break;
		case 5  :  xiaoshu=3;break;
		case 6  :  xiaoshu=3;break;
		case 7  :  xiaoshu=4;break;
		case 8  :  xiaoshu=5;break;
		case 9  :  xiaoshu=5;break;
		case 10 :  xiaoshu=6;break;
		case 11 :  xiaoshu=6;break;
	    case 12 :  xiaoshu=7;break;
		case 13 :  xiaoshu=8;break;
		case 14 :  xiaoshu=8;break;
		case 15 :  xiaoshu=9;break;														
	  } 
      
	EA=1;		// 完成任务后允许中断
	return i;
}

void display(uchar num)
{
	P0=ledcode[nowdsp+1];
	P27=0;
	delay(5000);
	P27=1;
   
	P0=ledcode[num/10];
	P26=0;
	delay(5000);
	P26=1;

	P0=ledcode[num%10];
	P07=0;
	P25=0;
	delay(5000);
	P25=1;


	P0=ledcode[xiaoshu];
	P24=0;
	delay(5000);
	P24=1;	
}

void initTimer(void)
{
	TMOD=0x21;
	TH0=0x3c;
	TL0=0xb0;
	EA=1;
	ET0=1;
	TR0=1;
}
void timerInt(void) interrupt 1
{
	if(timer==20)
	{
		//每秒钟更换一次显示
		nowdsp=(nowdsp==2)?0:(nowdsp+1);
		timer=0;
	}
	TH0=0x3c;
	TL0=0xb0;
	TR0=1;
	timer++;
}
 

⌨️ 快捷键说明

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