找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13782|回复: 37
打印 上一主题 下一主题
收起左侧

DIY单片机延时插座(STC15F104W+TM1637)支持延时断电和延时上电 源程序

  [复制链接]
跳转到指定楼层
楼主
大家好。今天我要分享的是一款DIY延时插座。延时插座并不是新东西,坛子里好几位前辈分享过类似制作。正是因为看到他们的作品,我才忍不住自己也做一个,这样才能真正锻炼自已。先上制作出来的成品图如下:



功能:
* 可选择延时断电或延时上电工作方式,在开机前操作黑色的小开关进行设置。
* 定时时间可设置范围:1分钟~99小时59分钟。
* 短按按键1分钟加1,长按按键1小时加1 ,在停止和启动状态下均可调整时间。
* 短按按键2启动定时,长按按键2复位。
* 使用继电器控制插座输出,250V电压下额定电流10A,建议实际使用不超过1kW。

为方便快速制作,本设计选用模块化零部件,主要模块包括单片机STC15F104W、220V转5V电源模块、TM1637四位时钟数码管模块、继电器模块等。全部材料均可在网上采购,总材料费用30元左右(含盒子和电源线)。

接线图:



实物内部结构:



分享经验:
* STC15F104W是一款非常方便实用的小单片机,8个脚的芯片除Vcc和Gnd外6个脚全是IO口,无须外部晶振和复位,供个电就能直接使用,实用是搞小制作的绝佳选择。
* TM1637数码管模块使用I2C通信,只占用两个IO口就行,而且程序非常简单,再也不用考虑常规数码管的刷新和消隐什么的。加载封装好的头文件即可轻松调用显示。
* 继电器选用了可硬件设置高低电平驱动的模块,我使用了高电平驱动。一开始输出高电平发现驱动不了,原来要把IO口设置为强推挽模式才能驱动。
* 因为单片机IO口数量限制,需要按键复用,这就引入了长按短按识别机制。我使用了10ms中断扫描一次按键状态,使用自己琢磨了一套长按短按机制,可能有点粗糙,但亲测好用。
* 一开始写的程序显示倒计时,是直接显示计时时间,比如倒计时剩不到1分钟时,数码管显示的是00:00,总感觉这样不科学。后来改为只要这一分钟的秒还没走到0,就仍算1分钟。比如只剩20秒时,仍显示00:01,只有倒计时结束剩0秒时,才显示00:00。程序作了相应修改实现了此功能。但总感觉还能写的更简练。。。
* 制作产品当然少不了一个好看的外壳。我经常在网上买防水塑料盒,各种规格都有,这个延时插座使用的盒子尺寸是158mm*90mm*40mm。盒子的切割钻孔也有技巧。工具方面电钻当然少不了,还有带倒钩的割刀也非常实用,盒子在小太阳前烘烤一下会更软更好切割。
* 这个延时插座没装输出电源指示灯,忘了。。。如有朋友也制作一个的话可以加上。

欢迎朋友们一起交流。

