从stc8g1k08+433MHZ无线点亮led 到stc8k1k17+433MHZ唯一配对并点亮小灯(过程&问题&总结)

1 stc8g1k08 + 433MHZ 无线点亮小灯

1.1 目标

发射器( stc8g1k08 + 433MHZ) 通路后,发射信号,使得接收器( 433MHZ + stc8g1k08 + led ) 中的小灯点亮。只要接收到发射信号就点亮,持续到 接收器 断电复位。

1.2 准备

无论是发射器还是接收器,核心都是单片机,因此必须要明白 stc8g1k08的电气特征。因此,我们首先要找到数据手册,首先找到芯片的成产厂家网址:
https://www.stcaimcu.com/,在其中就可以找到stc8g1k08的sop-8封装的基本电气特征,sop-8封装的引脚图,以及之外的其他部件的电气特征

1.2.1 stc8g1k08基本电气特征:(数据手册可查)

我关心的如下:(从重到轻)

工作电压: 1.9V ~ 5.5V (这意味着小体积的纽扣电池就可以带动)

工作温度: -40C ~ 85C

Flash存储器大小: 8K (用来存放用户代码,因为我的逻辑目前不复杂,这些容量够了,甚至还能满足后续扩展开发)

GPIO: 最多可达 6 个 GPIO:P3.0P3.3、P5.4P5.5。均支持如下 4 种模式:准双向口模式、强推挽输出模式、开漏模式、高阻输入模式( 推挽模式用来驱动射频模块,准双向模式用来发送/接收 信号)

封装:SOP8,DFN8(3mm*3mm)(确定尺寸)

1.2.2 烧录工具软件和硬件

  1. 对于电脑来说,有三类存储器 ROM( read-only memory,在操作系统还没有从外部存储器进驻到内存之前,存储了负责整个系统自检,引导操作系统进入内存,还要外设的驱动灯的代码)、 RAM( random-access memory, 内存)、外部存储器( 比如固态硬盘或者机械硬盘)。
  2. 类比单片机,它更像是电脑中的芯片,因此没有外部存储,但是 芯片内部有 ROM 和 RAM。RAM当然和电脑功能一样,都是为程序运行提供空间,但是用户要执行的代码就只能写入ROM中,这就叫烧录。因为是 只读存储器,这就自然会有两个特点:断电不会丢失;一般情况下,芯片运行时不能改变。
  3. 查询芯片官网提供的烧录工具,下载下来发现型号中没有stc8g1k08,估计是太过时了,我们选择老版本,地址如下:
    https://gitcode.com/open-source-toolkit/fddca/?utm_source=tools_gitcode&index=top&type=card&uuid_tt_dd=10_18845751540-1737449495530-454243&from_id=143012165&from_link=81737eac45807a291bbe91dbb7fdbf4c
    硬件方面,主要使用的CH034模块,USB转串口(电脑 写入 单片机)

1.2.3 sop-8引脚图和最小系统示意图, 稍微注意一下,要并联大小两个电容,大的要在前面,对电源去噪。

1F = 1000mF = 1000000uF = 1000000000 pF = 1000000000000nF (毫微纳皮, how nappy)

1.2.4 确定一下收发模块的电气特征和基本知识

(关于无线发射模块,我打算挖个坑,有空自己实现)

  1. 发射器有 data vcc gnd, 接收端有 vcc data data gnd。

  2. 通过data引脚发射和接收高低电平

  3. 透明传输(发射高电平输出高电平,发射低电平输出低电平
    下面来看透明传输的过程:
    3.1 准备数据:单片机要发送数据 0 1 0 1 1 0。
    3.2 产生基带信号:3V单片机引脚输出对应的固定电平:

    复制代码
     			 0 -> 0V
         		 1 -> 3V
       			 0 -> 0V
         		 1 -> 3V
         		 1 -> 3V
         		 0 -> 0V 

上面是一个标准的 数字方波, 其频率(波特率)可以决定传输的速度。

3.3 确定载波:一个频率非常高的纯正弦波(例如 433MHz 或 2.4GHz),它只是"搬运工"。我这里的 发射模块,使用的就是 433MHZ 的载波当作搬运工。

3.4 进行调制:用 基带信号(方波) 去控制 载波(高频正弦波) 的幅度(ASK)、频率(FSK)或相位(PSK),将信息"装载"到载波上。

3.5 最后发射:将这个调制后的射频信号通过天线发射出去。

3.6 当然,接收就是相反的过程,当然收发系统不同电压,可能需要一套电平转换来确定哪些是高电平,哪些是低电平。我这套模块已经配置好了,这里我们还是全部都使用3V供电,来保证标准一致。另外,查询数据手册,我这个是 ASK调制.

1.2.5 led电气特征

  1. 整个系统,唯一的外观指示,其实只有这一个白发翠绿3mmLED灯。使用万用表测量,内阻约63欧姆。

  2. 查询数据手册如下,得知,导通压降为 3.0 -3.2V, 工作电流为 20 mA

  3. 为什么给定电压的同时还要给定电流: 因为 led不是完全内阻元件(还要发光), 并不遵循欧姆定律,所以给定压降的同时,还要表明能通过的电流)

  4. 3.0-3.2V是不是它的工作电压范围: 不是!是说由于制造工艺的差别,有的led有电流通过会产生电压降低,有的会产生3.2V的电压降低

  5. 另外一个需要注意的事实是,led并不是一个 纯粹的 电阻元件,后者电压和电流的关系可以被认为是线性的,但是led 伏安曲线非常陡峭,下图展示了两种led的伏安曲:

    可以看到,电压微小的变化,会引起电流的急剧变化(斜率大的地方)。

  6. 因此限流电阻非常有必要,限流电阻最重要的作用,在于创造一个负反馈系统,使得电流恒定。 在没有串联限流电阻之前,led发热会导致内阻减少,导致同样的电压,带来更大的电流,进一步加入温度升高,内阻减少,最后的结果就是超过工作电流,烧毁led;一旦串联一个电阻,那么电流增大,导致电阻分压增大,那么led电压就会降低,反过来遏制led电流减少,从而保护led。

  7. 那么如何选择串联的限制电阻呢?假设电源电压Vcc, led电流为 L_led,压降为 V_led,那 电阻 =( Vcc - V_led ) / L_led。

    在这里,我们整个系统的电压只是3V,可以计算得到 电阻 = 0欧姆,但是问题就在于电压标称的三伏,在实际中可以会上下浮动0.2V,这非常常见,而我们为了防止led烧坏,可能要对电压因此不需要串联了

    0.2/20ma = 10 欧

    挖坑。。。。,这部分分析有问题,可能需要单开一章节)

  8. 另外要注意,单片机 IO口,并不是只有高低电平,有的时候也会有细微漏电流通过。电流强度在单片机内部是一个连续变化的量,如何选择一个合适的模式,使得led完全受控于写入的01代表的高低电压带来的电流强度上,是一个很重要的事情。

    查询 stc8g1k08 输出模式的电气特征,如下:

    需要注意的是,这里应该是5V下的表现。但是没事毕竟我们知道 推挽模式,基本上就是提供电源电压(毕竟mos管连通了此时,有疑惑请看上一篇博文),符合改led的工作电压。

