1.硬件部分:按键,传感器
传感器模块:光敏电阻,热敏电阻,红外接收管
光敏电阻:光线越强,光敏电阻的阻值就越小;
热敏电阻:温度越高,热敏电阻的阻值越小;
红外接收管:红外光线越强,红外接收管的阻值越小;
注意:电阻的变化不容易直接被观察,通常将传感器元件和定值电阻串联,进行分压,从而得到模拟电压的输出!!!再通过电压比较器(运算放大器)进行二值化即可得到数字电压
(一般我们遇见一端接电路,一端接地,都可以考虑是不是滤波电容)
第三个:AO点电压变化,分压思想和上拉下拉思想
上拉下拉:当N1阻值为0,强下拉,AO电压会直接被拉到0V;N1阻值变大,下拉作用会减弱,中间引脚由于R1的上拉作用电压会升高;N1阻值无穷大,相当于断路,输出电压被拉到VCC(不计R1的阻值)
AO输出端:想象成放在屋子里的水平杆子,R1上拉电阻相当于有一个弹簧将杆子往上拉,N1下拉电阻相当于栓在地面的弹簧,将AO杆子向下拉;电阻阻值越小,弹簧拉力越强;
强上拉,强下拉;弱上拉,弱下拉:指弹簧力的大小(也就是电阻的阻值大小)
(压降!!!)
逐次逼近AD 转换器!!!
LM393就是电压比较器,两个电压比较器(运放)
IN+接AO,IN-接电位器(拧电位器,可改变阈值)进行比较,最后输出DO
注意:对于对射式红外传感器,N1就是红外接收管,会多一个点亮红外发射管的电路;(模拟电压是表示接收到的光强度(会避免自然红外光的干扰))此处的电位器是两个电阻进行分压,阈值一定
反射式红外传感器:向下发射红外光,接收反射光强,制作寻迹小车!!!
下图为开漏输出模式,在按下按键低电平,接通;松手时候引脚悬空,断开(需要引脚PA0里面再接一个弱上拉(上拉输入VDD接通),保证引脚的稳定性,阻值要大,防止对输入的影响)引脚悬空,此时是高电平。
下图,默认是弱上拉高电平模式;按下按键是强下来拉到GND,变为低电平,接通;
可以上拉输入或者浮空状态输入
PA0内部再弱上拉(上拉输入),此时上拉作用会强,再按下会强制拉到GND低电平,损耗较大
所以选择悬空模式,两个都不接通
二.c语言基础
右边是c语言stdint.h文件和ST对这些变量的重命名(typedef)
原因:左边名字比较长,而且int的位数(字节大小)根据操作系统的不同还有可能不一样,(int对于32位操作系统是4字节,64位操作系统是8字节),还有就是有时候名字和存储内容不一样,比如char关键字,是存储字符型数据,但是我们经常拿来存放整数而不是字符。
typedef:给变量类型换名字,重命名;即使用原来名字和此别名有一样效果
typedef unsigned char uint8_t;
引用typedef:
uint8_t a; // 等效于 unsigned char a;
宏定义和typedef的区别:1.宏定义不需要分号,typedef后面必须加分号;2.宏定义任何名字都可以换(一般将数字换成字符串进行替换,明显),typedef只能专门给变量类型换名字;宏定义改名范围更宽,typedef给变量类型命名更加安全,会检查变量类型是否正确。宏定义不会进行检查字符串名字;
数据类型:结构体,枚举,int,char等等
结构体:数据打包,不同数据类型变量的集合
关键字:struct
用途:数据打包,不同类型变量的集合
定义结构体变量:
struct
{
char x;
int y;
float z;
} StructName;
结构体名字可以放在最后,或者关键字旁边
struct StructName
{
char x;
int y;
float z;
};
因为结构体变量类型较长,所以通常用typedef更改变量类型名
引用结构体成员: StructName.x = 'A'; StructName.y = 66; StructName.z = 1.23;
pStructName->x = 'A'; //pStructName为结构体的地址
pStructName->y = 66;
pStructName->z = 1.23;
注意:链表中,存储的地址,就是下个节点的地址,和存储地址单元 是一个东西!!!!
关键字:enum
用途:定义一个取值受限制的整型变量,用于限制变量取值范围;
宏定义的集合
定义枚举变量: enum{FALSE = 0, TRUE = 1} EnumName;
因为枚举变量类型较长,所以通常用typedef更改变量类型名
引用枚举成员: EnumName = FALSE; EnumName = TRUE;
注意:枚举的值也可以赋值给别的变量;枚举只能赋值字符串,直接赋值会警告