如何使用C#生成驱动LED的2Hz高低电平交替方波
C# 实现LED输出2Hz方波方案
2Hz方波的周期为1/2=500ms,只需让高低电平各保持250ms切换一次即可,不需要额外嵌套for循环,靠主循环+定时切换就能实现持续输出直到手动停止。
实现注意事项
- 操作树莓派/ARM类硬件时,直接引用
System.Device.GpioNuGet包即可完成GPIO操作 - 不要写无延时的死循环,会占满单核心CPU资源,必须添加和方波周期匹配的延时逻辑
- 物理按钮检测要加防抖处理,避免电平跳变导致的误触发
完整可运行代码示例
using System; using System.Device.Gpio; using System.Threading; class LedSquareWaveProgram { // 全局程序运行状态标记 private static bool _programRunning = true; // 按自己实际接线修改GPIO引脚编号 private const int LedPin = 18; private const int ButtonPin = 2; private static GpioController _gpioController; static void Main(string[] args) { _gpioController = new GpioController(); // 初始化LED引脚为输出模式,按钮引脚为上拉输入模式 _gpioController.OpenPin(LedPin, PinMode.Output); _gpioController.OpenPin(ButtonPin, PinMode.InputPullUp); // 捕获控制台退出信号,按下Ctrl+C即可手动停止程序 Console.CancelKeyPress += (sender, eventArgs) => { _programRunning = false; eventArgs.Cancel = true; }; Console.WriteLine("程序运行中,按下按钮输出2Hz方波,按下Ctrl+C退出程序"); while (_programRunning) { // 读取按钮状态+10ms防抖 bool isButtonPressed = _gpioController.Read(ButtonPin) == PinValue.Low; Thread.Sleep(10); if (isButtonPressed && _gpioController.Read(ButtonPin) == PinValue.Low) { // 高低电平各保持250ms,刚好组成500ms周期的2Hz方波 _gpioController.Write(LedPin, PinValue.High); Thread.Sleep(250); _gpioController.Write(LedPin, PinValue.Low); Thread.Sleep(250); } else { // 按钮未按下时关闭LED _gpioController.Write(LedPin, PinValue.Low); Thread.Sleep(10); } } // 退出前释放GPIO资源 _gpioController.Write(LedPin, PinValue.Low); _gpioController.ClosePin(LedPin); _gpioController.ClosePin(ButtonPin); _gpioController.Dispose(); Console.WriteLine("程序已停止"); } }
逻辑说明
和你最初的实现思路完全匹配,仅做了生产可用的细节补全:
- 主循环保持判断程序运行状态,每次循环先读取按钮输入
- 按钮按下的分支里每次完成一次高低电平切换+对应延时,循环往复就会自动生成连续方波,松开按钮立刻停止输出
- 自带资源释放逻辑,程序退出时不会残留引脚电平异常
内容的提问来源于stack exchange,提问作者SWman88
相关产品推荐
相关产品推荐