单片机源程序:
  1. /*********************************************/
  2. /*                     DIY延时插座                     */
  3. /*                     创建者 :sven                   */
  4. /*                     创建时间:2021/1/23             */
  5. /*********************************************/
  6. #include "STC15.H"
  7. #include "TM1637.H"
  8. #include "intrins.h"

  9. sbit key1=P3^0;                //按键1,时间设置:短按分钟+,长按小时+
  10. sbit key2=P3^1;                //按键2,短按启动,长按复位
  11. sbit key3=P3^2;                //开关按键3,切换延时断电/延时上电功能,只在开机时检测
  12. sbit relay=P3^3;        //继电器触发信号,硬件设置为高电平时线圈通电

  13. unsigned char mode=0;                //mode为工作模式0,1 分别表示停止模式和运行模式        
  14. unsigned char hour=0,minute=0,second=0,time_count=0;   //真实计时的时,分,秒,10ms计数器
  15. unsigned char show[6]={0,0,0,0,0,0}; //TM1637四位数码管显示数组:小时的十位和个位,分钟的十位和个位,最后两个为小时和分钟。
  16. unsigned int uiKeyTimeCnt1;   //按键1计数
  17. unsigned int uiKeyTimeCnt2;   //按键2计数

  18. bit ShortTouchFlag1=0;     //按键1短按按键有效标志
  19. bit LongTouchFlag1=0;      //按键1长按按键有效标志
  20. bit LongTouchRelease1=1;   //按键1长按释放过的标志
  21. bit ShortTouchFlag2=0;     //按键2短按按键有效标志
  22. bit LongTouchFlag2=0;      //按键2长按按键有效标志
  23. bit LongTouchRelease2=1;   //按键2长按释放过的标志
  24. bit delay_OnOff=0;                   //延时上电和延时断电选择位,开机检查Key3设置此位,0表示延时断电,1表示延时上电。
  25. bit flag_1s=1;                //秒任务标志位
  26. bit flag_500ms=1;        //半秒标志位
  27. bit stat_500ms=0;        //半秒状态位,控制时间冒号闪烁


  28. /******************************
  29. 函数说明:延时函数,STC_ISP软件给出 @6MHz 1T单片机
  30. 入口参数:us=延时微秒数
  31. 出口参数:无
  32. ******************************/
  33. void Delay_US(unsigned int us)
  34. {
  35.    while(us--)
  36.    {
  37.                 _nop_();
  38.                 _nop_();
  39.                 _nop_();
  40.                 _nop_();
  41.                 _nop_();
  42.                 _nop_();
  43.         }
  44. }

  45. /******************************
  46. 函数说明:定时器0初始化,12T自动重装模式,定时10毫秒
  47. ******************************/
  48. void Timer0Init(void)        //10毫秒@6.000MHz
  49. {
  50.         AUXR &= 0x7F;                //定时器时钟12T模式
  51.         TMOD &= 0xF0;                //设置定时器模式
  52.         TL0 = 0x78;                        //设置定时初值
  53.         TH0 = 0xEC;                        //设置定时初值
  54.         TF0 = 0;                        //清除TF0标志
  55.         TR0 = 1;                        //定时器0开始计时
  56.         ET0=1;                                //允许T0中断
  57.         EA=1;                                //开全局中断
  58. }

  59. /******************************
  60. 函数说明:按键短按长按检测
  61. ******************************/
  62. void Key_scan(void)                //在中断里调用,每10ms检查一次按键状态
  63. {
  64.         if(key1==0)                        //如果按键1按下
  65.         {
  66.             uiKeyTimeCnt1++; //累加按键计时
  67.         }
  68.         if(uiKeyTimeCnt1>200&&LongTouchRelease1==1)         //当按键超过2秒且此前释放过一次时
  69.         {
  70.                 LongTouchFlag1=1;         //长按标志位置1,用于长按2秒后立即处理长按动作
  71.                 LongTouchRelease1=0; //长按释放标志置0,表示长按未释放
  72.         }
  73.         if(key1==1)          //当按键松开(也可能是抖动弹开)
  74.         {
  75.                 if(uiKeyTimeCnt1>2&&uiKeyTimeCnt1<=200)         //只有大于20mS,且小于2秒,才判为短按
  76.                 {
  77.                         uiKeyTimeCnt1=0;        //清零按键计时
  78.                         ShortTouchFlag1=1;        //短按标志位置1
  79.                         LongTouchFlag1=0;        //长按标志位置0        
  80.                 }
  81.                 if(uiKeyTimeCnt1>200)        //如果松开按键时按键超过2秒,则为长按释放
  82.                 {
  83.                         uiKeyTimeCnt1=0;        //清零按键计时
  84.                         LongTouchRelease1=1; //长按释放标志位置1,表示长按已释放
  85.                 }        
  86.         }

  87.         if(key2==0)                  //如果按键2按下
  88.         {
  89.             uiKeyTimeCnt2++; //累加按键计时
  90.         }
  91.         if(uiKeyTimeCnt2>200&&LongTouchRelease2==1)          //当按键超过2秒且此前释放过一次时
  92.         {
  93.                 LongTouchFlag2=1;                //长按标志位置1,用于长按2秒后立即处理长按动作
  94.                 LongTouchRelease2=0;        //长按释放标志置0,表示长按未释放
  95.         }
  96.         if(key2==1)                  //当按键松开(也可能是抖动弹开)
  97.         {
  98.                 if(uiKeyTimeCnt2>2&&uiKeyTimeCnt2<=200)          //只有大于20mS,且小于2秒,才判为短按
  99.                 {
  100.                         uiKeyTimeCnt2=0;        //清零按键计时
  101.                         ShortTouchFlag2=1;        //短按标志位置1
  102.                         LongTouchFlag2=0;        //长按标志位置0        
  103.                 }
  104.                 if(uiKeyTimeCnt2>200)        //如果松开按键时按键超过2秒,则为长按释放
  105.                 {
  106.                         uiKeyTimeCnt2=0;        //清零按键计时
  107.                         LongTouchRelease2=1; //长按释放标志位置1,表示长按已释放
  108.                 }        
  109.         }
  110. }

  111. /******************************
  112. 函数说明:按键处理
  113. ******************************/
  114. void Key_process(void)
  115. {
  116.         if(ShortTouchFlag1==1)         //当按键1短按标志位为1时进行按键1短按处理
  117.         {
  118.                 ShortTouchFlag1=0;        //清除短按标志位
  119.                 minute++;                        //短按按键1的效果:分钟加1
  120.                 if(minute==60)                //如果设置分钟达到60分
  121.                         minute=0;                //将分钟清零
  122.                 if(second>0)                //以下将实际计时的小时和分钟转换为数码管显示的小时和分钟。比如计时还有00:00:20秒时,数码管显示的是00:01。
  123.                         show[5]=minute+1;  //只要秒不为零,则显示出来的分钟应该比实际计时的分钟加1
  124.                 else
  125.                         show[5]=minute;           //只有秒为零时,显示的分钟才和计时的分钟一致
  126.                 if(show[5]==60)                   //如果显示的分钟为60分,则显示的小时比实际计时的小时+1。
  127.                 {
  128.                         show[5]=0;
  129.                         show[4]=hour+1;
  130.                 }
  131.                 else
  132.                         show[4]=hour;           //如果显示的分钟比实际的加1后还不到60分钟,则显示的小时和计时的小时一致。
  133.                 show[0]=show[4]/10%10; //显示的小时十位数
  134.                 show[1]=show[4]%10;           //显示的小时个位数
  135.                 show[2]=show[5]/10%10; //显示的分钟十位数
  136.                 show[3]=show[5]%10;           //显示的分钟个位数                        
  137.                 TM1637_display(show[0],show[1],show[2],show[3],1); //显示定时时间。在按键调时状态下,时间的冒号固定显示不闪烁。
  138.         }
  139.         if(LongTouchFlag1==1)         //当按键1长按标志位为1时进行按键1长按处理
  140.         {
  141.                 LongTouchFlag1=0;        //清除长按标志位
  142.                 hour++;                                //按键1长按的效果:小时加1
  143.                 if(hour==100)                //如果设定的小时到100了
  144.                         hour=0;                        //小时清零。定时时间最高只能设定99小时59分钟。
  145.                 if(second>0)                //以下将实际计时的小时和分钟转换为数码管显示的小时和分钟,同上。
  146.                         show[5]=minute+1;
  147.                 else
  148.                         show[5]=minute;
  149.                 if(show[5]==60)
  150.                 {
  151.                         show[5]=0;
  152.                         show[4]=hour+1;
  153.                 }
  154.                 else
  155.                         show[4]=hour;
  156.                 show[0]=show[4]/10%10;        //显示的小时十位数
  157.                 show[1]=show[4]%10;                //显示的小时个位数
  158.                 show[2]=show[5]/10%10;        //显示的分钟十位数
  159.                 show[3]=show[5]%10;                //显示的分钟个位数               
  160.                 TM1637_display(show[0],show[1],show[2],show[3],1); //显示定时时间。在按键调时状态下,时间的冒号固定显示不闪烁。
  161.         }        
  162.         if(ShortTouchFlag2==1)        //按键2短按处理,在停止状态下短按为启动运行
  163.         {
  164.                 ShortTouchFlag2=0;        //清除短按标志位
  165.                 if(mode==0&&(minute>0||hour>0))         //只在停止状态下且设定了有效的定时时间,才能响应短按
  166.                 {
  167.                         mode=1;                        //短按的效果:启动定时
  168.                         relay=~delay_OnOff;         //开始定时后,根据开机时设定的延时断电或延时上电,继电器进行相应动作。如设定的是延时断电(delay_OnOff为0),启动后继电器应该先通电动作。
  169.                 }
  170.         }
  171.         if(LongTouchFlag2==1)        //按键2长按处理,长按为复位。在运行和停止状态下均可长按复位。
  172.         {
  173.                 LongTouchFlag2=0;        //清除长按标志位
  174.                 mode=0;                                //复位后状态为停止状态
  175.                 relay=0;                        //继电器释放
  176.                 hour=minute=second=0;        //计时时间清0
  177.                 TM1637_display(0,0,0,0,1);        //数码管显示时间00:00,时间冒号不闪烁
  178.         }
  179. }

  180. void main(void)
  181. {
  182.         P3M1&=~(1<<3);           //将继电器驱动脚P3.3设置为推挽输出
  183.         P3M0|=(1<<3);
  184.         relay=0;                   //继电器硬件选择为高电平驱动,开机后默认插座无电
  185.         delay_OnOff=key3;  //延时断电或延时上电选择。1:延时上电,0:延时断电。只在开机前操作Key3有效。
  186.         TM1637_display(0,0,0,0,1); //上电后默认显示00:00
  187.         Timer0Init();           //定时器T0初始化并启动
  188.         while(1)
  189.         {
  190.                 Key_process();          //调用按键处理函数
  191.                 if(flag_500ms==1)        //每500毫秒进行一次显示处理,主要是为了实现时间冒号的闪烁
  192.                 {
  193.                         flag_500ms=0;        //清除半秒标志位
  194.                         stat_500ms=~stat_500ms;         //时间冒号每秒亮灭一次
  195.                         if(mode==1)                //只在启动定时的状态下刷新显示时间
  196.                         {
  197.                                 if(second>0) //以下为将实际计时的时间转换为数码管显示的时间。比如定时还剩20秒时,数码管实际显示的是00:01。
  198.                                         show[5]=minute+1;
  199.                                 else
  200.                                         show[5]=minute;
  201.                                 if(show[5]==60)
  202.                                 {
  203.                                         show[5]=0;
  204.                                         show[4]=hour+1;
  205.                                 }
  206.                                 else
  207.                                         show[4]=hour;
  208.                                 show[0]=show[4]/10%10;         //显示的小时十位数
  209.                                 show[1]=show[4]%10;                 //显示的小时个位数
  210.                                 show[2]=show[5]/10%10;         //显示的分钟十位数
  211.                                 show[3]=show[5]%10;                 //显示的分钟个位数               
  212.                                 TM1637_display(show[0],show[1],show[2],show[3],stat_500ms);        //显示时间,冒号位是0还是1由stat_500ms确定,每半秒变化一次。
  213.                         }
  214.                         if(mode==1&&flag_1s==1)                 //以下为定时状态下更新计时时间,当秒任务标志位为1时进行倒计时
  215.                         {
  216.                                 flag_1s=0;         //清除秒任务标志位
  217.                                 if(second>0) //如果秒大于0,则减1秒
  218.                                 {
  219.                                         second--;
  220.                                 }
  221.                                 else if(minute>0) //如果秒等于0,则从分钟借位,分钟减1,秒变为59
  222.                                 {
  223.                                         minute--;
  224.                                         second=59;
  225.                                 }
  226.                                 else if(hour>0)          //如果秒和分钟都为0,则从小时借位,小时减1,分钟和秒都为59
  227.                                 {
  228.                                         hour--;
  229.                                         minute=59;
  230.                                         second=59;
  231.                                 }
  232.                                 else                          //如果时分秒都为0
  233.                                 {
  234.                                         mode=0;                  //倒计时结束,进入停止状态
  235.                                         relay=delay_OnOff;        //依据开机时设置的延时断电或延时上电,设置计时完成后的继电器状态。如果设置的是延时断电,计时到后继电器驱动为0。
  236.                                         TM1637_display(0,0,0,0,1);        //计时到后时间显示00:00,时间冒号不闪烁
  237.                                 }
  238.                         }
  239.                 }//半秒任务结束
  240.         }//while(1)结束
  241. }//main函数结束


  242. void time0(void) interrupt 1   //T0中断服务,每10ms响应一次
  243. {
  244.         time_count++;                 //计数加1
  245.         Key_scan();                         //每10ms扫描一次按键状态
  246.         if(time_count==50)         //每500ms时设置一次半秒标志位
  247.                 flag_500ms=1;
  248.         if(time_count==100)         //每1秒设置一次半秒标志位和秒任务标志位
  249.         {
  250.                 time_count=0;
  251.                 flag_500ms=1;
  252.                 flag_1s=1;
  253.         }  
  254. }
