既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
主机将总线拉低至少480us,然后释放总线,等待15 ~ 60us后,存在的从机会拉低总线60 ~ 240us响应主机,之后从机释放总线;分为两个部分:复位和响应。
/\*\*
\* @brief 主机将总线拉低至少480us,然后释放总线,等待15 ~ 60us后,
存在的从机会拉低总线60 ~ 240us响应主机,之后从机释放总线;
分为两个部分:复位和响应。
\* @param
\* @retval
\*/
unsigned char OneWire\_Init()
{
unsigned char i;
unsigned char AckBit;
OneWire_DQ = 1;
OneWire_DQ = 0; // 拉低总线
i = 247;
while (--i); // Delay 500us
OneWire_DQ = 1; // 释放总线
i = 32;
while (--i); // Delay 70us
AckBit = OneWire_DQ; // 获取从机响应
i = 247;
while (--i); // Delay 500us
return AckBit;
}
发送一位
主机将总线拉低60 ~ 120us,释放总线,表示发送0;主机将总线拉低1 ~14us,释放总线,表示发送1。从机将在主机拉低30us后读取电平,整个时间片应该大于60us。
/\*\*
\* @brief 主机将总线拉低60 ~ 120us,释放总线,表示发送0;
主机将总线拉低1 ~ 14us,释放总线,表示发送1。
从机将在主机拉低30us后读取电平,整个时间片应该大于60us。
在10us附近判断是否释放总线即可
\* @param
\* @retval
\*/
void OneWire\_SendBit(unsigned char Bit)
{
OneWire_DQ = 0; // 拉低总线
unsigned char i;
i = 4;
while (--i); // Delay 10us
OneWire_DQ = Bit;
i = 24;
while (--i); // Delay 50us
OneWire_DQ = 1;
}
接收一位
主机将总线拉低1 ~ 15us, 然后释放总线,并在拉低后15us内读取总线电平(尽量贴近15us末尾),读取低电平接收0,读取高电平接收1,整个时间片应该大于60us。
/\*\*
\* @brief 主机将总线拉低1 ~ 15us, 然后释放总线,并在拉低后15us内读取总线电平(尽量贴近15us末尾),
读取低电平接收0,读取高电平接收1,整个时间片应该大于60us。
\* @param
\* @retval
\*/
unsigned char OneWrie\_ReceiveBit()
{
unsigned char Bit;
unsigned char i;
OneWire_DQ = 0;
i = 2;
while (--i); // Delay 5us
OneWire_DQ = 1;
i = 2;
while (--i); // Delay 5us
Bit = OneWire_DQ;
i = 24;
while (--i); // Delay 50us
return Bit;
}
发送和接收一个字节
/\*\*
\* @brief 发送一个字节
\* @param Byte 发送的字节
\* @retval
\*/
void OneWire\_SendByte(unsigned char Byte)
{
unsigned char i;
for(i = 0; i < 8; i++){
OneWire\_SendBit(Byte&(0x01<<i));
}
}
/\*\*
\* @brief 接收一个字节
\* @param
\* @retval 接收的数据
\*/
unsigned char OneWire\_ReceiveByte()
{
unsigned char i;
unsigned char Byte = 0x00;
for(i = 0; i < 8; i++){
if(OneWire\_ReceiveBit()){
Byte |= (0x01<<i);
}
}
return Byte;
}
DS18B20操作流程
- 初始化:从机复位,主机判断从机是否响应
- ROM操作:ROM指令 + 本指令需要的读写操作
ROM:
SEARCH ROM : 搜寻
READ ROM : 读
MATCH ROM : 匹配寻址
SKIP ROM :跳过,当接一个设备时使用
ALARM SEARCH :告警搜索
功能指令:
CONVERT T :温度变换
WRITE SCRATCHPAD:写
READ SCRATCHPAD:读暂存器内容
COPY SCRATCHPAD: 复制
RECALL E2:覆盖
READ POWER SUPPLY:响应供电方式,独立、寄生供电
- 功能操作:功能指令 + 本指令需要的读写操作
DS18B20数据帧
- 温度变化:初始化—>跳过ROM—>开始温度变换
- 温度读取:初始化—>跳过ROM—>读暂存器—>连续的读操作
直流电机驱动
电机驱动电路
- 大功率期间直接驱动
不能调换正负方向- H桥驱动
可以调控旋转方向
PWM电机调速
PWM 脉冲宽度调制,在具有惯性的系统中,可以通过对脉冲的宽度进行调制
代码实现
实现思路:通过定时器+中断+标志实现模拟出PWM
/\*\*
\* @brief 中断处理
\* @desc 通过定时器控制频率,Counter和Compare的比较控制占空比
\* @param 无
\* @retval 无
\*/
void Timer0\_Routine() interrupt 1
{
static unsigned int T0Count;
TL0 = 0x9C;
TH0 = 0xFF;
Counter++;
Counter%=100;
if(Counter < Compare){
LED = 1;
} else {
LED = 0;
}
}
IIC总线
IIC概述
IIC时序结构
Start
起始条件:SCL高电平期间,SDA从高电平切换到低电平
/\*\*
\* @brief 起始
\* @param
\* @retval
\*/
void I2C\_Start(void)
{
I2C_SDA = 1;
I2C_SCL = 1;
I2C_SDA = 0;
I2C_SCL = 0;
}
Stop
终止条件:SCL高电平期间,SDA从低电平切换到高电平
/\*\*
\* @brief 终止
\* @param
\* @retval
\*/
void I2C\_Stop(void)
{
I2C_SDA = 0;
I2C_SCL = 1;
I2C_SDA = 1;
}
发送一个字节
SCL低电平期间,主机将数据位一次放到SDA先上(高位在前)
拉高SCL电平,从机在SCL高电平期间读取数据位
如此循环8次即可读一个字节
/\*\*
\* @brief 发送一个字节
\* @param
\* @retval
\*/
void I2C\_SendByte(unsigned char Byte)
{
unsigned char i;
for(i = 0; i < 8; i++){
I2C_SDA = Byte & (0x80 >> i);
I2C_SCL = 1;
I2C_SCL = 0;
}
}
接收一个字节
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
i);
I2C_SCL = 1;
I2C_SCL = 0;
}
}
##### 接收一个字节
[外链图片转存中...(img-5gZA8JxI-1715835488595)]
[外链图片转存中...(img-yegJNbhV-1715835488595)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**
**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**
**[如果你需要这些资料,可以戳这里获取](https://bbs.youkuaiyun.com/topics/618679757)**