C51 마이크로 컨트롤러 + DS18B20 온도 센서 + LCD1602 디스플레이 기반

하나, DS18B20 센서 관련 소개

DS18B20 기능

  1. 유일한 단일 버스 인터페이스, 양방향 통신 (온도 측정)은 단 하나의 라인으로 실현 가능
  2. 온도 측정 범위 : -55 ℃ ~ + 125 ℃, 9-12 자리 분해능은 프로그래밍으로 설정할 수 있으며 해당 분해능 온도는 각각 0.5, 0.25, 0.125, 0.0625 ℃입니다.
  3. 다중 지점 네트워킹 지원 (여러 DS18B20 온도 센서 연결 가능), 다중 DS18B20을 병렬로 연결 (3 또는 2 선)하여 다중 네트워킹 온도 측정을 수행 할 수 있지만 전원 공급 문제를 해결하려면 8 개 이상에주의하십시오. 전압이 너무 낮습니다. 전송이 불안정하고 데이터가 정확하지 않습니다.
  4. 작동 전압 : 3.0 ~ 5.5V (기생 전력 모드에서 데이터 라인에 의해 전력 공급 가능)
  5. 사용 중에 주변 회로가 필요하지 않으며 모든 감지 요소와 변환 회로가 칩에 있습니다. (풀업 저항)
  6. 온도 측정 결과는 직접 디지털 출력, 단일 버스 직렬 전송 모드 및 CRC 검사 코드를 동시에 전송할 수 있으며 (데이터 수집이 올바른지 확인) 강력한 간섭 방지 및 오류 수정 기능이 있습니다.
  7. 9 비트 분해능에서는 온도를 최대 93.75ms 단위의 숫자로 변환 할 수 있으며 12 비트 분해능에서는 온도 값을 최대 750ms 단위의 숫자로 변환 할 수 있습니다.
  8. 부압 특성 : 전원 공급 장치 극성이 반전되면 칩이 열로 인해 타지 않지만 정상적으로 작동하지 않습니다.

패키지 형태 및 핀 설명

핀

전원 공급 모드 (외부 전원 공급 장치, 기생 전원 공급 장치, 기생 전원 공급 장치 강력 풀업)

여기에 사진 설명 삽입
여기에 사진 설명 삽입

여기에 사진 설명 삽입

DS18B20 명령 (ROM 명령 동작)

일련 번호 교수 암호 기술
1 ROM 읽기 33 시간 64 비트 일련 번호의 DS18B20 읽기 (버스에서 하나의 DS18B20에만 적용 가능)
2 레지스터 쓰기 4EH 레지스터 쓰기 명령 후 DS18B20 레지스터 TH.TL 및 구성 레지스터에 데이터를 씁니다.
레지스터 읽기 이 명령을 보낸 후 DS18B20은 1 바이트에서 시작하여 9 바이트를 차례로 보냅니다. 모든 바이트를 읽고 싶지 않은 경우. 컨트롤러는 읽기를 중단하거나 직접 읽지 않도록 언제든지 재설정 명령을 실행할 수 있습니다.
4 레지스터 복사 48H TH.TL의 내용과 구성 레지스터를 EEPROM에 복사합니다. 기생 전원 공급 장치를 사용하는 경우 버스 컨트롤러는이 명령이 실행 된 후 10us 이내에 강력한 풀업을 시작하고 최소 10ms 동안 유지해야합니다.
5 온도 변환 명령 시작 44H 온도 변환이 완료된 후 첫 번째와 두 번째 바이트에 저장되며, 기생 전원 공급 장치 인 경우이 명령을 내린 후 버스는 10us 이내에 강력한 풀업을 시작해야합니다.
6 EEPROM 명령 복사 B8H TH.TL 및 구성 레지스터의 값을 스크래치 패드로 다시 복사하십시오. 이 복사 작업은 DS18B20의 전원이 켜지면 자동으로 실행되며 전원이 켜진 후 유효한 데이터가 임시 메모리에 저장됩니다.
7 전원 공급 모드 명령 읽기 B4H DS18B20으로 보낸 후 읽기 시간 간격을 다시 보낸 다음 전원 모드로 돌아갑니다. 0은 기생 전원, 1은 외부 전원입니다.

DS18B20 프로그램 코드

/********************************************
******************DS18B20********************
*********************************************/ 
void delay_18B20(unsigned int i)//延时1微秒
{
    
    
   while(i--);
}

void ds1820rst(void)  //DS18B20复位
{
    
     
	unsigned char x=0;
	DS = 1;           //DQ复位
	delay_18B20(4);   //延时
	DS = 0;           //DQ拉低
    TR0=0;
	delay_18B20(100); //精确延时大于
    TR0=1;
	DS = 1;           //拉高
	delay_18B20(40); 
} 

uchar ds1820rd(void)//读数据
{
    
     
	unsigned char i=0;
	unsigned char dat = 0;
    TR0=0;
	for (i=8;i>0;i--)
	{
    
       
		DS = 0; //给脉冲信号
		dat>>=1;
		DS = 1; //给脉冲信号
		if(DS)
		dat|=0x80;
		delay_18B20(10);
	}
   return(dat);
}

void ds1820wr(uchar wdata)//写数据
{
    
    
	unsigned char i=0;
    TR0=0;
    for (i=8; i>0; i--)
    {
    
     
		DS = 0;
		DS = wdata&0x01;
		delay_18B20(10);
		DS = 1;
		wdata>>=1;
   }
}



