既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
供电方式(外部电源供电、寄生电源供电、寄生电源强上拉)
1.外部电源供电
在外部电源供电方式下,DS18B20工作电源由VCC引脚接入,不存在电源电流不足的问题,可以保证转换精度,同时在总线上理论可以挂接任意多个DS18B20传感器,组成多点测温系统。同时注意在外部供电的方式下,GND引脚不能悬空,否则不能转换温度,读取的温度总是85°C。
这种外部电源供电方式是DS18B20最佳的工作方式,工作稳定可靠,抗干扰能力强,而且电路比较简单(只需三根线),可以开发出稳定可靠的多点温度监控系统。同时这种外接电源方式下,可以充分发挥DS18B20宽电源电压范围的优点,即使电源电压VCC降到3V,依然能够保证温度测量精度。
2.寄生电源供电
在寄生电源供电方式下,DS18B20从信号线上汲取能量:在DQ处于高电平期间把能量储存在内部电容里,在DQ处于低电平期间消耗电容上的电能工作,直到高电平到来再给寄生电源(电容)充电。
寄生电源供电的好处:
(1)进行远距离测温时,无需本地电源;
(2)可以在没有常规电源条件下读取ROM;
(3)少接一根VCC电源线,电路更加简洁。但要注意:要想使
DS18B20进行准确的温度转换,I/O线必须保证在温度转换期间提供足够的能量,由于每个DS18B20在温度转换期间工作电流达到1mA,当几个温度传感器挂在同一根I/O线上进行多点测温时,只靠4.7k上拉电阻就无法提供足够的能量,会造成无法转换温度或温度误差很大。因此,这种方式比较适用于单个测温点的情况或不适宜采用电池供电系统中,并且工作电源VCC必须保证在5V,当电源电压下降时,寄生电源能够汲取的能量也降低,会使温度误差变大。同时由于多种因素也可能造成寄生电源汲取能量不够而引起不能正常测温或误差较大等现象,因此,在开发测温系统时不推荐直接使用此种供电方式,可在此基础上采用寄生电源强上拉供电方式。
3.寄生电源强上拉
为了使DS18B20在温度检测周期内获得足够的电流供应,当进行温度转换或拷贝到EEPROM存储器操作时,用MOSFET把I/O线直接拉到VCC就可提供足够的电流,在发出任何涉及到拷贝到EEPROM存储器或启动温度转换的指合后,必须在最多10us内把I/O线转换到强上拉状态。
这种强上拉方式可以解决电流供应不足的问题,适合于多点测温的应用,但需要多占用一根I/O口线进行强上拉切换。
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程序代码
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*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显示温度
接口信号说明
1、
VSS接电源地
2、VDD接+5V
3、VO是液晶显示的偏压信号,可接10K的3296精密电位器。或同样阻值的RM065、RM063蓝白可调电阻。如下图所示:
4、RS是命令/数据选择引脚,接单片机的一个I/O,当RS为低电平时,选择命令;当RS为高电平时,选择数据。
5、RW是读/写选择引脚,接单片机的一个I/O,当RW为低电平时,向LCD1602写入命令或数据;当RW为高电平时,从LCD1602读取状态或数据。如果不需要进行读取操作,可以直接将其接VSS。
6、E,执行命令的使能引脚,接单片机的一个I/O。
7、D0--D7,并行数据输入/输出引脚,可接单片机的P0--P3任意的8个I/O口。如果接P0口,P0口应该接4.7K--10K的上拉电阻。如果是4线并行驱动,只须接4个I/O口。
8、A背光正极,可接一个10--47欧的限流电阻到VDD。
9、K背光负极,接VSS。
基本操作步骤与时序
1、读状态:输入
RS=0,RW=1,E=高脉冲。输出:D0--D7为状态字;
2、读数据:输入RS=1,RW=1,E=高脉冲。输出:D0--D7为数据;
3、写命令:输入RS=0,RW=0,E=高脉冲。输出:无;
4、写数据:输入RS=1,RW=0,E=高脉冲。输出:无。
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]);//设置温度
}
}
三、其他模块
其他模块包括独立按键模块、单片机核心模块和继电器模块。通过独立按键设置目标温度,然后通过温度传感器将数字温度信号传递给单片机,单片机通过高低电平转换,控制继电器的通断,进而实现加热设备对水温进行控制。
独立按键模块
独立按键式直接用I/O口线构成的单个按键电路,其特点式每个按键单独占用一根I/O口线,每个按键的工作不会影响其他I/O口线的状态。独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一个I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。
独立按键的软件常采用查询式结构。先逐位查询没跟I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。
独立键盘理想的波形是按下去时保持低电平,实际上在上升沿和下降沿的过程中(即按键和离键时的一段微小时间)会出现抖动。消抖的方法有两种,一种是通过硬件:在电路上连个电容;另一种是软件消抖,根据经验增加10ms的延时。这样即能起到消抖的作用。
sbit key = P1 ^ 1;
while(!key); //有按键抬起
delay\_ms(10);
while(!key); //确实有按键抬起
单片机核心模块
继电器模块
当输入高电平时,晶体管T1饱和导通,继电器线圈通电,触点吸合。
当输入低电平时,晶体管T1截止,继电器线圈断电,触点断开。
四、温控系统PID
采用位置式PID控制水温
void PIDInit (struct PID \*p)


**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://gitee.com/vip204888)**