基于AT89C52的温度控制系统
-
- 一、DS18B20传感器相关介绍
-
-
- DS18B20特性
- 封装形式与引脚说明
- 供电方式(外部电源供电、寄生电源供电、寄生电源强上拉)
- DS18B20指令(ROM指令操作)
- DS18B20程序代码
-
- 二、LCD1602显示温度
-
-
- 接口信号说明
- 基本操作步骤与时序
- 初始化过程
- LCD1602程序代码
-
- 三、温控系统PID
- 四、项目展示
一、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 | 33H | 读DS18B20的64位序列号(只能适用于总线上只有一个DS18B20) |
2 | 写暂存器 | 4EH | 在该写暂存器指令后向DS18B20的暂存器TH.TL以及配置寄存器中写入数据。 |
3 | 读暂存器 | BEH | 发送该指令后DS18B20将从一个字节开始,依次送出9个字节的内容。如果不想读完所有字节。控制器可以在任何时间发出复位指令中止读取或直接不读取。 |
4 | 复制暂存器 | 48H | 将TH.TL和配置寄存器的内容拷贝到EEPROM中,如果使用寄生电源,总线控制器必须在这条指令发出后10us内启动强上拉并保持至少10ms时间。 |
5 | 启动温度转换指令 | 44H | 温度转换完成后存放在第1个和第2个字节中,如果是寄生电源,总线必须在发出这条指令后的10us内启动强上拉。 |
6 | 复制EEPROM指令 | B8H | 把TH.TL和配置寄存器的值拷贝回暂存器。这种拷贝操作在DS18B20上电时自动执行,上电后,暂存器里就存了有效数据。 |
7 | 读供电方式指令 | B4H | 发给DS18B20后,再发出读时间间隙,后返回电源模式:0为寄生电源、1为外部电源。 |
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;
}
二、LCD1602显示温度
接口信号说明
基本操作步骤与时序
初始化过程
延时15ms
写指令38H(不检测忙信号)
延时5ms
写指令38H(不检测忙信号)
延时5ms
写指令38H(不检测忙信号)
(以后每次写指令,读/写数据操作之前均需检测忙信号) 写指令38H:显示模式设置
写指令08H:显示关闭
写指令01H:显示清屏
写指令06H:显示光标移动设置
写指令0CH:显示开及光标设置
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); // 微分项
}
四、项目展示
基于单片机AT89C52的温控系统代码
以上就是系统的代码,也可以留言找我发邮箱哦。