1.3. 发射器模块

1.3.1 原理图如下: (其实后续还需要一个稳压模块,这里用了LR44电池来提供 4.5V电压)

1.3.2 烧录代码

c 复制代码
#include "STC8G.H"
void main(void)
{
    // 设置为推挽输出
    P5M0 = 0x10;  // 0001 0000 - 设置P5.4为推挽输出
    P5M1 = 0x00;

    // 让P5.4输出高电平并保持
    P54 = 1;

    while(1);
}

1.4 接收器模块

1.4.1 原理图如下:(也需要一个稳压模块)

1.4.2 烧录代码

c 复制代码
#include "STC8G.H"
#include <intrins.h>

// 引脚定义
#define INPUT_PIN  P54   // 信号输入引脚 (P5.4)
#define OUTPUT_PIN P55   // 信号输出引脚 (P5.5)

// 状态标志
bit signal_detected = 0;

void main(void)
{
    // 初始化IO口模式
    // P5.4设置为输入模式(准双向或高阻输入)
    P5M0 &= ~0x10;  // 清除P5.4的推挽设置
    P5M1 &= ~0x10;  // 设置为准双向模式
    
    // P5.5设置为推挽输出
    P5M0 |= 0x20;   // 设置P5.5为推挽输出
    P5M1 &= ~0x20;
    
    // 初始状态:输出低电平
    OUTPUT_PIN = 0;
    
    while(1)
    {
        // 检测P5.4输入引脚
        if(INPUT_PIN == 1)
        {
            // 检测到高电平信号
            if(!signal_detected)
            {
                signal_detected = 1;  // 设置标志位
                OUTPUT_PIN = 1;       // P5.5输出高电平
            }
        }
        else
        {
            // 输入为低电平,可选的复位逻辑
            // 如果希望信号消失后停止输出,取消下面注释:
            // signal_detected = 0;
            // OUTPUT_PIN = 0;
        }
        
        // 简单延时,防止检测过于频繁
        _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
    }
}

1.5 最后结果

1.6 问题

编写代码的时候没有正确地将 main.c 添加入 源工程,导致失去一部分头文件,产生了两个警告,最终导致发射模块的推挽模式没有正常启动,做led实验时候,没有成功点亮led。在双击 源工程后,正确地添加main.c 警告解除之后,其他各项居然都很顺序,算是这么多年来,最顺利的一次实验。

1.7 后续改进方向。

1.7.1 电源是否要加入一个稳压模块?ht7330,可能可以上一个,(主要是便宜,有用概率在便宜面前,简直没有抵抗力)

1.7.2 led电源的限流电阻到底要不要加入,加多大的?

相关推荐
mc23564 小时前
STM32F103C8T6--定时器
stm32·单片机·嵌入式硬件
会编程是什么感觉...5 小时前
算法 - PEC校验
单片机·算法
清风6666666 小时前
基于单片机的全自动洗衣机控制器设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
帅帅兔子8 小时前
2.4寸SPI串口ILI9341芯片彩色LCD驱动
stm32·单片机·嵌入式硬件·mcu
蓝天居士9 小时前
PY32F040单片机介绍(1)
单片机·国产mcu·1024程序员节
柒月玖.11 小时前
基于AT89C52单片机的计算器设计与仿真
单片机·嵌入式硬件
乐十九11 小时前
物模型详解
嵌入式硬件
czhaii12 小时前
STC32G144K246,高速PWM@240Mhz 运行测试
stm32·单片机·fpga开发
炸膛坦客12 小时前
Cortex-M3-STM32F1 开发:(十一)ARM Cortex-M 内核中的 MPU 和 FPU
arm开发·stm32·嵌入式硬件