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