【蓝桥杯单片机】第九届省赛题
题目要求
题目分析(思路)
首先,定义按键所控制的相关变量
编写数码管显示的逻辑,以”设置状态为准“,测试按键是否能正常控制相关参数(工作模式、流转间隔)
因为一共有四个工作模式,流转间隔定义为一个数组,存放各个元素的流转时长
将工作模式1的相关逻辑(LED流转方式)编写出来
这里使用一个指针用于LED的点亮(LED_OFF),另一个用于LED的熄灭(LED_ON)
将工作模式,流转间隔的逻辑与LED工作模式1关联,测试按键功能是否正常,LED是否能被流转间隔控制
如果以上程序测试正确,编写其他三个工作模式的LED模块
此时进行程序测试,功能正常,但是切换其他流转模式会有上一个模式的LED”残留“ (如双LED模式切换到单LED模式时),因此需要进行LED的复位(在按键控制模块中编写)
修改完毕后,编写亮度控制,此时注意到,一个定时器0无法满足对LED扫描的同时进行亮度控制,因此再调用定时器1,用于LED的扫描指针偏移,以及LED的PWM控制亮度。
这里修改完程序后,发现数码管闪烁,这是因为定时器1的频率较高,会打断主函数中数码管显示模块,因 ...
【单片机】SPI协议
基础概念
什么是SPI?
SPI是串行外设接口(Serial Peripheral Interface)的缩写。是 Motorola 公司推出的一 种同步串行接口技术,是一种高速的,全双工,同步的通信总线。
SPI优点:支持全双工通信 通信简单 数据传输速率块
缺点 :没有指定的流控制,没有应答机制确认是否接收到数据,所以跟IIC总线协议比较在数据 可靠性上有一定的缺陷。
特点:
高速、同步、全双工、非差分、总线式
主从机通信模式
蓝桥杯相关(暂未使用SPI)
DS1302(时钟芯片)底层
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051#include <reg52.h>#include <intrins.h>#include "ds1302.h"sbit SCK=P1^7; sbit SDA=P2^3; sbit RST = P1^3; void Write_Ds1302(unsig ...
【单片机】OneWire通信协议
一、OneWire(单总线)协议
•单总线(1-Wire BUS)是由Dallas公司开发的一种通用数据总线
•一根通信线:DQ
•异步、半双工
•单总线只需要一根通信线即可实现数据的双向传输,当采用寄生供电时,还可以省去设备的VDD线路,此时,供电加通信只需要DQ和GND两根线
二、单总线电路规范
•设备的DQ均要配置成开漏输出模式
•DQ添加一个上拉电阻,阻值一般为4.7KΩ左右
•若此总线的从机采取寄生供电,则主机还应配一个强上拉输出电路
三、单总线的时序结构
蓝桥杯相关
OneWire底层
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263#include "onewire.h"#include "reg52.h"sbit DQ = P1^4; //单总线内部延时函数void Delay_OneWire(unsigned int t) { t *= 12; while(t ...
【单片机】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) 的作用是设置变量的下界为零,以满足线性规划问题的约束条件。