uint get_temper()//获取温度
{
    
      
     
	uchar a,b;

	ds1820rst();    
	ds1820wr(0xcc);//跳过读序列号
	ds1820wr(0x44);//启动温度转换
	ds1820rst();    
	ds1820wr(0xcc);//跳过读序列号 
	ds1820wr(0xbe);//读取温度 
	a=ds1820rd();
	b=ds1820rd();
   
	tvalue=b;
	tvalue<<=8;
	tvalue=tvalue|a;
    TR0=1;
    if(tvalue<0x0fff)   tflag=0;
    else {
    
    tvalue=~tvalue+1;tflag=1;}
	  tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
	  temp=tvalue;
	return temp;
}


void dis_temp(int t)//显示温度
{
    
    
	uchar d0,d1,d2,d3;
	if(tflag==0)
	{
    
    
		d0=t/1000+0x30;//百位
		d1=t%1000/100+0x30;//十位
		d2=t%100/10+0x30;//个位
		d3=t%10+0x30;//小数位
		if(d0==0x30)
		{
    
    
			wr_com(0x80+10);
			wr_data(d1);
			wr_com(0x80+11);
			wr_data(d2);
			wr_com(0x80+12);
			wr_data(0x2e);
			wr_com(0x80+13);
			wr_data(d3);
		}
		else
		{
    
    
			wr_com(0x80+10);
			wr_data(d0);
			wr_com(0x80+11);
			wr_data(d1);
			wr_com(0x80+12);
			wr_data(d2);
			wr_com(0x80+13);
			wr_data(' ');
		}
		
	}
	else
	{
    
    
		wr_com(0x80+10);
		wr_data('-');
		wr_com(0x80+11);
		wr_data(d1);
		wr_com(0x80+12);
		wr_data(d2);
		wr_com(0x80+13);
		wr_data(' ');
	}
	wr_com(0x80+14); //摄氏度符号
	wr_data(0xdf);
	temper=t/10;
}

2. LCD1602는 온도를 표시합니다

인터페이스 신호 설명

여기에 사진 설명 삽입

기본 작동 단계 및 타이밍

여기에 사진 설명 삽입
여기에 사진 설명 삽입

초기화 과정

지연 15ms
쓰기 명령 38H (사용 중 신호 감지 안 함)
지연 5ms
쓰기 명령 38H (사용 중 신호 감지 안 함)
지연 5ms
쓰기 명령 38H (사용 중 신호 감지 안 함)
(각 후속 쓰기 명령, 작업 전 데이터 읽기 / 쓰기 필요 쓰기 명령 38H : 표시 모드 설정
쓰기 명령 08H : 표시 끄기
쓰기 명령 01H : 화면 지우기
쓰기 명령 06H : 표시 커서 이동 설정
쓰기 명령 0CH : 표시 켜기 및 커서 설정

LCD1602 프로그램 코드

/********************************************
******************LCD1602********************
*********************************************/ 
void delay(i)//延时函数
{
    
    
	uint j;
	for(i;i>0;i--)
	for(j=110;j>0;j--);
}

void wr_com(uchar ml)//LCD液晶写命令
{
    
    
	lcdrs=0;  //寄存器低电平选择指令寄存器
	P0=ml;
	delay(5);
	lcden=1;
	delay(5);
	lcden=0;

}

void wr_data(uchar shuju)//LCD液晶写数据
{
    
    
	lcdrs=1;
	P0=shuju;
	delay(5);
	lcden=1;
	delay(5);
	lcden=0;

}

void init()      //按照时序操作的初始化
{
    
    	
	lcdrw=0;     //低电平为写操作
	wr_com(0x38);//显示模式设置,设置为16*2显示,5*7点阵,八位数据口
	wr_com(0x0c);//开显示,但不开光标,光标不闪
	wr_com(0x06);//显示光标移动设置
	wr_com(0x01);// 清屏
	wr_com(0x80);// 数据指针初始化
	for(num=0;num<16;num++)
		{
    
    
			wr_data(str1[num]);//实际温度
		}
	wr_com(0x80+0x40);         //地址初始化
	for(num=0;num<16;num++)
		{
    
    
			wr_data(str2[num]);//设置温度
		}	 
}

세, 온도 제어 시스템 PID

void PIDInit (struct PID *p) 
{
    
     
	memset ( p,0,sizeof(struct PID)); //用参数0初始化p
} 



unsigned int PIDCalc( struct PID *p, unsigned int NextPoint ) //PID计算
{
    
     
	unsigned int dError,Error; 
	Error = p->SetPoint - NextPoint; // 偏差 
	p->SumError += Error; // 积分 
	dError = p->LastError - p->PrevError; // 当前微分 
	p->PrevError = p->LastError; 
	p->LastError = Error; 
	return (p->Proportion * Error//比例
	+ p->Integral * p->SumError  //积分项
	+ p->Derivative * dError); //   微分项 
} 

네, 프로젝트 디스플레이

여기에 사진 설명 삽입
MCU AT89C52 기반 온도 제어 시스템 코드
위는 시스템 코드이며 메시지를 남기고 이메일을 보낼 수도 있습니다.

추천

출처blog.csdn.net/a2145565/article/details/114175661