复制代码
完整程序可从附件下载。
DIY延时插座.rar (372.65 KB, 下载次数: 362)

评分

参与人数 3黑币 +130 收起 理由
老愚童63 + 15
luliang02003 + 15 赞一个!
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏49 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:848824 发表于 2021-1-25 16:24 | 只看该作者
感谢分享,很好用啊,哪天我也找个盒子装上
回复

使用道具 举报

板凳
ID:862648 发表于 2021-1-25 16:45 | 只看该作者
还是很实用的
回复

使用道具 举报

地板
ID:848824 发表于 2021-1-25 20:23 | 只看该作者
图是怎么画的真偏亮
回复

使用道具 举报

5#
ID:702386 发表于 2021-1-26 08:45 | 只看该作者
zhangleixbyl 发表于 2021-1-25 20:23
图是怎么画的真偏亮

图是先在AD中画好线路和元器件,然后在画图软件中贴上模块实物图并挪动线路对齐。有点混搭风格吧n :-)

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:620287 发表于 2021-1-30 22:24 来自手机 | 只看该作者
时间跑的太快了,数码管设定1分钟,实际上用30秒左右就结束了,如果要定时10分钟就要设定运行时间为20分钟才够10分钟
回复

使用道具 举报

7#
ID:702386 发表于 2021-1-30 22:48 | 只看该作者
22583596 发表于 2021-1-30 22:24
时间跑的太快了,数码管设定1分钟,实际上用30秒左右就结束了,如果要定时10分钟就要设定运行时间为20分钟 ...

