目录
AD/DA
AD:模拟-数字转换
DA:数字-模拟转换
数字信号是计算机可操作的
模拟量(0-5V) 数字量(0-255V(8位))
运算放大器:很高放大倍数的放大电路单元
用上放大器的经典电路 ? ++++++
运算放大器作为电压比较器,对模拟电压进行二值化
按键
----过滤抖动----加延时
传感器模块
:利用传感器元件(光敏电阻/热敏电阻/红外接收管等)
通过与定值电阻分压即可得到模拟电压输出
再通过电压比较器进行二值化即可得到数字电压输出
传感器模块细节
滤波电容(一接电路一接低maybe)(分析时可去):给电压输出进行滤波,滤除一些干扰,保证输出电压波形的平滑
电压比较器芯片:含两个独立的电压比较器(运算放大器)电路
电位器:拧动产生电流
DO输出指示灯:指示DO的输出电平,低电平点亮,高电平熄灭
R5:默认输出高电平(防止一直亮)!
按键模块电路
必须要求PA0是上拉输入的模式,否则就会出现引脚电压不确定的错误现象
按键松开是高电平
上拉电阻VDD/下拉电阻VSS:给输入提供默认电平,防止处于浮空状态,输入数据易被干扰不确定。上通下断,上拉输入模式(默认为高电平的输入模式)//都断,浮空输入模式。(见stm32 1)
传感器模块接入电路
OLED
供电:3~5.5V,通信协议:I2C/SPI,分辨率:128*64
需要接在单片机I2C通信的引脚上 当然我给的驱动函数模块用的是GPIO口模拟的12C通信 所以这两个端口就可以接在任意的GPIO口上
代码
LED驱动/按键驱动
封装驱动代码
.h文件
#ifndef __Key_H //防止头文件重复包含 #define __Key_H #endif
按键初始化时
GPIO_Mode_IPU; //上拉输入
uint8_t unsigned char
GPIO读取函数
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//返回这个端口的高低电平
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);//读取整个输入数据寄存器
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//读取自己输出的内容
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);//读取自己输出的内容,整个输出数据寄存器
按键控制LED代码
main.h
/main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
uint8_t KeyNum;
int main(void)
{ //使用前,按键和灯都需要初始化,实际初始化的是按键和灯接入的IO口
LED_Init();
Key_Init();
while (1)
{
KeyNum = Key_GetNum(); //获取按键键码
if (KeyNum == 1) //按键1按下
{ LED1_ON(); //LED1翻转
}
if (KeyNum == 2) //按键2按下
{ LED1_OFF(); //LED2翻转
}
}
}
/key.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
void Key_Init(void)//按键初始化
{ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启GPIOB的时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); //将PB1和PB11引脚初始化为上拉输入
}
uint8_t Key_GetNum(void)//按键获取键码(知道是哪个按键是松开了)
{
uint8_t KeyNum = 0;//初始化无符号字符串
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0)//按键按下
{
Delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0);//检测按键松开,如果按键不松开,程序将一直停留在这一步
Delay_ms(20);//消除按键松开的抖动
KeyNum = 1;
}
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)==0)
{
Delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)==0);
Delay_ms(20);
KeyNum = 2;
}
return KeyNum;
}
/key.h
#ifndef __Key_H //防止头文件重复包含
#define __Key_H
void Key_Init(void);
uint8_t Key_GetNum(void);
#endif
部分解释
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0)//按键按下
{
Delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0);
Delay_ms(20);
KeyNum = 1;
}
消抖:
这里的while用意:其实是用于排除手一直按着不松开的情况。
如果一直按着,程序将停留在while不向下进行。
正确操作是手按下一定会有一个手抬起的动作,抬起时有抖动肯定会让那个!=0这样程序就会往下进行
总之,这一段进行完后,按键应当是按下的状态,电路接通
光敏传感器代码
/main.c
//----------------------按键控制LED--------------------------
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "Buzzer.h"
#include "LightSensor.h"
int main(void)
{
//模块初始化
Buzzer_Init(); //蜂鸣器初始化
LightSensor_Init(); //光敏传感器初始化
while (1)
{
if (LightSensor_Get() == 1) //光线暗的情况
{
Buzzer_ON(); //蜂鸣器开启
}
else
{
Buzzer_OFF();
}
}
}
//lightsensor.c
#include "stm32f10x.h" // Device header
void LightSensor_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//将PB13引脚初始化为上拉输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
uint8_t LightSensor_Get(void)//读取这个传感器所在的端口当前的状态
{
return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13); //返回PB13输入寄存器的状态
}
/lightsensor.h
#ifndef __LIGHT_SENSOR_H
#define __LIGHT_SENSOR_H
void LightSensor_Init(void);
uint8_t LightSensor_Get(void);
#endif
部分解释
这里选择上下拉都可以,光敏电阻不遮挡默认输出低电平,选择上下拉在不遮挡情况下13口都是低电平,选择上拉的话,拔掉13口输入线,13口就默认高电平了,蜂鸣器就会一直响,所以只要13口有输入,上下拉都可以
光线暗,电阻变大,AO分压大,AO输出为一,电压比较器IN+大于IN-, DO输出高电平
此时光敏传感器接的那个端口读取了端口的值应为1(传感器给的,对于GPIO来说是输入)
LightSensor_Get() == 1,此时为暗
接线图
按键控制LED 光敏传感器控制蜂鸣器
c知识补充
stm32中 c语言数据类型