找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机宽电压数显延时电路与源程序(模拟量+计数+倒计时等功能)

[复制链接]
跳转到指定楼层
楼主
【简要说明】
一、板子尺寸:长54mmX宽72mmX18mm
二、主要器件:单片机、数码管、继电器
三、工作电压:有12V24两种可供选择
四、板子功耗:小于300mA

GYJ-0057_宽电压可编程数显延时模块电路原理图如下:


pcb:


Altium Designer画的单路数显延时模块宽电压原理图和PCB图如下:(51hei附件中可下载工程文件)



模拟量0到5上限下限单片机源程序如下:
  1. #include<STC12C2052AD.h>                 //库文件
  2. #include<intrins.h>
  3. #define uchar unsigned char //宏定义字符型变量
  4. #define uint  unsigned int        //宏定义整型变量
  5. /****************************模拟量开始*********************************************/
  6. /*声明 SFR 相关 与 的 IAP*/
  7. sfr IAP_DATA = 0xE2;
  8. sfr IAP_ADDRH = 0xE3;
  9. sfr IAP_ADDRL = 0xE4;
  10. sfr IAP_CMD = 0xE5;
  11. sfr IAP_TRIG = 0xE6;
  12. sfr IAP_CONTR = 0xE7;
  13. #define ADC_POWER   0x80            //ADC 电源控制位
  14. #define ADC_FLAG    0x10            //ADC 转换结束标志位
  15. #define ADC_START   0x08            //ADC 开始转换控制位
  16. #define ADC_SPEEDLL 0x00            //210 个时钟周期转换一次
  17. #define ADC_SPEEDL  0x20            //420 个时钟周期转换一次
  18. #define ADC_SPEEDH  0x40            //630 个时钟周期转换一次
  19. #define ADC_SPEEDHH 0x60            //840 个时钟周期转换一次
  20. /******************************模拟量结束*******************************************/
  21. /********************************************************************
  22.                             定义 ISP/IAP/EEPROM 命令
  23. *********************************************************************/
  24. #define CMD_IDLE 0jm
  25. #define CMD_READ 1
  26. #define CMD_PROGRAM 2
  27. #define CMD_ERASE 3
  28. #define ENABLE_IAP 0x83//SYSCLK<12MH
  29. #define IAP_ADDRESS 0x0000        //存储地址
  30. void IapIdle();//禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态
  31. uchar IapReadByte(uint addr);//读数据
  32. void IapProgramByte(uint addr, uchar dat);//写数据
  33. void IapEraseSector(uint addr);//擦除数据
  34. sbit P10=P1^0;//数码管段
  35. sbit P11=P1^1;//数码管段
  36. sbit P12=P1^2;//数码管段
  37. sbit P13=P1^3;//数码管段
  38. sbit P14=P1^4;//数码管段
  39. sbit P15=P1^5;//数码管段
  40. sbit P16=P1^6;//数码管段
  41. sbit P32=P3^2;//数码管位
  42. sbit P33=P3^3;//数码管位
  43. sbit P35=P3^5;//数码管位
  44. sbit AIN1=P1^7;//AD信号输入
  45. sbit key1=P3^0;//按键输入
  46. sbit key2=P3^1;//按键输入
  47. sbit OUT=P3^7; //继电器输出
  48. static uchar presstime=0;//用于延时
  49. uint tcnt1=0;//用于刷新数码管
  50. uint bainum1,shinum1,genum1;//数码管上显示
  51. uint bainum11=0,shinum11=0,genum11=0,shinum12=0,genum12=0;//用于传到数码管上显示
  52. uint kf0=1,if0=0;//按键用的标志位
  53. uint kt0=0;//按键用的标志位
  54. uint keynum=0;//数码管的位
  55. uint datas=0;
  56. bit flag_eeprom1=1;//掉电存储的标志位
  57. uint inum1=0;//触发端子用的计数
  58. uchar inum11=0,inum12=0;//掉电存储
  59. uint ad=0,ad1=0;
  60. code uchar seg7code[13]={0x84,0xf6,0x8a,0xa2,0xf0,0xa1,0x81,0xb6,0x80,0xa0,0x6f,0x3e,0x72}; //显示段码 数码管字跟
  61. extern void p31s();//将p3口的235置为1
  62. uint GetADCResult(uchar px);
  63. uint meanval1,meanval2;//平均值
  64. void InitADC();
  65. void keycan();
  66. void keyflag();//按键结束调用
  67. void displaynum();//将数字传到数码管上显示
  68. void saveeepro();

  69. void timer0(void)interrupt 1  {//定时器0         
  70.         //500等于1秒
  71.         TL0 = 0xCD;                //重新设置定时器0时间为2ms
  72.         TH0 = 0xF8;                //重新设置定时器0的初始值
  73.         tcnt1++;//用于刷新数码管
  74.         presstime++;
  75.         if (if0==0){
  76.                 meanval1++;
  77.                 if(meanval1==50){
  78.                         meanval2=GetADCResult(7)/5;
  79.                         meanval1=0;
  80.                 }
  81.         }
  82.         switch(tcnt1){//数码管部分
  83.            case 1: p31s(); P1=seg7code[bainum1];P32=0;break;
  84.           case 2: p31s(); P1=~seg7code[shinum1];if(keynum==1 || keynum==3 || keynum==0){P33=0;}break;
  85.           case 3: p31s(); P1=~seg7code[genum1]; if(keynum==2 || keynum==4 || keynum==0){P35=0;}break;
  86.           default: tcnt1=0; p31s(); break;
  87.          }
  88. }//定时器0结束
  89. void displaynum(){//将数字传到数码管上显示
  90.         if (if0==0){//当if0==0时num1三个数码管进行显示
  91.                 AIN1=1;
  92.                 ad=meanval2;
  93.                 if((ad<inum11)||(ad>inum12)){OUT=0;}else{OUT=1;}
  94.                         genum1=ad%10;//个位
  95.                         shinum1=ad/10%10;//十位
  96.                         bainum1=10;//百
  97.         }else{
  98.                 if(keynum<3){
  99.                         bainum1=11;
  100.                         shinum1=shinum11;
  101.                         genum1=genum11;
  102.                         inum11=shinum11*10+genum11;        //将num1三个数码管的值付给inum
  103.                 }else{
  104.                         bainum1=12;
  105.                         shinum1=shinum12;
  106.                         genum1=genum12;
  107.                         inum12=shinum12*10+genum12;        //将num1三个数码管的值付给inum
  108.                
  109.                 }
  110.         }                        
  111. }
  112. void timer0_1init(void){//定时配置
  113.         TMOD=0x11;//将定时器0,1都设置为模式1
  114.         TL0 = 0xCD;//设置定时器0时间为2ms
  115.         TH0 = 0xF8;//设置定时器0的初始值
  116.         TR0=1;//开启定时器0
  117.         TR1=1;//开启定时器1
  118.         EA=1;//开总中断
  119.         ET0=1;//开定时器0的中断
  120. }
  121. void main(){
  122.         P1M0=0X00;//强推挽输出
  123.         P1M1=0X7F;//强推挽输出
  124.         AIN1=1;
  125.         InitADC(); //AD转换初始化
  126.         timer0_1init();        //定时器配置
  127.         inum11= IapReadByte(0x01);//读取存储的值
  128.         inum12= IapReadByte(0x02);
  129. //        inum1=inum11*100+inum12;
  130.    shinum11=inum11/10%10;
  131.    genum11=inum11%10;
  132.    shinum12=inum12/10%10;
  133.    genum12=inum12%10;
  134.         while(1){
  135.                 keycan();
  136.         }         
  137. }
  138. void keycan(){//按键
  139.         if(keynum==0){//当按键值等于0的时候调用显示
  140.                 displaynum();
  141.         }
  142.             if(key1==0){//当按键1按下
  143.                         if(kf0){//当标志位kf0=1的时候进行
  144.                                 if(presstime>50){//当时间值大于一百的时候
  145.                                         kf0=0;//标志位kf0=0
  146.                                         kt0=1;//标志位kt0=0
  147.                                         if0=1;
  148.                                         presstime=0;//时间清零,重新进行
  149.                                         keynum++;//数码管的位
  150.                                 if(keynum==5){//当位到7则置位0
  151.                                            keynum=0;if0=0;
  152.                                          }
  153.                                 }
  154.                           }
  155.                 }else{//当按键松开
  156.                         keyflag();displaynum();
  157.                 }//按键1结束
  158.     if(key2==0){if(kf0){if(presstime>50){kf0=0;kt0=1;presstime=0;flag_eeprom1=1;//掉电存储的标志位改为1,进行存值操作
  159.                                 switch(keynum){
  160.                                         case 0:if(if0==1){if0=0;}else{if0=1;}break;
  161.                                         case 1:shinum11++;if(shinum11>9){shinum11=0;}break;
  162.                                         case 2:genum11++;if(genum11>9){genum11=0;}break;
  163.                                         case 3:shinum12++;if(shinum12>9){shinum12=0;}break;
  164.                                         case 4:genum12++;if(genum12>9){genum12=0;}break;
  165.                                         default:break;
  166.                                 }
  167.                         }}}else{keyflag();displaynum();
  168.                                         if(bainum11==1){shinum11=0;genum11=0;}
  169.                                         if((flag_eeprom1==1))//加掉电存储,必需加到这,不然有一些小问题
  170.                                         {   flag_eeprom1=0;
  171.                                             saveeepro();//掉电存储
  172.                                         }
  173.                         }//松开按键进行显示        
  174. }

  175. void saveeepro(){//掉电存储
  176. inum11=shinum11*10+genum11;        //将num1三个数码管的值付给inum
  177. inum12=shinum12*10+genum12;        //将num1三个数码管的值付给inum
  178. // inum11=inum1/100;//把int型的值拆分到char型
  179. // inum12=inum1%100;
  180.    IapEraseSector(0);  //擦除扇区
  181.    IapProgramByte(0x01,inum11);//写入数据
  182.    IapProgramByte(0x02,inum12);//写入数据
  183. //   IapProgramByte(0x03,inum13);//写入数据
  184. //   IapProgramByte(0x04,inum14);//写入数据
  185. }

  186. void p31s(){//将p3口的235置为1
  187.         P32=1;P33=1;P35=1;
  188. }
  189. void keyflag(){//按键结束调用,按键的建议使用,这样可以减小code,但是触发的不建议
  190.            if(kt0){//当标志位kt0=1的时候进行
  191.                    if(presstime>50){//当时间值大于一百的时候
  192.                         kf0=1;//标志位kf0=1
  193.                         kt0=0;//标志位kt0=0
  194.                            presstime=0;//时间清零,重新进行
  195.                         }
  196.            }
  197. }
  198. // AD转换初始化程序
  199. void InitADC(){
  200. //   P1 = P1M0 = P1M1 = 0xff;        //设置P1口为开漏模式,使用AD功能
  201.     ADC_DATA = 0;                   //AD数据寄存器清空
  202.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL;//打开AD电源,转换周期210
  203.     _nop_();                        //延时
  204. }
  205. //AD转换控制程序
  206. uint GetADCResult(uchar px){          //转换输出的数据 (PX为通道口)
  207.         uint t=0;
  208.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL |px| ADC_START;//开始转换
  209.         _nop_();
  210.     _nop_();
  211.     _nop_();
  212.     while (!(ADC_CONTR & ADC_FLAG));//等待转换结束
  213.     ADC_CONTR &= ~ADC_FLAG;         //关闭AD转换
  214.         t=(ADC_DATA<<2)|ADC_LOW2;
  215.     return ADC_DATA;                //返回数据
  216. }
  217. void IapIdle(){//禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态
  218.     IAP_CONTR = 0;           //
  219.         IAP_CMD = 0;           //
  220.         IAP_TRIG = 0;           //
  221.         IAP_ADDRH = 0x80;  //
  222.         IAP_ADDRL = 0;           //
  223. }
  224. uchar IapReadByte(uint addr){//读数据
  225.    uchar dat;
  226.    IAP_CONTR = ENABLE_IAP;
  227.    IAP_CMD = CMD_READ;
  228.    IAP_ADDRL = addr;
  229.    IAP_ADDRH = addr >> 8;
  230.    IAP_TRIG = 0x46;
  231.    IAP_TRIG = 0xb9;
  232.    _nop_();
  233.    dat = IAP_DATA;
  234.    IapIdle();
  235.    return dat;
  236. }
  237. void IapProgramByte(uint addr, uchar dat){//写数据
  238.    IAP_CONTR = ENABLE_IAP;
  239.    IAP_CMD = CMD_PROGRAM;
  240.    IAP_ADDRL = addr;
  241.    IAP_ADDRH = addr >> 8;
  242.    IAP_DATA = dat;
  243.    IAP_TRIG = 0x46;
  244.    IAP_TRIG = 0xb9;
  245.    _nop_();
  246.    IapIdle();
  247. }
  248. void IapEraseSector(uint addr){//擦除数据
  249.    IAP_CONTR = ENABLE_IAP;
  250.    IAP_CMD = CMD_ERASE;
  251. ……………………

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


57板周期内倒计时(喂鱼)单片机源程序如下:
  1. #include "demo.h"
  2. //主函数        
  3. void main(void){
  4.         timer0_1init();
  5.         P3M0=0X00;
  6.         P3M1=0X3c;
  7.           periodnum1 = IapReadByte(0x01);
  8.           periodnum2 = IapReadByte(0x02);
  9.           periodnum3 = IapReadByte(0x03);
  10.           worknum1 = IapReadByte(0x04);
  11.           worknum2 = IapReadByte(0x05);
  12.           worknum3 = IapReadByte(0x06);
  13.           periodnum=periodnum1*100+periodnum2*10+periodnum3;
  14.           worknum=worknum1*100+worknum2*10+worknum3;
  15.           workminus=worknum;
  16.         while(1){
  17.                 if(outstate){
  18.                         outs=1;
  19.                 }else{
  20.                         outs=0;
  21.                 }
  22.                 keycan();
  23.                 displaynum();
  24.                 if(it1==0){
  25.                     if(in==0){if(if0){if(presstime>50){if0=0;it0=1;presstime=0;
  26.                                 startwork=1;
  27.                                 outstate=1;                        
  28.                         }}}else{if(it0){if0=1;it0=0;presstime=0;
  29.                                 startwork=0;
  30.                                 outstate=0;                        
  31.                         }}
  32.                 }
  33.         }
  34. }
  35. void displaynum(){//将数字传到数码管上显示
  36.         if(keynum==0){
  37.                 dpnum1=0;
  38.                 dpnum2=workminus/100;
  39.                 dpnum3=workminus/10%10;
  40.                 dpnum4=workminus%10;               
  41. //                dpnum1=time11/10%10;
  42. //                dpnum2=time11%10;
  43. //                dpnum3=workminus/10%10;
  44. //                dpnum4=workminus%10;               
  45.         }
  46.         if((keynum>0)&&(keynum<4)){
  47.                 dpnum1=10;
  48.                 dpnum2=periodnum1;
  49.                 dpnum3=periodnum2;
  50.                 dpnum4=periodnum3;        
  51.                 periodnum=periodnum1*100+periodnum2*10+periodnum3;
  52.         }
  53.         if((keynum>3)&&(keynum<7)){
  54.                 dpnum1=11;
  55.                 dpnum2=worknum1;
  56.                 dpnum3=worknum2;
  57.                 dpnum4=worknum3;        
  58.                 worknum=worknum1*100+worknum2*10+worknum3;        
  59.                 workminus=worknum;
  60.         }        
  61. }

  62. void timer0_ISR() interrupt 1{
  63.         TL0 = 0xCD;                //重新设置定时器0时间为2ms
  64.         TH0 = 0xF8;                //重新设置定时器0的初始值
  65.         tcnt1++;
  66.         presstime++;
  67.         time1++;
  68.         if(500==time1){
  69.                 time11++;
  70.                 time1=0;
  71. //                if(60==time11){
  72. //                        time12++;
  73.                         if(periodnum==time11){
  74.                         time11=0;
  75. //                                time12=1;
  76.                                 startwork=0;
  77.                                 outstate=1;
  78.                                 it1=0;
  79.                                 workminus=worknum;
  80.                         }
  81. //                }
  82.                 if(startwork==0){
  83.                         outstate=0;
  84. //                        time2++;
  85. //                        if(60==time2){
  86. //                                time2=0;
  87.                                 workminus--;
  88.                                 if(0==workminus){
  89.                                         outstate=1;
  90.                                         startwork=1;
  91.                                         it1=1;
  92.                                         workminus=worknum;
  93.                                 }
  94.                         }
  95. //                }
  96.         }
  97.         switch(tcnt1){
  98.                 case 1: P3t0();seg7code(dpnum1);wei4=1; break;
  99.                 case 2: P3t0();seg7code(dpnum2);if((keynum==0)||(keynum==1)||(keynum==4)){wei3=1;} break;
  100.                 case 3: P3t0();seg7code(dpnum3);if((keynum==0)||(keynum==2)||(keynum==5)){wei2=1;} break;        
  101.                 case 4: P3t0();seg7code(dpnum4);if((keynum==0)||(keynum==3)||(keynum==6)){wei1=1;} break;
  102.                 default: tcnt1=0;break;
  103.         }
  104. }
  105. void keycan(){//按键
  106.     if(key1==0){//当按键1按下
  107.                 if(kf0){//当标志位kf0=1的时候进行
  108.                         if(presstime>100){//当时间值大于一百的时候
  109.                                 kf0=0;//标志位kf0=0
  110.                                 kt0=1;//标志位kt0=0
  111.                                 presstime=0;//时间清零,重新进行
  112.                                 keynum++;//数码管的位
  113.                         if(keynum==7){//当位到7则置位0
  114.                                    keynum=0;
  115.                                 }
  116.                         }
  117.                   }
  118.         }else{//当按键松开
  119.                 keyflag();
  120.         }//按键1结束
  121.     if(key2==0){if(kf0){if(presstime>100){kf0=0;kt0=1;presstime=0;flag_eeprom1=1;
  122.                                 switch(keynum){
  123.                                         case 1:
  124.                                                 periodnum1++;//数码管一加加
  125.                                                 if(periodnum1>9){//当数码管一加加到9时置为1
  126.                                                         periodnum1=0;
  127.                                                 }
  128.                                                 break;
  129.                                         case 2:periodnum2++;if(periodnum2>9){periodnum2=0;}break;
  130.                                         case 3:periodnum3++;if(periodnum3>9){periodnum3=0;}break;
  131.                                         case 4:worknum1++;  if(worknum1>9)  {worknum1=0;}break;
  132.                                         case 5:worknum2++;  if(worknum2>9)  {worknum2=0;}break;
  133.                                         case 6:worknum3++;  if(worknum3>9)  {worknum3=0;}break;
  134.                                         default:break;
  135.                                 }
  136.                         }}}else{keyflag();
  137.                                 if(flag_eeprom1==1){//加掉电存储,必需加到这,不然有一些小问题        
  138.                                         flag_eeprom1=0;               
  139.                                            IapEraseSector(0);  //擦除扇区
  140.                                            IapProgramByte(0x01,periodnum1);//写入数据
  141.                                            IapProgramByte(0x02,periodnum2);//写入数据
  142.                                            IapProgramByte(0x03,periodnum3);//写入数据
  143.                                            IapProgramByte(0x04,worknum1);//写入数据
  144.                                            IapProgramByte(0x05,worknum2);//写入数据
  145.                                            IapProgramByte(0x06,worknum3);//写入数据
  146.                                 }                        
  147.                         }//松开按键进行显示        
  148. }
  149. void s0() {pa = 0;pb = 0;pc = 0;pd = 0;pe = 0;pf = 0;pg = 1;}
  150. void s1() {pb = 0;pc = 0;pa = 1;pg = 1;pd = 1;pe = 1;pf = 1;}
  151. void s2() {pa = 0;pb = 0;pg = 0;pe = 0;pd = 0;pf = 1;pc = 1;}
  152. void s3() {pa = 0;pb = 0;pg = 0;pc = 0;pd = 0;pf = 1;pe = 1;}
  153. void s4() {pb = 0;pg = 0;pc = 0;pf = 0;pa = 1;pd = 1;pe = 1;}
  154. void s5() {pa = 0;pg = 0;pc = 0;pd = 0;pf = 0;pe = 1;pb = 1;}
  155. void s6() {pa = 0;pg = 0;pc = 0;pd = 0;pf = 0;pe = 0;pb = 1;}
  156. void s7() {pa = 0;pb = 0;pc = 0;pf = 1;pe = 1;pd = 1;pg = 1;}
  157. void s8() {pa = 0;pb = 0;pg = 0;pc = 0;pd = 0;pf = 0;pe = 0;}
  158. void s9() {pa = 0;pb = 0;pg = 0;pc = 0;pd = 0;pf = 0;pe = 1;}
  159. void s10(){pa = 0;pb = 0;pc = 0;pf = 0;pe = 0;pd = 1;pg = 0;}
  160. void s11(){pa = 1;pb = 1;pc = 0;pf = 0;pe = 0;pd = 0;pg = 0;}
  161. void s12(){pa = 0;pb = 1;pc = 1;pf = 0;pe = 0;pd = 0;pg = 1;}
  162. void seg7code(unsigned char num){
  163.         switch(num){
  164.                 case 0:  s0();break;
  165.                 case 1:  s1();break;
  166.                 case 2:  s2();break;
  167.                 case 3:  s3();break;        
  168.                 case 4:  s4();break;
  169.                 case 5:  s5();break;
  170.                 case 6:  s6();break;
  171.                 case 7:  s7();break;
  172.                 case 8:  s8();break;
  173.                 case 9:  s9();break;
  174.                 case 10: s10();break;
  175.                 case 11: s11();break;
  176.                 case 12: s12();break;
  177.                 default: num=0;break;
  178.         }
  179. }
  180. void P3t0(){
  181.         wei1=0;wei2=0;wei3=0;wei4=0;
  182. }
  183. void timer0_1init(void){
  184.         TMOD=0x11;//将定时器0,1都设置为模式1
  185.         TL0 = 0xCD;                //设置定时器0时间为2ms
  186.         TH0 = 0xF8;                //设置定时器0的初始值
  187.         TR0=1;//开启定时器0
  188.         TR1=1;//开启定时器1
  189.         EA=1;//开总中断
  190.         ET0=1;//开定时器0的中断
  191. }
  192. void keyflag(){//按键结束调用,按键的建议使用,这样可以减小code,但是触发的不建议
  193.            if(kt0){//当标志位kt0=1的时候进行
  194.                    if(presstime>50){//当时间值大于一百的时候
  195.                         kf0=1;//标志位kf0=1
  196.                         kt0=0;//标志位kt0=0
  197.                            presstime=0;//时间清零,重新进行
  198.                         }
  199.            }
  200. }
  201. /********************************************************************
  202. 禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态
  203. *********************************************************************/
  204. void IapIdle()
  205. {
  206.     IAP_CONTR = 0;           //
  207.         IAP_CMD = 0;           //
  208.         IAP_TRIG = 0;           //
  209.         IAP_ADDRH = 0x80;  //
  210.         IAP_ADDRL = 0;           //
  211. }

  212. /********************************************************************
  213.                              读数据
  214. *********************************************************************/

  215. uchar IapReadByte(uint addr)
  216. {
  217.    uchar dat;
  218.    IAP_CONTR = ENABLE_IAP;
  219.    IAP_CMD = CMD_READ;
  220.    IAP_ADDRL = addr;
  221.    IAP_ADDRH = addr >> 8;
  222.    IAP_TRIG = 0x46;
  223.    IAP_TRIG = 0xb9;
  224.    _nop_();
  225.    dat = IAP_DATA;
  226.    IapIdle();
  227.    return dat;
  228. }
  229. /********************************************************************
  230.                                写数据
  231. ……………………

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



全部资料51hei下载地址:
GYJ-0057_宽电压可编程数显延时模块发货资料.rar (1.21 MB, 下载次数: 25)
一代产品资料.rar (1.7 MB, 下载次数: 23)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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