烧录时选择时钟频率为6MHz。你可能默认选的是12MHz,当然要快1倍。
回复

使用道具 举报

8#
ID:815949 发表于 2021-3-22 22:28 | 只看该作者
楼主的设计不错,这个用在产品的测试很有用处,我之前做过一个可以控制三路的,用的是pic单片机实现的,但是我的继电器选用的是固态继电器,已经老化使用一年,相当稳定。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

9#
ID:848824 发表于 2021-3-24 11:03 | 只看该作者
什么画图软件画的,真牛
回复

使用道具 举报

10#
ID:702386 发表于 2021-3-25 18:09 | 只看该作者
zhangleixbyl 发表于 2021-3-24 11:03
什么画图软件画的,真牛

用Win10自带的画图软件画的。牛就谈不上了,就是有一点创意,结合了altium画的原理图和实物照片,看起来直观一点。
回复

使用道具 举报

11#
ID:456690 发表于 2021-3-26 20:49 | 只看该作者
按键长按短按检测程序写的好,学习了
回复

使用道具 举报

12#
ID:140489 发表于 2021-5-8 15:40 | 只看该作者
楼主代码是吴坚鸿的代码风格
回复

使用道具 举报

13#
ID:59830 发表于 2021-5-8 17:32 | 只看该作者
看了一下,挺好.
不过制作过程 安全问题有2点建议(做来用的):
1. 220V   继电器控制 单线火线,要三点插头 分清 火线, 或 改控制 双线继电器.
2.  5V 电源模块  热熔胶  遇到热融化,热熔胶与模块的间距大些,
回复

