既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
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(tflag0)
{
d0=t/1000+0x30;//百位
d1=t%1000/100+0x30;//十位
d2=t%100/10+0x30;//个位
d3=t%10+0x30;//小数位
if(d00x30)
{
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蓝白可调电阻。如下图所示:
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1b78238c12e14e4eaef98a72f8dfa053.png#pic_center)
> 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接线图
![在这里插入图片描述](https://img-blog.csdnimg.cn/d3dfc1c3a0b0487797a551b6d68b3a3d.png?x-oss-process=image,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWmVhbC5aaGFuZw==,size_20,color_FFFFFF,t_20,g_se,x_16#pic_center)
#### 初始化过程
>
> 延时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口线浪费较大,不宜采用。
![在这里插入图片描述](https://img-blog.csdnimg.cn/197417e644924d4c86c71e788b82dadb.png?x-oss-process=image,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWmVhbC5aaGFuZw==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
独立按键的软件常采用查询式结构。先逐位查询没跟I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。
独立键盘理想的波形是按下去时保持低电平,实际上在上升沿和下降沿的过程中(即按键和离键时的一段微小时间)会出现抖动。消抖的方法有两种,一种是通过硬件:在电路上连个电容;另一种是软件消抖,根据经验增加10ms的延时。**这样即能起到消抖的作用。**
sbit key = P1 ^ 1;
while(!key); //有按键抬起
delay_ms(10);
while(!key); //确实有按键抬起
#### 单片机核心模块
![在这里插入图片描述](https://img-blog.csdnimg.cn/cf036d5c3d0e41b89ee522971eb5a68b.png?x-oss-process=image,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWmVhbC5aaGFuZw==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
#### 继电器模块
![在这里插入图片描述](https://img-blog.csdnimg.cn/4dd1b803e2d94b9c93568807cd0c164a.png?x-oss-process=image,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWmVhbC5aaGFuZw==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
当输入高电平时,晶体管T1饱和导通,继电器线圈通电,触点吸合。
当输入低电平时,晶体管T1截止,继电器线圈断电,触点断开。
## 四、温控系统PID
采用位置式PID控制水温
void PIDInit (struct PID *p)
{
memset ( p,0,sizeof(struct PID)); //用参数0初始化p
}
/**********************************************
根据位置式离散PID公式
PID = Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)]
e(k)代表本次偏差
e(k-1)代表上一次的偏差
∑e(k)代表e(k)以及之前的偏差的累积和;其中k为1,2,k;
PID代表输出
***********************************************/
unsigned int PIDCalc( struct PID *p, unsigned int NextPoint )
{
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); // 微分项
}
**收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/a26e582866eedb829da50e6ee3df12a7.png)
![img](https://img-blog.csdnimg.cn/img_convert/f6acadcc2affbfa32fa488ba4d12d39b.png)
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**
**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
}
收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
[外链图片转存中…(img-KbyXtSuW-1715714002605)]
[外链图片转存中…(img-nCHlEpmB-1715714002606)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!