51单片机注意事项

下面的51均指的是STC89C52RC芯片,别的51是否也是这样有待验证 io相关注意事项 51在读取io时需要设置io口为高电平,然后再读取 8051(包括 STC89C52RC)的 I/O 口是开漏(open-drain)输出而非推挽(push-pull)输出。 开漏输出只能主动驱动低电平(0),不能主动驱动高电平(1)。要实现高电平,开漏输出需要通过外部的拉升电阻(通常连接到电源 VCC)实现。这也就是为什么在使用开漏输出的 GPIO 引脚时,你需要首先将它设置为高电平,然后才可以正确读取输入的低电平。 相比之下,推挽输出可以主动驱动低电平和高电平。这就使得在使用推挽输出时,不需要首先设定为高电平来正确读取低电平。 这就是为什么你在使用 STC89C52RC 或者其他 8051 系列的微控制器时,必须首先将引脚设为高电平,只有这样,你才能正确地读取被设为低电平的输入。因此,理解开漏和推挽输出的区别对于理解这个问题是非常重要的。每种类型的输出方式都有其优缺点,需要根据具体应用来选择。 内置EEPROM 在写入前需要先擦除 原因是内部的EEPROM是用Flash来做的,由于Flash的物理性质,只能从1变0,不能从0变1,所以先要擦除为0xFF, 然后在写入相应的数据,注意擦除是按扇区来擦除的 Flash存储器使用了浮动栅层的原理来存储数据,在晶体管中存储了电荷量,代表了0或1的状态。当需要将存储单元从1改为0时,可以通过施加适当的电压,将电荷从浮动栅层中移除,使得晶体管的导通特性被改变为阻断状态,表示0。 然而,将存储单元从0改为1是不可行的,因为在Flash存储器中,写入操作是通过电子隧穿来实现的。当试图将存储单元从0改为1时,需要将电子引入浮动栅层。但是,由于浮动栅层与控制栅层之间的绝缘层,电子无法通过正常的电子隧穿过程引入到浮动栅层中,因此无法实现将0写成1的操作。 为了将存储单元从0改为1,需要执行擦除操作。擦除会将整个存储单元中的电荷移除,将其重置为初始状态,通常是全1。然后再通过编程操作将所需的位写入为1。 由于擦除操作会擦除整个存储单元的数据,而不是单个位或字节,因此对Flash存储器进行写入操作时,通常需要将整个存储块或页擦除,然后再编程所需的位。这种擦除和编程的特性使得Flash存储器在数据写入方面有一定的限制和特殊性。 LCD1602异常 是否是每个阶段的延迟不够 调高延迟试一下是否正常 多写一些字符 如果出现屏幕位置不同,可能是算法问题 乱码(比如全屏写'1’,但是显示的是其他内容) 可能是虚焊 判断方法: 写一个程序,使io口高低电平切换,如果使用示波器可以间隔短点间隔时间, 如果使用万用表让间隔长一点比如5s切换一次电平 使用示波器或者万用表分别测量每个io对应的LCD接口,看是否有电平切换, 可以判断接口是否异常 再看芯片对应异常的io引脚如果输出是正常,则说明虚焊,如果引脚输出异常,则可能是芯片坏了

2023-07-27 16:14:07    |    1 分钟    |    38 字    |    Fengbin

三极管集电极电流产生原理

三极管作为一种重要的半导体器件,其集电结反向偏置时表现出的导电性违背了PN结的传统认知,这一现象的原因一直令人感到好奇。在本文中,笔者将通俗解释三极管反向偏置下集电结仍可导电的科学机理。 我们知道,PN结反向偏置时,少数载流子形成的漏电流非常微弱。但三极管的情况则完全不同,反向偏置的集电结也会产生明显的集电电流Ic。这主要归因于三极管独特的内部结构。 需要强调的是,这种反向偏置下的电流并非由反向击穿产生,而是有别于PN结的全新机理。三极管通过基极控制发射极附近的电子浓度。当基极电流注入电子时,发射极区域会聚集大量电子。这些电子可以跨越集电结的反向势垒,形成显著的反向漏电流。随着基极电流增大,发射极电子浓度提高,反向漏电流Ic也随之增加。 可以看出,三极管反向偏置下集电结的导电性,是由基极注入产生的大量电子引起的。这种机理完全不同于PN结中仅依赖少数载流子的反向漏电流。正是三极管的独特结构及工作原理导致了反向偏置下也存在明显Ic的现象。 值得注意的是,PN结在正向偏置时,电流主要由多数载流子形成;而反向偏置时,则由少数载流子形成微弱的电流。三极管反向偏置下Ic的产生,则利用了基极注入的大量电子,从电流形成机理上破除了PN结的限制。 通过解析三极管反向偏置导通的科学机理,我们加深了对其工作原理的理解。这也展示了半导体器件的奥秘比单纯PN结更为复杂。希望本文能够满足读者对这个有趣现象的好奇心,并成为理解半导体物理的一个窗口。 注意: 在严格意义上说PN并不能单向导电,我们所说的单向导电只是因为反向电流非常微弱 PN结在正向偏置时,电流主要由多数载流子形成;而反向偏置时,则由少数载流子形成微弱的电流

2023-07-19 16:43:28    |    1 分钟    |    9 字    |    Fengbin

复位电路电容选择

${T = R C}$ 变换为 ${C = \frac T R }$ 其中T为时间 R为电阻 C为电容 以1ms复位时间来算, 如果电阻选10kΩ那么 $C = \frac {0.001s} {10000Ω} = 100nF$

2023-06-08 11:06:21    |    1 分钟    |    23 字    |    Fengbin

外部中断和定时器

都说学习硬件是学习计算机组成原理的快速途径,我也入坑了,这里记录一些学习中初学者可能感觉难受的难点 一个MCU就好比一个很复杂的函数,他需要两种初始化,一种就是硬件初始化(也就是最小系统+外设电路), 一种是软件初始化(设置寄存器来使用某些功能) 中断 其实也没什么难的,难的是和GPIO那种简单方式的对比,都是固定套路 中断套路 编写好中断处理函数 设置触发方式(低电平触发或者下降沿触发) 开启某一中断 开启总中断 定时器 套路 设置定时器模式 设置定时器初值 开启定时器 (到目前定时器已经可以使用了) 定时器中断开启 (如果还想定时中断的话,需要剩下3,4两步) 总中断开启 中断优先级可以进行调整

2023-06-06 11:09:27    |    1 分钟    |    20 字    |    Fengbin

数据库中排序的一些想法

数据库中很多时候要有排序字段作为排序依据,有时候还会对排序进行调整,常见的我们会加一个xx_sort字段,从1开始的一个排序,那样如果我们把最后一个元素排到第一时会导致每个记录中排序都要进行+1操作,需要操作很多记录;那有没有一种方法可以只修改被调整的那一条记录或者减少更改记录的次数. 今天想到一个方法,在给排序字段赋值的时候,不是按照+1的方式递增,而是以一个间隔递增比如 id order 1 1 2 1001 3 2001 4 3001 在每次调整顺序时,比如把4调整到1和2之间, 那么就在(1,1001)区间范围内随机找到一个值(或者取中间值),赋给4这种情况下只需要调整一次就可以了. 那么如果上面的结果变成这样了, 3想要移动到1和4之间怎么办 id order 1 1 4 2 2 1001 3 2001 和上面一样现在(1,2)区间随机(或者取中间值),发现不能找到一个值,那么就需要一个策略,把后面的一部分数据进行分散. 分散策略比如:按顺序找到后面一条间距大于多少的(比如1000)数据,然后把这几条数据按总间距平均分配一下,或者更简单粗暴的,如果遇到无法插入的值,就把后面的数据重新安排一下,都按初始间隔重新赋值 只要合理的设置间隔,就能达到在大多数情况下都能只修改一条记录 注意: 设置间隔可能需要考虑最多能容纳多少元素,还有字段类型所能容纳的最大值

2023-06-02 10:18:35    |    1 分钟    |    31 字    |    Fengbin

service中的几种port的区别

port : service暴露的端口,可以在集群内进行访问 nodePort : 可以在集群外访问service的端口 targetPort : pod内的container暴露的端口 一张图来理解

2023-05-22 15:00:31    |    1 分钟    |    10 字    |    Fengbin

k8s 几种探针作用和用法

在 Kubernetes 中,探针(probes)是一种机制,用于检查容器是否处于正常状态以及容器是否可以接收流量。 Kubernetes 提供了三种类型的探针:存活探针(Liveness Probe)、就绪探针(Readiness Probe)和启动探针(Startup Probe)。 以下是这三种探针的作用和用法: 存活探针(Liveness Probe) 作用:检查容器中的进程是否仍在运行。如果进程崩溃或停止响应,Kubernetes 将重启容器。 用法:建议在容器的生命周期中始终使用存活探针,以确保容器的可靠性。例如,可以配置一个存活探针来检查容器中的进程是否响应 HTTP 请求或 ping 命令。 示例 YAML 配置: livenessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 5 periodSeconds: 10 该配置文件指示 Kubernetes 发送一个 HTTP GET 请求到容器的 /healthz 路径,并在容器启动后的 5 秒后开始检查容器的运行状况。检查频率为每隔 10 秒发送一次。 就绪探针(Readiness Probe) 作用:检查容器是否准备好接收流量。如果容器尚未准备好接收流量,则 Kubernetes 将不会将流量发送到容器。 用法:建议在容器需要一些额外的时间来启动的情况下使用就绪探针。例如,可以配置一个就绪探针来检查容器是否存在必需的文件或数据库连接。 示例 YAML 配置: readinessProbe: tcpSocket: port: 8080 initialDelaySeconds: 5 periodSeconds: 10 该配置文件指示 Kubernetes 检查容器是否可以在 8080 端口接收 TCP 连接,并在容器启动后的 5 秒后开始检查容器的运行状况。检查频率为每隔 10 秒发送一次。 启动探针(Startup Probe) 作用:检查容器内部应用程序是否已经启动,成功后会运行存活和就绪探针。与存活探针和就绪探针不同,它们在容器启动时运行,并在容器启动完成后禁用。 用法:建议在容器启动时需要启动较长时间的应用程序时使用启动探针。例如,可以配置一个启动探针来检查容器中的某个进程或 Web 服务器是否已经启动。 ...

2023-05-12 11:03:18    |    1 分钟    |    107 字    |    Fengbin

在WSL中配置gitlab/github SSH KEY

背景 在公司里普遍使用搭建的gitlab,很多情况下我们使用终端提交,这时候就会频繁的数据账户和密码,为了不输入密码我们会配置SSH KEY来免登录. 步骤 使用ssh-keygen 来生成公钥和私钥 使用ssh-keygen -t ed25519 或者 ssh-keygen -t rsa -b 2048 没什么特别的一路回车 这时候会在你~/.ssh/目录下生成密钥对 以rsa密钥为例,把~/.ssh/id_rsa.pub的内容配置到gitlab 测试使用ssh git@gitlab.xxx.com(你公司的域名)看下是否正常打印你的配置名称,如果不正常使用ssh -Tvvv git@gitlab.xxx.com打印调试信息,看是哪个地方出了问题 已经可以正常提交代码 可能出现的问题 ssh连接没问题,但是git会提示输入用户密码 这种情况看下自己仓库是否使用的是http连接, 如果是替换ssh链接就可以解决git remote set-url origin git@xxx.com:username/blog.git 使用go来拉取包时如果使用http地址拉取怎么办 可以使用Git提供的凭证存储器来配置HTTP协议的自动登录,Git提供了三种凭证存储器,分别是cache、store和osxkeychain。不同的存储器有各自的优缺点,例如cache存储器将凭证信息保存在内存中,store存储器将凭证信息保存在本地的plain-text文件中,osxkeychain存储器则将凭证信息保存到Mac的Keychain应用程序中. 可以使用git config --global credential.helper store来配置,然后随便拉取一个该域名的项目,输入账号密码就会存储到本地,后面就不会再要求输入用户密码

2023-05-08 14:24:08    |    1 分钟    |    38 字    |    Fengbin

go 编译指令build

go:build 是 Go 1.17 版本中引入的一个构建标记,用于根据不同的条件控制代码的编译。go:build 格式如//go:build <标记表达式>, 1.17之前使用+build的方式,这里我们介绍更强大的的go:build. 表达式可以包含由 ||、&& 和 ! 运算符和括号组合的选项,含义与 Go 语言中相同. 构建约束可以出现在任何类型的源文件中(不仅仅是 Go 文件),但是它们必须出现在文件的顶部附近,仅由空行和其他行注释分隔。这些规则意味着在 Go 文件中,构建约束必须出现在包声明之前。 例如,下面的构建约束将约束一个文件在满足“linux”和“386”约束条件或在满足“darwin”条件且未满足“cgo”条件时进行构建://go:build (linux && 386) || (darwin && !cgo) 自定义tag //go:build atest 当我们使用go build -tags atest的情况下会编译此文件,否则不会编译 控制go版本 //go:build go1.17 指定当前文件>=go1.17才编译 //go:build go1.17 && go1.20 版本>= go1.17 并且<= go1.20

2023-03-07 10:50:47    |    1 分钟    |    47 字    |    Fengbin

Intel hex文件格式

Intel HEX格式文件是一种常见的用于表示程序存储器内容的文本格式,常用于将程序存储器内容导出或者导入到不同的开发工具中。它的文件扩展名通常是 .hex。 该文件格式由一系列行组成,每一行以冒号(:)开头,以回车换行符(\r\n)结尾,每一行包含以下几个部分: 起始符号:一个字符,表示该行的起始,必须为“:”。 数据长度:一个字节,表示该行所包含的数据长度,以字节为单位,范围从 0 到 255。 起始地址:两个字节,表示该行数据在存储器中的起始地址,以字节为单位,高位在前,低位在后。 记录类型:一个字节,表示该行数据的类型。常见的记录类型包括数据记录(00)、结束记录(01)等。 数据:一个或多个字节,表示该行的数据内容。数据的长度由数据长度字段指定。 校验和:一个字节,表示该行数据的校验和,为数据长度、起始地址、记录类型和数据的按位异或和的补码。 例如 :10010000214601360121470136007EFE09D2190140 //起始符号是“:”。 //数据长度是“10”。 //起始地址是“0100”。 //记录类型是“00”,表示这是一个数据记录。 //数据部分包含了16个字节的数据:“214601360121470136007EFE09D21901”。 //校验和是“40”。 //这个数据记录包含了16个字节的数据,它们对应的起始地址是0x0100~0x010F。每两个字节表示一个数据,因此这个记录实际包含了8个数据,分别是“21 46 01 36 01 21 47 01 36 00 7E FE 09 D2 19 01”。 :00000001FF //起始符号是“:”。 //数据长度是“00”。 //起始地址是“0000”。 //记录类型是“01”,表示这是一个结束记录。 //数据部分为空。 //校验和是“FF”。 //这个记录表示文件结束。当解析Intel HEX格式文件时,如果读到了一个记录类型为“01”的记录,就表示已经读到了文件的结尾,应该停止解析。 记录类型 在Intel HEX格式文件中,一共定义了5种记录类型。它们分别是: 数据记录(Data Record),记录类型为“00”。 结束记录(End Of File Record),记录类型为“01”。 扩展段地址记录(Extended Segment Address Record),记录类型为“02”。 扩展线性地址记录(Extended Linear Address Record),记录类型为“04”。 起始段地址记录(Start Segment Address Record),记录类型为“03”。 其中,最常用的是数据记录和结束记录。其他三种记录类型则用于更高级的应用,如程序跳转、内存分段等。 举例: 数据记录(Data Record)::10010000214601360121470136007EFE09D2190140 这是一条16字节的数据记录,其记录类型为“00”。数据部分为“214601360121470136007EFE09D21901”。 ...

2023-02-27 16:45:45    |    1 分钟    |    141 字    |    Fengbin