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 烧录工具软件和硬件
- 对于电脑来说,有三类存储器 ROM( read-only memory,在操作系统还没有从外部存储器进驻到内存之前,存储了负责整个系统自检,引导操作系统进入内存,还要外设的驱动灯的代码)、 RAM( random-access memory, 内存)、外部存储器( 比如固态硬盘或者机械硬盘)。
- 类比单片机,它更像是电脑中的芯片,因此没有外部存储,但是 芯片内部有 ROM 和 RAM。RAM当然和电脑功能一样,都是为程序运行提供空间,但是用户要执行的代码就只能写入ROM中,这就叫烧录。因为是 只读存储器,这就自然会有两个特点:断电不会丢失;一般情况下,芯片运行时不能改变。
- 查询芯片官网提供的烧录工具,下载下来发现型号中没有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 确定一下收发模块的电气特征和基本知识
(关于无线发射模块,我打算挖个坑,有空自己实现)
-
发射器有 data vcc gnd, 接收端有 vcc data data gnd。
-
通过data引脚发射和接收高低电平
-
透明传输(发射高电平输出高电平,发射低电平输出低电平
下面来看透明传输的过程:
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电气特征
-
整个系统,唯一的外观指示,其实只有这一个白发翠绿3mmLED灯。使用万用表测量,内阻约63欧姆。
-
查询数据手册如下,得知,导通压降为 3.0 -3.2V, 工作电流为 20 mA
-
为什么给定电压的同时还要给定电流: 因为 led不是完全内阻元件(还要发光), 并不遵循欧姆定律,所以给定压降的同时,还要表明能通过的电流)
-
3.0-3.2V是不是它的工作电压范围: 不是!是说由于制造工艺的差别,有的led有电流通过会产生电压降低,有的会产生3.2V的电压降低

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

可以看到,电压微小的变化,会引起电流的急剧变化(斜率大的地方)。
-
因此限流电阻非常有必要,限流电阻最重要的作用,在于创造一个负反馈系统,使得电流恒定。 在没有串联限流电阻之前,led发热会导致内阻减少,导致同样的电压,带来更大的电流,进一步加入温度升高,内阻减少,最后的结果就是超过工作电流,烧毁led;一旦串联一个电阻,那么电流增大,导致电阻分压增大,那么led电压就会降低,反过来遏制led电流减少,从而保护led。
-
那么如何选择串联的限制电阻呢?假设电源电压Vcc, led电流为 L_led,压降为 V_led,那 电阻 =( Vcc - V_led ) / L_led。
在这里,我们整个系统的电压只是3V,可以计算得到 电阻 = 0欧姆,但是问题就在于电压标称的三伏,在实际中可以会上下浮动0.2V,这非常常见,而我们为了防止led烧坏,可能要对电压因此不需要串联了
0.2/20ma = 10 欧
挖坑。。。。,这部分分析有问题,可能需要单开一章节)
-
另外要注意,单片机 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 警告解除之后,其他各项居然都很顺序,算是这么多年来,最顺利的一次实验。