【单片机】IIC通信协议
一、单片机通信基础概念
全双工和半双工的区别:
一、全双工(Full Duplex)通信允许数据在两个方向上同时传输,它在能力上相当于两个单工通信方式的结合。全双工指可以同时(瞬时)进行信号的双向传输(A→B且B→A)。指A→B的同时B→A,是瞬时同步的。
二、半双工(Half Duplex)数据传输指数据可以在一个信号载体的两个方向上传输,但是不能同时传输。
MCU中常见的通信协议:
二、推挽输出和开漏输出
推挽输出:
推挽输出结构是由两个MOS或者三极管收到互补控制的信号控制,两个管子时钟一个在导通,一个在截止,如图1所示:
特点:
推挽输出可以输出高电平和低电平,在两种电平下都具有驱动能力。
相比于后面介绍的开漏输出,输出高电平时的驱动能力强很多
缺点:推挽输出不能实现" 线与"。
开漏输出:
常说的与推挽输出相对的就是开漏输出,抽象地说就是COMS反相器去掉了NMOS部分,PMOS管漏极输出,即开漏输出。PMOS管由高电平导通输出低电平,高电平没有驱动能力,需要借助“上拉电阻” (一般上拉电阻值较大,即弱上拉模式)什么是弱上拉?
开漏输出的另一个优点在于 ...
【51单片机】AT24C02(EEPROM储存)
2.26更新
基本概念
#前置概念
所用外设:
AT24C02(EEPROM储存) 使用IIC协议
一、单片机通信协议(本文以IIC为重点)
全双工和半双工的区别:
一、全双工(Full Duplex)通信允许数据在两个方向上同时传输,它在能力上相当于两个单工通信方式的结合。全双工指可以同时(瞬时)进行信号的双向传输(A→B且B→A)。指A→B的同时B→A,是瞬时同步的。
二、半双工(Half Duplex)数据传输指数据可以在一个信号载体的两个方向上传输,但是不能同时传输。
MCU中常见的通信协议:
二、推挽输出和开漏输出
推挽输出:
推挽输出可以输出高电平和低电平,在两种电平下都具有驱动能力。
相比于后面介绍的开漏输出,输出高电平时的驱动能力强很多
缺点:推挽输出不能实现" 线与"。
开漏输出:
常说的与推挽输出相对的就是开漏输出,抽象地说就是COMS反相器去掉了NMOS部分,PMOS管漏极输出,即开漏输出。PMOS管由高电平导通输出低电平,高电平没有驱动能力,需要借助“上拉电阻” (一般上拉电阻值较大,即弱上拉模式)什么是弱上拉?
IIC为什么要开漏输出模式 ...
【stm32单片机】[5]定时器控制PWM
配置结构体初始化输出比较单元
void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
设置结构体初始值
void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct);
*配置强制输出
void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC2Config(TIM_TypeDef* ...
【微机原理】[1] 文件寄存器RAM
课堂记录
配置位
【stm32单片机】[4]定时器中断
打开RCC内部时钟
选择时基单元时钟源
配置时基单元
配置输出中断控制,允许更新中断输出到NVIC
配置NVIC,打开定时器通道,并分配一个优先级
运行控制
相关函数
恢复缺省配置
TIM_DeInit(TIM_TypeDef* TIMx);
时基单元初始化
TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
TIMx:选择定时器
TIM_TimeBaseInitStruct:结构体,定时器有关的配置
结构体初始化
TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
使能计数器,对应运行控制
TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
中断输出使能控制
TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, Func ...
【stm32单片机】[3]EXTI外部中断
stm32的中断结构
NVIC
STM32中的NVIC详解_stm32 nvic-CSDN博客
EXTI
一、对射式红外传感器计次
红外传感器底层程序
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182#include "stm32f10x.h" // Device headeruint16_t CountSensor_Count; //全局变量,用于计数/** * 函 数:计数传感器初始化 * 参 数:无 * 返 回 值:无 */void CountSensor_Init(void){ /*外部中断的定义*/ /*开启时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启GPIOB ...
【stm32单片机】[2]stm32GPIO输出
GPIO输入
一、LED闪烁
123456789101112131415161718192021222324252627#include <stm32f10x.h> //Device header#include <Delay.h>int main(void){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//配置GPIOA外部时钟 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//一般输出用推挽输出模式 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 ; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); //四个基本的输出电平设置函数 //GPIO_SetBits(GPIOA,GPIO_Pin_0);//LED ...
【stm32单片机】[1] stm32工程创建
stm32点亮LED
一、配置寄存器方式
1234567891011#include <stm32f10x.h> //Device header int main(void){ /*使用配置寄存器的方式进行点灯操作*/ RCC->APB2ENR = 0x00000010; GPIOC->CRH = 0x00300000; GPIOC->ODR = 0x00002000; //缺点:配置繁琐,操作多}
二、库函数方式
12345678910111213141516171819202122#include <stm32f10x.h> //Device headerint main(void){ /*使用库函数的方式进行点灯操作*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//配置GPIOC的外设时钟 //函数的本质还是配置寄存器,但是封装好了完整可靠的功能 //不会影响到寄存器的其他位,不需要手动计算寄存器 GPIO_InitTypeDef GPIO_Ini ...
【数学建模】[1]线性规划
1234c=[2;3;1];a=[1,4,2;3,2,0];b=[8,6];[x,frav]=linprog(c,-a,-b,[],[],zeros(3,1))
zeros 的作用 ?
在这个问题中,zeros(3,1) 是用来设置线性规划问题的变量的下界为零的约束条件。
在 MATLAB 的 linprog 函数中,第五个参数是用来指定变量的下界约束条件的。在这个例子中,我们希望所有的变量都不能小于零,所以我们使用 zeros(3,1) 来创建一个全部元素为零的列向量作为下界约束条件。
这样设置下界约束条件后,线性规划求解器就会确保求解结果中的所有变量都大于等于零,符合我们的约束要求。
简而言之,zeros(3,1) 的作用是设置变量的下界为零,以满足线性规划问题的约束条件。
【C语言入门学习】函数01
【C语言入门学习】函数的概念
前言
在数学中,函数是核心思想之一;同样,在计算机语言中,函数也是编程的核心思想。函数通过将代码结构化,帮助我们简化复杂的程序逻辑。
一、函数的定义
根据维基百科的定义:子程序,子程序是计算机程序中负责完成某项特定任务的一段代码。它由一个或多个语句块组成,相较于其他代码,具备较高的独立性。子程序通常有输入参数和返回值,提供过程的封装与细节的隐藏,且多被集成为软件库中的函数。
二、函数的分类
库函数
自定义函数
为什么需要库函数?
C语言的标准库中提供了大量的库函数,旨在减少重复编写常用功能的代码,避免重复造轮子。库函数帮助我们高效地解决常见问题,提高开发效率。
如何查找库函数?
以下是常用的库函数查询网站:
cplusplus.com
cppreference.com
提示:cppreference 支持在 Edge 浏览器中安装插件,URL 搜索框中输入 “cc”+“空格” 可以快速查询函数的定义、使用方式及对应的封装库。
常见的库函数
IO函数:如 printf、scanf
字符串操作函数:如 strlen
字符操作函数 ...
【C语言入门学习】[3]代码书写的规范
c语言代码书写规范:
if语句,while语句等等,尽量要带上{}
判断语句如if(a==1)最好改写成if(1==a),因为一但写成if(a=)形式, 编译也能通过,但会导致程序执行完全不同的结果。
如果写成if(1=a),因为语法规定,只能将值赋给等号左边的变量,不然编译不通过,这样的话,能够对编写语句起到 约束作用 避免了 “程序能跑就行”的局面
123456789101112131415161718192021222324252627#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int main1(){ int a = 0; printf("请输入:\n"); scanf("%d", &a);//不要加转义字符 if (a % 2 == 1) { printf("为奇数\n"); } else { printf("为偶数\n"); } int num = 0; for (num = 1; num <= 100; num++) { if (num % 2 == 1) { pri ...
【Git学习】[1]基本命令
一、Git仓库的创建
1. Git仓库的创建:
将当前目录变成可以GIT管理的目录
1git init//创建初始化仓库
2. 将文件添加到版本库(Repository):
实际上就是把文件修改添加到暂存区
1git add . //将当前文件目录下所有文件移入暂存区``
3. 将暂存区内容添加到版本库(Repository)中:
仓库创建后,head默认指向master分支
实际上就是把暂存区的所有内容提交到当前分支
每一次的commit相当于一次快照,一但把项目文件该乱了,可以从最近的一次commit恢复
12git commit -m "第一次版本提交" //在后面加-m选项,以在命令行中提供提交注释git commit -am "第一次版本提交"//跳过add这一步,可以直接使用 -a选项
注意:每次修改,如果不用git add到暂存区,那就不会加入到commit中
4. 修改日志
版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log命令查看
5. 版本回退
1094a…是版本号
1git reset --hard 1094a...
...