找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机高精度计时器电路原理图 PCB与源代码

[复制链接]
跳转到指定楼层
楼主
(原创)51单片机高精度计时器电路原理图。采用AT89S52加DP8573,实现两个功能:带掉电保持功能的日历时钟、由外部开关信号触发的高精度计时,pcb文件与原理图配套,完全对应,可直接加工制作.
以上所有文件打包下载: 源码pcb等资料.rar (206.35 KB, 下载次数: 12)

  1. //********************************************************************
  2. // Author        : Bing Wang
  3. // Date          : Mar. 2017
  4. // File          : msTIMER.c
  5. // Hardware      : 89S51/89S52
  6. //********************************************************************

  7. #include <AT89X52.h>                // SFR definition file.
  8. #include <stdio.h>
  9. #include <absacc.h>                        //
  10. #include <ctype.h>                        //
  11. #include <stdlib.h>                        //
  12. #include <math.h>

  13. // Interface address definition
  14. // DP8573AN RTC
  15. xdata char DP8573SEC         _at_ 0x0600;
  16. xdata char DP8573MIN         _at_ 0x0700;
  17. xdata char DP8573HOUR         _at_ 0x0800;
  18. xdata char DP8573WEEK         _at_ 0x0E00;
  19. xdata char DP8573DAY         _at_ 0x0900;
  20. xdata char DP8573MONTH        _at_ 0x0A00;
  21. xdata char DP8573YEAR         _at_ 0x0B00;

  22. xdata char DP8573SECs        _at_ 0x1900;        // Second Save
  23. xdata char DP8573MINs         _at_ 0x1A00;        // Minute Save
  24. xdata char DP8573HOURs        _at_ 0x1B00;        // Hour Save
  25. xdata char DP8573DAYs        _at_ 0x1C00;        // Day Save
  26. xdata char DP8573MONs        _at_ 0x1D00;        // Month Save

  27. xdata char DP8573MSR         _at_ 0x0000;        // Main Status Register
  28. xdata char DP8573PFR         _at_ 0x0400;        // Periodic Flag Register
  29. xdata char DP8573TSCR         _at_ 0x0400;        // Time Save Control Register
  30. xdata char DP8573RTMR         _at_ 0x0100;        // Real Time Mode Register
  31. xdata char DP8573OMR         _at_ 0x0200;        // Output Mode Register
  32. xdata char DP8573ICR0         _at_ 0x0300;        // Interrupt Control Register 0
  33. xdata char DP8573ICR1         _at_ 0x0400;        // Interrupt Control Register 1

  34. unsigned char msCNT, Tsecond;
  35. unsigned char SecRTC, MinRTC, HourRTC, WeekRTC, DayRTC, MonthRTC, YearRTC;
  36. unsigned char CmdOld, KeyCmd;
  37. unsigned char second, secondOld, minute, minuteOld, hour, hourOld;
  38. unsigned char day, dayOld, month, monthOld, year, yearOld, timeH, timeL;

  39. void UART_Init(void)
  40. {
  41.         SCON = 0x50;        // Setup serial port ctrl reg
  42.                                         // Mode 1: 8-bit uart var. baud rate
  43.                                         // REN: enable receiver
  44.         PCON &= 0x7F;        // Clear SMOD bit in power ctrl reg
  45.                                         // This bit doubles the baud rate
  46.         TMOD &= 0xCF;        // Clear M1 and M0 for timer 1
  47.         TMOD |= 0x20;        // Set M1 for 8-bit autoreload timer
  48.                                         // TMOD: Timer 1 Mode 2: 8-bit auto-reload timer
  49.         TH1 = 213;                // 1200 baud with 20MHz xtal
  50.         TR1 = 1;                // Start timer 1
  51.         TI = 1;                        // Set TI to indicate ready to xmit
  52. }

  53. void DP8573A_Init(void)
  54. {
  55.         DP8573MSR = 0x40;        // RS=1
  56.         DP8573ICR0 = 0x04;        // Interrupt every 1sec
  57.         DP8573RTMR = 0x00;         // 24 hour mode + stop timer
  58.         DP8573MSR = 0x00;        // RS=0
  59.         DP8573PFR = 0x00;        // Clear INT flags + battery backup
  60.         DP8573TSCR = 0x80;        // Time save enable
  61.         DP8573SECs = 0x00;        // Clear saved second
  62.         DP8573MINs = 0x00;        // Clear saved minute
  63.         DP8573HOURs = 0x00;        // Clear saved hour
  64.         DP8573DAYs = 0x00;        // Clear saved day
  65.         DP8573MONs = 0x00;        // Clear saved month
  66.         DP8573MSR = 0x44;        // RS=1, clear INT flag
  67.         DP8573RTMR = 0x08;        // Clock start
  68. }

  69. void delay1s(void)
  70. {
  71.         unsigned int k;
  72.         for (k=0;k<40000;k++);
  73. }

  74. void delay100ms(void)
  75. {
  76.         unsigned int k;
  77.         for (k=0;k<2000;k++);
  78. }

  79. unsigned char KeyScan(void)
  80. {
  81.         unsigned char keypad;

  82.         keypad = P1;
  83.         keypad &= 0x1D;

  84.         switch (keypad)
  85.         {
  86.                 case 0x1C:
  87.                         keypad = 1;
  88.                         break;
  89.                 case 0x19:
  90.                         keypad = 2;
  91.                         break;
  92.                 case 0x15:
  93.                         keypad = 3;
  94.                         break;
  95.                 case 0x0D:
  96.                         keypad = 4;
  97.                         break;
  98.                 default:
  99.                         keypad = 0;
  100.                         break;
  101.         }
  102.         return keypad;
  103. }

  104. void AdjustRTC(void)
  105. {
  106.         unsigned char EndCMD, Para, ParaOld, ParaValue;

  107.         SecRTC = DP8573SEC;
  108.         SecRTC = (SecRTC>>4)*10 + (SecRTC%16);
  109.         MinRTC = DP8573MIN;
  110.         MinRTC = (MinRTC>>4)*10 + (MinRTC%16);
  111.         HourRTC = DP8573HOUR;
  112.         HourRTC = (HourRTC>>4)*10 + (HourRTC%16);
  113.         DayRTC = DP8573DAY;
  114.         DayRTC = (DayRTC>>4)*10 + (DayRTC%16);
  115.         MonthRTC = DP8573MONTH;
  116.         MonthRTC = (MonthRTC>>4)*10 + (MonthRTC%16);
  117.         YearRTC = DP8573YEAR;
  118.         YearRTC = (YearRTC>>4)*10 + (YearRTC%16);
  119.         EndCMD = 0;
  120.         Para = ParaOld = 0;
  121.         CmdOld = 0;

  122.         while (!EndCMD) {
  123.                 if (KeyCmd != CmdOld) {
  124.                         switch (KeyCmd) {
  125.                                 case 1:                                        // Setting
  126.                                         Para += 1;
  127.                                         if (Para >= 7) { Para = 0; EndCMD = 1; }
  128.                                         break;
  129.                                 case 2:                                        // +
  130.                                         switch(Para) {
  131.                                                 case 1:                        // Year
  132.                                                         if (YearRTC >= 99) YearRTC = 0;
  133.                                                         else YearRTC++;
  134.                                                         putchar(16);        // Set cursor to the last 2 chars
  135.                                                         putchar(14);
  136.                                                         putchar((YearRTC/10)+48);
  137.                                                         putchar((YearRTC%10)+48);
  138.                                                         break;
  139.                                                 case 2:                        // Month
  140.                                                         if (MonthRTC >= 12) MonthRTC = 1;
  141.                                                         else MonthRTC++;
  142.                                                         putchar(16);        // Set cursor to the last 2 chars
  143.                                                         putchar(14);
  144.                                                         putchar((MonthRTC/10)+48);
  145.                                                         putchar((MonthRTC%10)+48);
  146.                                                         break;
  147.                                                 case 3:                        // Day
  148.                                                         if (DayRTC >= 31) DayRTC = 1;
  149.                                                         else DayRTC++;
  150.                                                         putchar(16);        // Set cursor to the last 2 chars
  151.                                                         putchar(14);
  152.                                                         putchar((DayRTC/10)+48);
  153.                                                         putchar((DayRTC%10)+48);
  154.                                                         break;
  155.                                                 case 4:                        // Hour
  156.                                                         if (HourRTC >= 24) HourRTC = 0;
  157.                                                         else HourRTC++;
  158.                                                         putchar(16);        // Set cursor to the last 2 chars
  159.                                                         putchar(14);
  160.                                                         putchar((HourRTC/10)+48);
  161.                                                         putchar((HourRTC%10)+48);
  162.                                                         break;
  163.                                                 case 5:                        // Minute
  164.                                                         if (MinRTC >= 59) MinRTC = 0;
  165.                                                         else MinRTC++;
  166.                                                         putchar(16);        // Set cursor to the last 2 chars
  167.                                                         putchar(14);
  168.                                                         putchar((MinRTC/10)+48);
  169.                                                         putchar((MinRTC%10)+48);
  170.                                                         break;
  171.                                                 case 6:                        // Second
  172.                                                         if (SecRTC >= 59) SecRTC = 0;
  173.                                                         else SecRTC++;
  174.                                                         putchar(16);        // Set cursor to the last 2 chars
  175.                                                         putchar(14);
  176.                                                         putchar((SecRTC/10)+48);
  177.                                                         putchar((SecRTC%10)+48);
  178.                                                         break;
  179.                                                 default:
  180.                                                         break;
  181.                                         }
  182.                                         break;
  183.                                 case 3:                                        // -
  184.                                         switch(Para) {
  185.                                                 case 1:                        // Year
  186.                                                         if (YearRTC == 0) YearRTC = 99;
  187.                                                         else YearRTC--;
  188.                                                         putchar(16);        // Set cursor to the last 2 chars
  189.                                                         putchar(14);
  190.                                                         putchar((YearRTC/10)+48);
  191.                                                         putchar((YearRTC%10)+48);
  192.                                                         break;
  193.                                                 case 2:                        // Month
  194.                                                         if (MonthRTC == 1) MonthRTC = 12;
  195.                                                         else MonthRTC--;
  196.                                                         putchar(16);        // Set cursor to the last 2 chars
  197.                                                         putchar(14);
  198.                                                         putchar((MonthRTC/10)+48);
  199.                                                         putchar((MonthRTC%10)+48);
  200.                                                         break;
  201.                                                 case 3:                        // Day
  202.                                                         if (DayRTC == 1) DayRTC = 31;
  203.                                                         else DayRTC--;
  204.                                                         putchar(16);        // Set cursor to the last 2 chars
  205.                                                         putchar(14);
  206.                                                         putchar((DayRTC/10)+48);
  207.                                                         putchar((DayRTC%10)+48);
  208.                                                         break;
  209.                                                 case 4:                        // Hour
  210.                                                         if (HourRTC == 0) HourRTC = 24;
  211.                                                         else HourRTC--;
  212.                                                         putchar(16);        // Set cursor to the last 2 chars
  213.                                                         putchar(14);
  214.                                                         putchar((HourRTC/10)+48);
  215.                                                         putchar((HourRTC%10)+48);
  216.                                                         break;
  217.                                                 case 5:                        // Minute
  218.                                                         if (MinRTC == 0) MinRTC = 59;
  219.                                                         else MinRTC--;
  220.                                                         putchar(16);        // Set cursor to the last 2 chars
  221.                                                         putchar(14);
  222.                                                         putchar((MinRTC/10)+48);
  223.                                                         putchar((MinRTC%10)+48);
  224.                                                         break;
  225.                                                 case 6:                        // Second
  226.                                                         if (SecRTC == 0) SecRTC = 59;
  227.                                                         else SecRTC--;
  228.                                                         putchar(16);        // Set cursor to the last 2 chars
  229.                                                         putchar(14);
  230.                                                         putchar((SecRTC/10)+48);
  231.                                                         putchar((SecRTC%10)+48);
  232.                                                         break;
  233.                                                 default:
  234.                                                         break;
  235.                                         }
  236.                                         break;
  237.                                 case 4:                                        // Enter
  238.                                         ParaValue = ((SecRTC/10)*16) + (SecRTC%10);
  239.                                         SecRTC = ParaValue;
  240.                                         ParaValue = ((MinRTC/10)*16) + (MinRTC%10);
  241.                                         MinRTC = ParaValue;
  242.                                         ParaValue = ((HourRTC/10)*16) + (HourRTC%10);
  243.                                         HourRTC = ParaValue;
  244.                                         ParaValue = ((DayRTC/10)*16) + (DayRTC%10);
  245.                                         DayRTC = ParaValue;
  246.                                         ParaValue = ((MonthRTC/10)*16) + (MonthRTC%10);
  247.                                         MonthRTC = ParaValue;
  248.                                         ParaValue = ((YearRTC/10)*16) + (YearRTC%10);
  249.                                         YearRTC = ParaValue;
  250.        
  251.                                         DP8573MSR = 0x40;        // RS=1
  252.                                         DP8573RTMR = 0x00;         // 24 hour mode + stop timer
  253.                                         DP8573SEC = SecRTC;
  254.                                         DP8573MIN = MinRTC;
  255.                                         DP8573HOUR = HourRTC;
  256.                                         DP8573DAY = DayRTC;
  257.                                         DP8573MONTH = MonthRTC;
  258.                                         DP8573YEAR = YearRTC;
  259.                                         DP8573MSR = 0x40;        // RS=1
  260.                                         DP8573RTMR = 0x08;         // 24 hour mode + run timer
  261.                                         EndCMD = 1;
  262.                                         Para = 0;
  263.                                         break;
  264.                                 default:
  265.                                         break;
  266.                         }
  267.                         // Display setting
  268.                         if (ParaOld != Para) {
  269.                                 putchar(13);
  270.                                 ParaOld = Para;
  271.                                 switch(Para) {
  272.                                         case 1:                        // Year
  273.                                                 printf("Year:");
  274.                                                 putchar(16);        // Set cursor to the last 2 chars
  275.                                                 putchar(14);
  276.                                                 putchar((YearRTC/10)+48);
  277.                                                 putchar((YearRTC%10)+48);
  278.                                                 break;
  279.                                         case 2:                        // Month
  280.                                                 printf("Month:");
  281.                                                 putchar(16);        // Set cursor to the last 2 chars
  282.                                                 putchar(14);
  283.                                                 putchar((MonthRTC/10)+48);
  284.                                                 putchar((MonthRTC%10)+48);
  285.                                                 break;
  286.                                         case 3:                        // Day
  287.                                                 printf("Day:");
  288.                                                 putchar(16);        // Set cursor to the last 2 chars
  289.                                                 putchar(14);
  290.                                                 putchar((DayRTC/10)+48);
  291.                                                 putchar((DayRTC%10)+48);
  292.                                                 break;
  293.                                         case 4:                        // Hour
  294.                                                 printf("Hour:");
  295.                                                 putchar(16);        // Set cursor to the last 2 chars
  296.                                                 putchar(14);
  297.                                                 putchar((HourRTC/10)+48);
  298.                                                 putchar((HourRTC%10)+48);
  299.                                                 break;
  300.                                         case 5:                        // Minute
  301.                                                 printf("Minute:");
  302.                                                 putchar(16);        // Set cursor to the last 2 chars
  303.                                                 putchar(14);
  304.                                                 putchar((MinRTC/10)+48);
  305.                                                 putchar((MinRTC%10)+48);
  306.                                                 break;
  307.                                         case 6:                        // Second
  308.                                                 printf("Second:");
  309.                                                 putchar(16);        // Set cursor to the last 2 chars
  310.                                                 putchar(14);
  311.                                                 putchar((SecRTC/10)+48);
  312.                                                 putchar((SecRTC%10)+48);
  313.                                                 break;
  314.                                         default:
  315.                                                 break;
  316.                                 }        // End SWITCH
  317.                         }                // End if(ParaOld != Para)
  318.                 }                        // End if(KeyCmd != CmdOld)
  319.                 CmdOld = KeyCmd;
  320.                 KeyCmd = KeyScan();
  321.         }                                 // End while(!EndCMD)
  322. //        CmdOld = KeyCmd;
  323. //        putchar(7);                        // Cursor back 1 char
  324. //        putchar(23);                // Cursor blinking
  325. }

  326. void DisplayRTC(void)
  327. {
  328.         putchar(13);
  329.         hour = DP8573HOUR;                // Hour
  330.         timeH = hour >> 4;
  331.         putchar(timeH+48);
  332.         timeL = hour % 16;
  333.         putchar(timeL+48);
  334.         putchar(':');
  335.        
  336.         minute = DP8573MIN;                // Minute
  337.         timeH = minute >> 4;
  338.         putchar(timeH+48);
  339.         timeL = minute % 16;
  340.         putchar(timeL+48);
  341.         putchar(':');

  342.         second = DP8573SEC;                // Second
  343.         timeH = second >> 4;
  344.         putchar(timeH+48);
  345.         timeL = second % 16;
  346.         putchar(timeL+48);

  347.         putchar(' ');
  348.         putchar(' ');
  349.         year = DP8573YEAR;                // Year
  350.         timeH = year >> 4;
  351.         putchar(timeH+48);
  352.         putchar(25);                        // .
  353.         putchar(3);
  354.         timeL = year % 16;
  355.         putchar(timeL+48);

  356.         month = DP8573MONTH;        // Month
  357.         timeH = month >> 4;
  358.         putchar(timeH+48);
  359.         putchar(25);                        // .
  360.         putchar(3);
  361.         timeL = month % 16;
  362.         putchar(timeL+48);

  363.         day = DP8573DAY;                // Day
  364.         timeH = day >> 4;
  365.         putchar(timeH+48);
  366.         timeL = day % 16;
  367.         putchar(timeL+48);

  368.         secondOld = second;
  369.         minuteOld = minute;
  370.         hourOld =  hour;
  371.         yearOld = year;
  372.         monthOld = month;
  373.         dayOld = day;
  374. }

  375. void msTimer(void) interrupt 0 using 0  {
  376.   if (++msCNT == 1)  {        /* 1s */
  377.     Tsecond++;                        /* second counter    */
  378.     msCNT = 0;                        /* clear int counter */
  379.   }
  380. }

  381. main()
  382. {
  383.         UART_Init();
  384.         delay1s();
  385.         delay100ms();
  386.         putchar(15);        // Set VFD brightness
  387.         delay100ms();
  388.         putchar(0x20);        // Lowest brightness to reduce power consumption

  389.         // user-defined char #1: \05 \01; show with \01
  390.         putchar(5); putchar(1);
  391.         // SHI: 02 39 17 EE 45 A2 B1 C8 04 06 00
  392.         putchar(0x02);
  393.         putchar(0x39);
  394.         putchar(0x17);
  395.         putchar(0xEE);
  396.         putchar(0x45);
  397.         putchar(0xA2);
  398.         putchar(0xB1);
  399.         putchar(0xC8);
  400.         putchar(0x04);
  401.         putchar(0x06);
  402.         putchar(0x00);
  403.         // user-defined char #2: \05 \02; show with \02
  404.         putchar(5); putchar(2);
  405.         // JIAN: 40 17 90 4B A5 52 E9 54 BA 43 00
  406.         putchar(0x40);
  407.         putchar(0x17);
  408.         putchar(0x90);
  409.         putchar(0x4B);
  410.         putchar(0xA5);
  411.         putchar(0x52);
  412.         putchar(0xE9);
  413.         putchar(0x54);
  414.         putchar(0xBA);
  415.         putchar(0x43);
  416.         putchar(0x00);
  417.         // user-defined char #3: \05 \03; show with \03
  418.         putchar(5); putchar(3);
  419.         // RI: 00 1F 08 84 43 E1 10 88 7C 00 00
  420.         putchar(0x00);
  421.         putchar(0x1F);
  422.         putchar(0x08);
  423.         putchar(0x84);
  424.         putchar(0x43);
  425.         putchar(0xE1);
  426.         putchar(0x10);
  427.         putchar(0x88);
  428.         putchar(0x7C);
  429.         putchar(0x00);
  430.         putchar(0x00);
  431.         // user-defined char #4: \05 \04; show with \04
  432.         putchar(5); putchar(4);
  433.         // QI: 50 7F 95 4E E7 52 BB F4 AA 55 01 =or= 50 7D D4 AE 77 2A 9F EA A5 95 80
  434.         putchar(0x50);
  435.         putchar(0x7F);
  436.         putchar(0x95);
  437.         putchar(0x4E);
  438.         putchar(0xE7);
  439.         putchar(0x52);
  440.         putchar(0xBB);
  441.         putchar(0xF4);
  442.         putchar(0xAA);
  443.         putchar(0x55);
  444.         putchar(0x01);

  445.         putchar(22);        // Hide cursor
  446.         putchar(13);        // Reset display
  447.         putchar(1);
  448.         putchar(2);
  449.         putchar(':');
  450.         putchar(16);        // Set cursor position
  451.         putchar(11);
  452.         putchar(3);
  453.         putchar(4);
  454.         putchar('-');

  455.         delay1s();
  456.         DP8573A_Init();
  457.         P1 = 0x7F;                // P1: 1DO + 7DI
  458.         delay1s();

  459.         // Used to set RTC
  460. /*        DP8573MSR = 0x40;
  461.         DP8573RTMR = 0x00;
  462.         DP8573MIN = 54;
  463.         DP8573HOUR = 24;
  464.         DP8573DAY = 24;
  465.         DP8573MONTH = 3;
  466.         DP8573YEAR = 7;
  467.         DP8573MSR = 0x40;
  468.         DP8573RTMR = 0x08;
  469. */
  470.         DisplayRTC();
  471.         delay1s();
  472.         delay1s();
  473.         CmdOld = KeyScan();

  474.         while(1)
  475.         {
  476.                 hour = DP8573HOUR;                // Hour
  477.                 if (hour != hourOld) {
  478.                         putchar(16);                // Set cursor position
  479.                         putchar(0);
  480.                         timeH = hour >> 4;
  481.                         putchar(timeH+48);
  482.                         timeL = hour % 16;
  483.                         putchar(timeL+48);
  484.                         putchar(':');
  485.                         hourOld = hour;
  486.                 }
  487.                 minute = DP8573MIN;                // Minute
  488.                 if (minute != minuteOld) {
  489.                         putchar(16);                // Set cursor position
  490.                         putchar(3);
  491.                         timeH = minute >> 4;
  492.                         putchar(timeH+48);
  493.                         timeL = minute % 16;
  494.                         putchar(timeL+48);
  495.                         putchar(':');
  496.                         minuteOld = minute;
  497.                 }
  498.                 second = DP8573SEC;                // Second
  499.                 if (second != secondOld) {
  500.                         putchar(16);                // Set cursor position
  501.                         putchar(6);
  502.                         timeH = second >> 4;
  503.                         putchar(timeH+48);
  504.                         timeL = second % 16;
  505.                         putchar(timeL+48);
  506.                         secondOld = second;
  507.                 }
  508.                 year = DP8573YEAR;
  509.                 if (year != yearOld) {
  510.                         putchar(16);                // Set cursor position
  511.                         putchar(10);
  512.                         timeH = year >> 4;
  513.                         putchar(timeH+48);
  514.                         timeL = year % 16;
  515.                         putchar(timeL+48);
  516.                         yearOld = year;
  517.                 }
  518.                 month = DP8573MONTH;
  519.                 if (month != monthOld) {
  520.                         putchar(16);                // Set cursor position
  521.                         putchar(12);
  522.                         timeH = month >> 4;
  523.                         putchar(timeH+48);
  524.                         timeL = month % 16;
  525.                         putchar(timeL+48);
  526.                         yearOld = year;
  527.                 }
  528.                 day = DP8573DAY;
  529.                 if (day != dayOld) {
  530.                         putchar(16);                // Set cursor position
  531.                         putchar(14);
  532.                         timeH = day >> 4;
  533.                         putchar(timeH+48);
  534.                         timeL = day % 16;
  535.                         putchar(timeL+48);
  536.                         dayOld = day;
  537.                 }

  538.                 KeyCmd = KeyScan();
  539.                 if (KeyCmd == 1) {                // RTC adjustment
  540.                         AdjustRTC();
  541.                         DisplayRTC();
  542.                 }
  543.         }
  544. }
复制代码




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

使用道具 举报

沙发
ID:163578 发表于 2017-2-5 23:12 | 只看该作者
谢谢楼主,最近正好想做这个计时器用于CNC计算稼动率。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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