使用道具 举报

14#
ID:702386 发表于 2021-5-10 08:40 | 只看该作者
lids 发表于 2021-5-8 15:40
楼主代码是吴坚鸿的代码风格

我是初学者,不讲风格哈。代码能跑就行。
回复

使用道具 举报

15#
ID:702386 发表于 2021-5-10 08:42 | 只看该作者
yygdzjs 发表于 2021-5-8 17:32
看了一下,挺好.
不过制作过程 安全问题有2点建议(做来用的):
1. 220V   继电器控制 单线火线,要三点 ...

非常感谢宝贵建议!安全方面确实欠考虑了,继电器断开的时候仍可能存在火线有电的情况。
回复

使用道具 举报

16#
ID:892864 发表于 2021-6-16 00:05 | 只看该作者
我最近也想做一个,不过要比楼主做的简单
回复

使用道具 举报

17#
ID:424598 发表于 2021-7-18 14:35 来自手机 | 只看该作者
赞,比我早期做的好多了,论坛就需要这种新鲜血液。
回复

使用道具 举报

18#
ID:444215 发表于 2021-7-26 14:10 | 只看该作者
赞,也不错了,支持下,下载下来研究研究
回复

使用道具 举报

19#
ID:476415 发表于 2021-7-27 12:25 来自手机 | 只看该作者
没用过这种单片机,看介绍确实是适合DIY!!
回复

