找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机红外遥控家电开关和电风扇PCB文件与源程序 带详细注释

  [复制链接]
跳转到指定楼层
楼主
分享一个红外遥控风扇和开关的PCB制作,还有程序控制

Altium Designer画的PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  1. /******************************************************************
  2. /* STC89C52单片机                                                 *
  3. /* 11.0592M晶振                                                         *
  4. /*程序用了外部中断0接收红外信号,IO口为P32                        *
  5. /*遥控OK键为关闭,在定时设置状态时为确认                          *
  6. /*遥控上、下键为档位加、减,在设置定时状态时为定时时间加、减,  *
  7. /*遥控V-键为进入设置定时模式                                      *
  8. /*右键为睡眠模式的开启与关闭,睡眠模式指定时时间到后自动切为1档 *
  9. /*遥控返回键为1档,遥控主页键为2档,遥控菜单键为3档,             *
  10. /*定时设置状态时,第二个数码管为小写H,设置完成后为大写H.          *
  11. /*最多定时8小时,99分钟内显示分钟倒计时                            *
  12. /******************************************************************/
  13. #include <reg52.h>
  14. #include <intrins.h>

  15. #define uchar unsigned char
  16. #define uint  unsigned int
  17. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  18. #define const_key_time1  20    //按键去抖延时的时间
  19. #define const_1s  440   //大概1秒钟所需要的中断数

  20. void delay_long(unsigned int uiDelaylong);
  21. void delay(uchar x);  //x*0.14MS
  22. void delay1(int ms);
  23. void T0_time();  //定时器0中断函数
  24. void key_service(); //按键服务的应用程序
  25. void key_scan(); //按键扫描函数,放在定时中断里
  26. void key_service1(); //关闭的应用程序
  27. void initial_myself(); //初始化单片机
  28. void initial_peripheral();//初始化外围
  29. void LCD_XSservice(); //数码管显示程序
  30. void display_drive(); //数码管字模驱动函数

  31. sfr ISP_CONTR=0xe7;       //软复位地址
  32. sbit IRIN = P3^2;         //红外接收器数据线,外部中断0
  33. sbit K1 = P2^0;           //按键1   
  34. sbit K2 = P2^1;           //按键2
  35. sbit K3 = P2^2;           //按键3
  36.                           //风量1档最小,3档最大
  37. sbit SC1 = P2^3;          //1档输出,控制PNP三极管,三极管再控制BT136双向可控硅
  38. sbit SC2 = P2^4;          //2档输出,控制PNP三极管,三极管再控制BT136双向可控硅
  39. sbit SC3 = P2^5;          //3档输出,控制PNP三极管,三极管再控制BT136双向可控硅
  40. sbit LED1 = P1^0;         //档位指示小灯1
  41. sbit LED2 = P1^1;         //档位指示小灯2
  42. sbit LED3 = P1^2;         //档位指示小灯3
  43. sbit LED4 = P1^3;         //睡眠模式指示小灯
  44. sbit LCD1 = P2^6;         //接PNP三极管控制定时显示数码管1的阳极(显示数码管为共阳管)
  45. sbit LCD2 = P2^7;         //接PNP三极管控制定时显示数码管2的阳极(显示数码管为共阳管)
  46.                           //定时显示数码管的八个阴极接P0



  47. uchar IRCOM[7];                 //定义红外接收数组
  48. uchar code Tab0[]=             //定义数码管数组,没有小数点
  49.       {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x89
  50.              };//0,1,2,3,4,5,6,7,8,9,h
  51. uint code Dingshi0[]=             //定义定时数组
  52.     {0,60,120,180,240,300,360,420,480
  53.                 };
  54. unsigned char ly_dis1;//定义显示缓冲区
  55. unsigned char ly_dis2;//定义显示缓冲区                                
  56. unsigned char ucKeySec=0;   //被触发的按键编号
  57. unsigned int uiKeyTimeCnt1=0; //按键1去抖延时计数器
  58. unsigned char ucKeyLock1=0; //按键1触发后自锁的变量标志
  59. unsigned int uiKeyTimeCnt2=0; //按键2去抖延时计数器
  60. unsigned char ucKeyLock2=0; //按键2触发后自锁的变量标志
  61. unsigned int uiKeyTimeCnt3=0; //按键3去抖延时计数器
  62. unsigned char ucKeyLock3=0; //按键3触发后自锁的变量标志
  63. unsigned char anjiank=0;   //有按键被触发
  64. unsigned char hw_anjiank=0;   //红外按键被触发
  65. unsigned char LCDSec=0;   //定时设置状态
  66. unsigned char LCDszxs=0;   //数码管定时的变量
  67. unsigned int DSSJ=0; //定时的时间
  68. unsigned char DSBZ=0;   //定时标志
  69. unsigned char iii=0;  //动态数码管定时显示变量
  70. unsigned char posit=0;//动态数码管扫描步骤
  71. unsigned int uiTimeCnt=0;  //倒计时的时间计数器
  72. unsigned int js1m=0;//计时秒
  73. unsigned char Guanbi=0;   //关闭标志
  74. unsigned char SMMS=0;   //睡眠模式标志
  75. unsigned char SMMSJK=0;   //睡眠模式监控
  76. /*******************************************************************/
  77. main()
  78. {   
  79.           initial_myself(); //初始化
  80.           delay_long(100);
  81.     initial_peripheral();//初始化外围
  82.   
  83.   while(1)        
  84.   {
  85.                   key_service1(); //关闭的应用程序
  86.       key_service();//按键服务的应用程序
  87.                   LCD_XSservice(); //数码管显示程序
  88.          }
  89.   }

  90. //end main
  91. /**********************************************************/
  92. void LCD_XSservice() //数码管显示程序
  93. {
  94.         if (DSBZ==1)
  95.         {
  96.                 if (DSSJ>60)
  97.                 {
  98.                         if (DSSJ>99) {iii=2;}
  99.                         if (DSSJ>120) {iii=3;}
  100.                         if (DSSJ>180) {iii=4;}
  101.                         if (DSSJ>240) {iii=5;}
  102.                         if (DSSJ>300) {iii=6;}
  103.                         if (DSSJ>360) {iii=7;}
  104.                         if (DSSJ>420) {iii=8;}
  105.                         ly_dis1=iii;//P0口驱动数码管2到8的定时显示
  106.                         ly_dis2=10;        //显示个位值
  107.                 }
  108.         
  109.          if (DSSJ<=99)
  110.                 {
  111.                         if (DSSJ>0)
  112.                         {
  113.                                 ly_dis1=DSSJ/10;        //显示十位值
  114.                                 ly_dis2=DSSJ%10;        //显示个位值
  115.                         }
  116.           }
  117.         if (DSSJ==0)
  118.         {
  119.                
  120.                 if (SMMS==1)
  121.                 {
  122.                  LCD1=1;
  123.                  LCD2=1;
  124.                  DSBZ=0;
  125.                  LED4=1;
  126.                  SMMSJK=0;
  127.                  hw_anjiank=1;     //表明由红外按键触发
  128.                  ucKeySec=1;//触发1档按键
  129.                 }
  130.                 if (SMMS==0)
  131.                 {
  132.                         if (DSBZ==1)
  133.                         {
  134.                     ISP_CONTR=0x20;  //关闭所有,所有变量清零,软复位
  135.                         }
  136.                 }
  137.                
  138.         }
  139. }
  140. }
  141. /**********************************************************/
  142. void key_scan()//按键扫描函数,放在定时中断里
  143. {
  144.   if (LCDSec!=1)
  145. {
  146.         if(K1==1)//IO口是高电平,说明按键1一直没有按下,这时要及时清零一些标志位
  147.          {
  148.            ucKeyLock1=0; //按键自锁标志清零
  149.                  uiKeyTimeCnt1=0;//按键去抖延时计数器清零
  150.          }
  151.    else if(ucKeyLock1==0)//有按键按下,且是第一次按下
  152.          {
  153.           uiKeyTimeCnt1++; //累计定时中断次数
  154.                  if(uiKeyTimeCnt1>const_key_time1)
  155.                  {
  156.                          uiKeyTimeCnt1=0;
  157.                          ucKeyLock1=1;  //自锁按键置位,避免一直触发
  158.                          hw_anjiank=0;  //表明解除由红外按键触发
  159.                          anjiank=1;     //表明由按键触发
  160.                          ucKeySec=1;    //触发1档按键
  161.                  }
  162.          }
  163.          
  164.          if(K2==1)//IO口是高电平,说明按键2一直没有按下,这时要及时清零一些标志位
  165.          {
  166.            ucKeyLock2=0; //按键自锁标志清零
  167.                  uiKeyTimeCnt2=0;//按键去抖延时计数器清零
  168.          }
  169.    else if(ucKeyLock2==0)//有按键按下,且是第一次按下
  170.          {
  171.           uiKeyTimeCnt2++; //累计定时中断次数
  172.                  if(uiKeyTimeCnt2>const_key_time1)
  173.                  {
  174.                          uiKeyTimeCnt2=0;
  175.                          ucKeyLock2=1;  //自锁按键置位,避免一直触发
  176.                          hw_anjiank=0;  //表明解除由红外按键触发
  177.                          anjiank=1;     //表明由按键触发
  178.                          ucKeySec=2;    //触发2档按键
  179.                  }
  180.          }
  181.                
  182.    if(K3==1)//IO口是高电平,说明按键3一直没有按下,这时要及时清零一些标志位
  183.          {
  184.            ucKeyLock3=0; //按键自锁标志清零
  185.                  uiKeyTimeCnt3=0;//按键去抖延时计数器清零
  186.          }
  187.    else if(ucKeyLock3==0)//有按键按下,且是第一次按下
  188.          {
  189.           uiKeyTimeCnt3++; //累计定时中断次数
  190.                  if(uiKeyTimeCnt3>const_key_time1)
  191.                  {
  192.                          uiKeyTimeCnt3=0;
  193.                          ucKeyLock3=1;  //自锁按键置位,避免一直触发
  194.                          hw_anjiank=0;  //表明解除由红外按键触发
  195.                          anjiank=1;     //表明由按键触发
  196.                          ucKeySec=3;    //触发3档按键
  197.                  }
  198.          }         
  199.   }
  200. }



  201. /**********************************************************/
  202. void key_service1() //关闭的应用程序
  203. {
  204.         if(anjiank==1)  //判断按键是否有按下,如果按键触发,但三个按键都为高电平,那么表示按了按键关按键
  205.                  {
  206.                          if(K1&K2&K3==1)
  207.                          {
  208.                                  ISP_CONTR=0x20;  //关闭所有,所有变量清零,软复位
  209.                          }
  210.                  }
  211.                  
  212.          if(hw_anjiank==1)//判断红外关按键是否按下
  213.                  {
  214.                          if(Guanbi==1)   //关闭标志
  215.                          {     
  216.                                   //关闭所有,所有变量清零,软位
  217.                                 initial_myself(); //初始化
  218.                                 delay_long(100);
  219.                                 initial_peripheral();//初始化外围
  220.                                 Guanbi=0;   //关闭标志清零
  221.                                  
  222.                          }
  223.                  }
  224.          
  225.                  
  226. }
  227. /**********************************************************/
  228. void key_service() //按键服务的应用程序
  229. {
  230.   switch(ucKeySec) //按键的切换
  231.         {  
  232.                
  233.         case 1:       //按键1--1档
  234.             LED1 = 1;
  235.       LED2 = 1;
  236.       LED3 = 1;
  237.       LED1 = 0;        
  238.       SC2 = 1;
  239.             SC3 = 1;
  240.             delay(300);        
  241.             if (SC2&SC3)
  242.                         {
  243.       SC1 = 0;
  244.                                 }
  245.                         ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一直触发
  246.        break;
  247.         case 2:       //按键2--2档
  248.             LED1 = 1;
  249.       LED2 = 1;
  250.       LED3 = 1;        
  251.             LED1 = 0;
  252.       LED2 = 0;
  253.       SC1 = 1;
  254.             SC3 = 1;
  255.       delay(300);        
  256.       if (SC1&SC3)
  257.                         {
  258.       SC2 = 0;
  259.                                 }
  260.             ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一直触发
  261.        break;
  262.         case 3:       //按键3--3档
  263.             LED1 = 1;
  264.       LED2 = 1;
  265.       LED3 = 1;        
  266.             LED1 = 0;
  267.       LED2 = 0;
  268.             LED3 = 0;
  269.       SC1 = 1;
  270.             SC2 = 1;
  271.       delay(300);        
  272.       if (SC1&SC2)
  273.                         {
  274.       SC3 = 0;
  275.                                 }
  276.             ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一直触发
  277.        break;
  278.   case 4:       //OK按键短按
  279.             
  280.             ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一直触发
  281.        break;
  282.         
  283.         }
  284. }

  285. /**********************************************************/
  286. void IR_IN() interrupt 0 //using 0    接收红外信号
  287. {
  288.   unsigned char j,k,N=0;
  289.          EX0 = 0;   
  290.          delay(15);
  291.          if (IRIN==1)
  292.      { EX0 =1;
  293.            return;
  294.           }
  295.                            //确认IR信号出现
  296.   while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
  297.     {delay(1);}

  298. for (j=0;j<4;j++)         //收集四组数据
  299. {
  300.   for (k=0;k<8;k++)        //每组数据有8位
  301.   {
  302.    while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
  303.      {delay(1);}
  304.     while (!IRIN)          //等 IR 变为高电平
  305.      {delay(1);}
  306.      while (IRIN)           //计算IR高电平时长
  307.       {
  308.     delay(1);
  309.     N++;           
  310.     if (N>=30)
  311.          { EX0=1;
  312.          return;}                  //0.14ms计数过长自动离开。
  313.       }                        //高电平计数完毕               
  314.      IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”
  315.      if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //数据最高位补“1”
  316.      N=0;
  317.                                 
  318.   }//end for k
  319. }//end for j


  320.    
  321.    if (IRCOM[2]!=~IRCOM[3])
  322.    { EX0=1;
  323.                  return; }
  324.                  
  325. if (LCDSec!=1)
  326. {
  327.         if (IRCOM[2]==0xC5)//返回键  这一步就是判断,如果对应按键,则执行下面动作!
  328.                         {
  329.                          anjiank=0;  //表明解除由按键触发
  330.                          hw_anjiank=1;     //表明由红外按键触发
  331.                          ucKeySec=1;//触发1档按键
  332.                         
  333.                         }
  334.         if (IRCOM[2]==0x88)// 主页键  这一步就是判断,如果对应按键,则执行下面动作!
  335.                         {
  336.                          anjiank=0;  //表明解除由按键触发
  337.                          hw_anjiank=1;     //表明由红外按键触发
  338.                          ucKeySec=2;//触发2档按键
  339.                         
  340.                         }         
  341.         if (IRCOM[2]==0x82)//菜单键   这一步就是判断,如果对应按键,则执行下面动作!
  342.                         {
  343.                          anjiank=0;  //表明解除由按键触发
  344.                          hw_anjiank=1;     //表明由红外按键触发
  345.                          ucKeySec=3;//触发3档按键
  346.                         
  347.                         }
  348.         }                        

  349. if (IRCOM[2]==0xCA)//上键,这一步就是判断,如果对应按键,则执行下面动作!
  350.                 {
  351.                  if (LCDSec==1)//如果在时间设置状态,就是设置时间的加
  352.                  {
  353.                          LCDszxs++;
  354.                          if (LCDszxs>8)
  355.                          {
  356.                          LCDszxs=0;
  357.                          }
  358.                         }
  359.            else    //除了时间设置状态,为风量档位加
  360.                  {
  361.                   if (SC1&SC2&SC3)
  362.                          {
  363.                                  ucKeySec=1;
  364.                                 }
  365.                  if (SC1==0)
  366.                          {
  367.                                  ucKeySec=2;
  368.                          }
  369.                         if (SC2==0)
  370.                          {
  371.                                  ucKeySec=3;
  372.                          }
  373.                   anjiank=0;  //表明解除由按键触发
  374.                   hw_anjiank=1;     //表明由红外按键触发
  375.                   }
  376.                 }                        
  377. if (IRCOM[2]==0xD2)//下键,这一步就是判断,如果对应按键,则执行下面动作!
  378.                 {
  379.                  if (LCDSec==1)//如果在时间设置状态,就是设置时间的减
  380.                  {
  381.                          if (LCDszxs>0)
  382.                          {
  383.                          LCDszxs--;
  384.                          }
  385.                          if (LCDszxs==0)
  386.                          {
  387.                          LCDszxs=8;
  388.                          }
  389.                   }
  390.           else   //除了时间设置状态,为风量档位减
  391.                  {
  392.                   if (SC1==0)
  393.                          {
  394.                                 Guanbi=1;   //关闭标志打开
  395.        }
  396.                         if (SC2==0)
  397.                          {
  398.                                  ucKeySec=1;
  399.                          }
  400.                          if (SC3==0)
  401.                          {
  402.                                  ucKeySec=2;
  403.                          }
  404.                  anjiank=0;  //表明解除由按键触发
  405.                  hw_anjiank=1;     //表明由红外按键触发
  406.                  }
  407.                 }
  408.                
  409. if (IRCOM[2]==0x81)// V-键  这一步就是判断,如果对应按键,则执行下面动作!定时设置
  410.    {
  411.     if ((SC1&SC2&SC3)==0)
  412.                  {
  413.                  LCDSec=1;  //定时设置状态,数码管闪动
  414.                  LCDszxs=0;   //数码管定时的变量
  415.                  LCD1=0;
  416.                  LCD2=0;
  417.                 }
  418.          }                 
  419.                
  420.         if (IRCOM[2]==0xce)//OK键  这一步就是判断,如果对应按键,则执行下面动作!确认并退出定时设置
  421.                 {
  422.                  if (LCDSec==1)
  423.                  {
  424.                          if (LCDszxs>0)
  425.                          {
  426.                                  DSSJ=Dingshi0[LCDszxs];
  427.                                  DSBZ=1;
  428.                                  LCDSec=0;
  429.                                  SMMSJK=0;
  430.                          }
  431.                         else
  432.       {
  433.                                 LCD1=0;
  434.                     LCD2=0;
  435.                                 LCDSec=0;
  436.                         }                                
  437.                  }
  438.                  else
  439.                 {
  440.       initial_myself(); //初始化
  441.                         delay_long(100);
  442.                         initial_peripheral();//初始化外围
  443.                         Guanbi=0;   //关闭标志清零
  444.                 }               
  445.                 }        
  446.   
  447. if (IRCOM[2]==0xC1)//右键,这一步就是判断,如果对应按键,则执行下面动作!
  448. {
  449.         if ((SC1&SC2&SC3)==0)
  450.         {
  451.         if (LCDSec==0)
  452.         {
  453.         LED4=!LED4;                 //LED4取反
  454.         
  455.                 if (LED4==0)
  456.                 {
  457.                         SMMS=1;
  458.                          if (DSBZ==0)
  459.            {
  460.                         if(SMMSJK==0)
  461.                                         {
  462.                                         LCD1=0;
  463.                       LCD2=0;
  464.                                         LCDszxs=3;
  465.                                         DSSJ=Dingshi0[LCDszxs];
  466.                                         DSBZ=1;
  467.                                         SMMSJK=1;
  468.                                         }
  469.                    }
  470.                  }
  471.                 if (LED4==1)
  472.                 {
  473.                         SMMS=0;
  474.                
  475.                 if (DSBZ==1)
  476.                 {
  477.                         if(SMMSJK==1)
  478.                          {
  479.                                 LCD1=1;
  480.                     LCD2=1;
  481.                                 DSBZ=0;
  482.                                 LCDszxs=0;
  483.                                 DSSJ=Dingshi0[LCDszxs];
  484.                                 SMMSJK=0;
  485.                                 }
  486.                         }
  487.                 }
  488.         }
  489. }
  490. }
  491.         
  492.                  
  493.      EX0 = 1;
  494. }
  495. /**********************************************************/
  496. void display_drive()  //数码管字模驱动函数
  497. {
  498.         if (DSBZ|LCDSec)
  499. {
  500.         switch(posit)
  501.                         {
  502.                                 case 1:
  503.                                         LCD1=0;
  504.                                         LCD2=1;
  505.                                  if (LCDSec==1)
  506.                                  {
  507.                                         P0=Tab0[LCDszxs];//P0口驱动数码管0到8的定时显示
  508.                                  }
  509.                                  else
  510.                                  {
  511.                                         P0=Tab0[ly_dis1];//P0口驱动数码管1到8的定时显示
  512.                                  }
  513.                                         break;        
  514.                                 case 2:
  515.                                         LCD1=1;
  516.                                         LCD2=0;
  517.                                 if (LCDSec==1)
  518.                                  {
  519.                                         P0=0X8b;//显示H
  520.                                  }
  521.                                  else
  522.                                  {
  523.                                         P0=Tab0[ly_dis2];//P0口驱动数码管1到8的定时显示
  524.                                  }
  525.                                         break;                                
  526.                         }
  527.                         posit++;
  528.                         if(posit>2)
  529.                         {
  530.                                 posit=1;
  531.                         }
  532.                 }
  533. else
  534. {
  535.         LCD1=1;
  536.         LCD2=1;
  537. }
  538. }
  539. /**********************************************************/
  540. void T0_time() interrupt 1  //定时器0函数
  541. {
  542.         TF0=0;  //清除中断标志
  543.         TR0=0; //关中断
  544.         key_scan(); //按键扫描函数
  545.         
  546.          if(DSBZ==1)  //启动定时倒计时计数器
  547.   {
  548.      uiTimeCnt++;
  549.      if(uiTimeCnt>=const_1s)    //1秒时间到
  550.      {
  551.                          js1m++;
  552.                          if (js1m==210)
  553.                          {
  554.             if(DSSJ!=0) //防止倒计时到0秒
  555.             {
  556.                DSSJ--;  //倒计时值减1
  557.             }
  558.                                         js1m=0;        
  559.                                 }
  560.    
  561.         uiTimeCnt=0;   //计时器清零,准备重新开始
  562.      }
  563.   }

  564.         display_drive();  //数码管字模驱动函数
  565.         TH0=0xfe;   //重装初始值(65535-500)=635035=0xfe0b
  566.         TL0=0x0b;
  567.         TR0=1;  //开中断
  568. }

  569. /*******************************************************/
  570. void initial_myself()  //初始化单片机
  571. {
  572.    
  573.    
  574.         //I/O口初始化
  575.     IRIN=1;           //红外接收器数据线,外部中断0                  
  576.           K1 = 1;           //按键1
  577.           K2 = 1;           //按键2
  578.           K3 = 1;           //按键3
  579.     SC1 = 1;          //1档输出
  580.     SC2 = 1;          //2档输出
  581.     SC3 = 1;          //3档输出
  582. ……………………

  583. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

51hei附件下载:
程序+PCB文件.7z (1.45 MB, 下载次数: 92)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:672792 发表于 2022-4-30 18:56 | 只看该作者
好资料,51有你更精彩
回复

使用道具 举报

板凳
ID:161164 发表于 2022-4-30 22:36 来自手机 | 只看该作者
请问5V电源如何取得?容阻降压还是另外接变压器?
回复

使用道具 举报

地板
ID:297903 发表于 2022-5-1 07:45 | 只看该作者
好资料,谢谢分享!
回复

使用道具 举报

5#
ID:14102 发表于 2022-5-4 09:25 | 只看该作者
lkc8210 发表于 2022-4-30 22:36
请问5V电源如何取得?容阻降压还是另外接变压器?

另外接5V 电源
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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