使用道具 举报

20#
ID:880987 发表于 2021-8-16 10:39 | 只看该作者
楼主,TM1637有按键扫描功能,支持2X8=16个按键扫描,节约单片机IO口
回复

使用道具 举报

21#
ID:961072 发表于 2021-8-18 11:55 | 只看该作者
新手前来学习一下~学学思路和程序
回复

使用道具 举报

22#
ID:15726 发表于 2021-12-19 22:01 | 只看该作者
我好象用过同款的盒子
回复

使用道具 举报

23#
ID:686536 发表于 2022-6-26 17:10 | 只看该作者
我想搞一个终于有个参考样了,感谢谢。
回复

使用道具 举报

24#
ID:292518 发表于 2022-7-4 17:27 | 只看该作者
新手前来学习一下~学学思路和程序
回复

使用道具 举报

25#
ID:1037212 发表于 2022-7-6 05:45 | 只看该作者
新手前来学习一下,从头开始。
回复

使用道具 举报

26#
ID:941129 发表于 2022-9-16 14:49 | 只看该作者
实用,好评
回复

使用道具 举报

27#
ID:941129 发表于 2022-9-16 15:04 | 只看该作者
编程用的是keil吗
回复

使用道具 举报

28#
ID:941129 发表于 2022-9-16 15:22 | 只看该作者
这个单片机我在keil4上没有找到,请问大神用什么软件编程
回复

使用道具 举报

29#
ID:507641 发表于 2022-9-21 09:26 | 只看该作者
贴近生活工作的应用与技巧,创新源自于生活工需求原来是真的
回复

使用道具 举报

30#
ID:1045132 发表于 2022-9-21 15:40 | 只看该作者
可以做定时器了
回复

使用道具 举报

31#
ID:849826 发表于 2022-12-12 11:01 来自手机 | 只看该作者
3523485271 发表于 2022-9-16 15:22
这个单片机我在keil4上没有找到,请问大神用什么软件编程

用51的头文件就可以
回复

使用道具 举报

32#
ID:491875 发表于 2022-12-12 12:46 | 只看该作者
不错的实用制作,图也很清晰。电源指示灯可以考虑使用一只双向LED,这样可以省略一只4007。
回复

使用道具 举报

33#
ID:833307 发表于 2023-7-19 14:56 | 只看该作者
能不能倒计时显示,以秒为单位
回复

使用道具 举报

34#
ID:200118 发表于 2023-12-21 18:14 | 只看该作者
很好,学习一下。。。
回复

使用道具 举报

35#
ID:372579 发表于 2023-12-22 21:06 | 只看该作者
不错不错,做一个玩玩
回复

使用道具 举报

36#
ID:67678 发表于 2023-12-24 10:17 | 只看该作者
不错不错,做一个玩玩
回复

使用道具 举报

37#
ID:316162 发表于 2023-12-27 07:47 来自手机 | 只看该作者
很好,值得学习,设计思路清晰,代码工整,关键是注释也清晰明了
回复

使用道具 举报

38#
ID:156094 发表于 2024-2-24 20:27 | 只看该作者
新手前来学习一下~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表