微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > arduino单片机便携式数字示波器DIY过程

arduino单片机便携式数字示波器DIY过程

时间:10-02 整理:3721RD 点击:

电路图:


程序:

  1. #include <U8glib.h> //声明库
  2. U8GLIB_ST7920_128X64_4X u8g(13, 12, 11); // 声明液晶屏  13=sck, 12=mosi, 11=cs
  3. int Input = A0;  //声明输入引脚
  4. int Key_add = 8;  //声明按钮引脚
  5. int Key_sub = 9;
  6. int Key_hold = 10;
  7. int x, y; //声明坐标
  8. int i, i1, i2, V_min, V_max, V_mid, t, t0, t1, sta, Key = 1, hold = 0;
  9. long Freq;
  10. float Vpp;
  11. int Y[96]; //声明信号值储存数组
  12. int Buffer[192];
  13. const uint8_t L[] PROGMEM = {
  14.   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  15. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  16. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  17. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  18. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  19. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  20. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  21. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  22. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  23. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  24. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  25. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  26. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  27. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  28. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  29. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  30. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  31. 0x00,0x60,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x18,0x00,
  32. 0x00,0x70,0x40,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x3F,0xFC,0x00,
  33. 0x00,0x76,0x70,0x00,0x83,0xFC,0x00,0x0F,0xF0,0x00,0x03,0x80,0x01,0xFF,0x9C,0x00,
  34. 0x01,0x7E,0x70,0x01,0x9F,0xFC,0x00,0x3F,0xE0,0x01,0xC1,0x80,0x01,0x99,0x98,0x00,
  35. 0x01,0xFC,0x60,0x01,0xFC,0x1E,0x00,0x1C,0x00,0x01,0xC1,0x9C,0x01,0x99,0xF8,0x00,
  36. 0x01,0xF0,0xE0,0x01,0x83,0xB8,0x00,0x00,0x00,0x00,0xC3,0xFE,0x01,0xFE,0xC0,0x00,
  37. 0x00,0x7E,0xC6,0x03,0x87,0xE0,0x00,0x00,0x00,0x00,0x3F,0xFE,0x00,0x86,0x1E,0x00,
  38. 0x07,0xF8,0xFF,0x03,0x7D,0xC0,0x00,0x07,0xFF,0x00,0x39,0x98,0x00,0x06,0xFE,0x00,
  39. 0x01,0xFD,0xF8,0x00,0x33,0x80,0x0F,0xFF,0xFF,0x86,0x39,0x80,0x01,0xFF,0xF8,0x00,
  40. 0x01,0xFF,0xB0,0x00,0x07,0x00,0x0F,0xFF,0x00,0x07,0x39,0x80,0x01,0xFF,0x00,0x00,
  41. 0x07,0x27,0x30,0x00,0x07,0xFF,0x00,0x07,0x00,0x07,0x3F,0xF0,0x00,0x1F,0x80,0x00,
  42. 0x0E,0xFB,0x30,0x01,0xFF,0xFF,0x80,0x87,0x00,0x00,0x3F,0x70,0x00,0x38,0xF0,0x00,
  43. 0x08,0xFF,0xF0,0x0F,0xFF,0x80,0x00,0x87,0x38,0x00,0xBC,0x60,0x00,0x78,0x7E,0x00,
  44. 0x07,0xFD,0xE0,0x0F,0x03,0x80,0x01,0x87,0x3E,0x01,0xBF,0xE0,0x01,0xE0,0x3F,0x80,
  45. 0x1F,0xD8,0xE0,0x00,0x03,0x80,0x01,0x87,0x1E,0x03,0x33,0xE0,0x07,0x9C,0x7C,0x00,
  46. 0x08,0xD8,0xE0,0x00,0x03,0x80,0x03,0x87,0x0F,0x03,0x31,0xC0,0x01,0xFF,0xFE,0x00,
  47. 0x00,0xF1,0xF8,0x00,0x03,0x80,0x03,0x07,0x06,0x07,0x31,0xF0,0x01,0x8D,0x8C,0x00,
  48. 0x00,0xFF,0x3C,0x00,0x03,0x80,0x01,0x1F,0x00,0x07,0x67,0xFE,0x01,0x9D,0x9C,0x00,
  49. 0x01,0xFE,0x1F,0x00,0x3F,0x80,0x00,0x1F,0x00,0x06,0xDF,0x3F,0x81,0xFD,0xFC,0x00,
  50. 0x07,0x88,0x1F,0x80,0x1F,0x00,0x00,0x0F,0x00,0x00,0xB8,0x0F,0xC0,0xE0,0xC0,0x00,
  51. 0x06,0x00,0x00,0x00,0x0F,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,
  52. 0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  53. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  54. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  55. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  56. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  57. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  58. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  59. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  60. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x3C,0x0C,0x7F,0xC0,
  61. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x7C,0x0C,0x7F,0xC0,
  62. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xDC,0xEE,0x3C,0x7F,0xC0,
  63. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x8F,0xC7,0x7C,0x03,0x80,
  64. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xC7,0x6C,0x03,0x80,
  65. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,0xC7,0x0C,0x07,0x00,
  66. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,0xC7,0x0C,0x06,0x00,
  67. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0xC7,0x0C,0x0E,0x00,
  68. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0xC7,0x0C,0x0E,0x00,
  69. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF1,0xC7,0x0C,0x0C,0x00,
  70. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xE0,0xEE,0x0C,0x1C,0x00,
  71. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFE,0x7E,0x0C,0x1C,0x00,
  72. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFE,0x7C,0x0C,0x1C,0x00,
  73. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  74. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  75. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  76. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  77. };

  78. void setup( )
  79. {
  80.   pinMode(Key_add, INPUT);
  81.   digitalWrite(Key_add, HIGH);
  82.   pinMode(Key_sub, INPUT);
  83.   digitalWrite(Key_sub, HIGH);
  84.   pinMode(Key_hold, INPUT);
  85.   digitalWrite(Key_hold, HIGH);
  86.   ADMUX = 0xe0;
  87.   ADCSRA = 0xe2;
  88.   u8g.setFont(u8g_font_5x7);
  89.   u8g.firstPage();
  90.   do {
  91.     u8g.drawBitmapP( 0, 0, 16, 64, L);
  92.   } while ( u8g.nextPage() );
  93.   delay(2000);
  94. }


  95. void sample( )
  96. { for (i = 0; i < 192; i++)
  97.   {
  98.     Buffer[i] = ADCH;
  99.     switch (Key)
  100.     {
  101.       case 1:
  102.         break;
  103.       case 2:
  104.         delayMicroseconds(4);
  105.         break;
  106.       case 3:
  107.         delayMicroseconds(10);
  108.         break;
  109.       case 4:
  110.         delayMicroseconds(23);
  111.         break;
  112.       case 5:
  113.         delayMicroseconds(60);
  114.         break;
  115.       case 6:
  116.         delayMicroseconds(123);
  117.         break;
  118.       case 7:
  119.         delayMicroseconds(248);
  120.         break;
  121.       case 8:
  122.         delayMicroseconds(623);
  123.         break;
  124.       case 9:
  125.         delayMicroseconds(1247);
  126.         break;
  127.       default: break;
  128.     }
  129.   }
  130. }

  131. void Measure()
  132. {
  133.   V_max = Buffer[0];
  134.   V_min = Buffer[0];
  135.   for (i = 0; i < 192; i++)
  136.   {
  137.     if (Buffer[i] > V_max)
  138.       V_max = Buffer[i];
  139.     if (Buffer[i] < V_min)
  140.       V_min = Buffer[i];
  141.   }
  142.   V_mid = (V_max + V_min) / 2;
  143.   Vpp = (V_max - V_min) * 1.1 / 255;
  144.   for (i = 0; i < 97; i++)
  145.   {
  146.     if (Buffer[i] < V_mid && Buffer[i + 1] >= V_mid)
  147.     {
  148.       i1 = i;
  149.       break;
  150.     }
  151.   }
  152.   for (i = i1 + 1; i < 98 + i1; i++)
  153.   {
  154.     if (Buffer[i] < V_mid && Buffer[i + 1] >= V_mid)
  155.     {
  156.       i2 = i;
  157.       break;
  158.     }
  159.   }
  160.   t = i2 - i1;
  161.   if (t > 0)
  162.     Freq = 8000 / t;
  163.   else
  164.     Freq = 0;
  165. }

  166. void Transform( )
  167. {
  168.   for (sta = 0; sta < 96; sta++)
  169.   {
  170.     if (Buffer[sta] < 128 && Buffer[sta + 2] > 128)
  171.       break;
  172.   }
  173.   for (i = 0; i < 96; i++)
  174.     Y[i] =  63 - (Buffer[i + sta] >> 2);
  175. }

  176. void draw( )
  177. {
  178.   for (x = 0; x < 95; x++)
  179.     u8g.drawLine(x, Y[x], x, Y[x + 1]); //画线

  180.   //画边框
  181.   u8g.drawFrame(0, 0, 97, 64);
  182.   // 画坐标轴
  183.   u8g.drawLine(48, 0, 48, 63);
  184.   u8g.drawLine(0, 32, 96, 32);
  185.   for (x = 0; x < 96; x += 8)
  186.     u8g.drawLine(x, 31, x, 33);
  187.   for (y = 0; y < 64; y += 8)
  188.     u8g.drawLine(47, y, 49, y);
  189.   //画网格
  190.   for (x = 8; x < 96; x += 8)
  191.   {
  192.     for (y = 8; y < 64; y += 8)
  193.       u8g.drawPixel(x, y);
  194.   }
  195.   //显示参数
  196.   u8g.drawStr(98, 7, "MS/div");
  197.   u8g.drawStr(98, 23, "V/div");
  198.   u8g.drawStr(98, 30, "0.324");
  199.   u8g.drawStr(98, 40, "Vpp");
  200.   u8g.setPrintPos( 98, 47);
  201.   u8g.print(Vpp);
  202.   u8g.drawStr(118, 47, "V");
  203.   u8g.drawStr(98, 55, "F(HZ)");
  204.   switch (Key)
  205.   {
  206.     case  1:
  207.       u8g.drawStr(98, 14, "0.02");
  208.       u8g.setPrintPos( 98, 62);
  209.       u8g.print(Freq * 50);
  210.       break;
  211.     case  2:
  212.       u8g.drawStr(98, 14, "0.05");
  213.       u8g.setPrintPos( 98, 62);
  214.       u8g.print(Freq * 20);
  215.       break;
  216.     case  3:
  217.       u8g.drawStr(98, 14, " 0.1");
  218.       u8g.setPrintPos( 98, 62);
  219.       u8g.print(Freq * 10);
  220.       break;
  221.     case  4:
  222.       u8g.drawStr(98, 14, " 0.2");
  223.       u8g.setPrintPos( 98, 62);
  224.       u8g.print(Freq * 5);
  225.       break;
  226.     case  5:
  227.       u8g.drawStr(98, 14, " 0.5");
  228.       u8g.setPrintPos( 98, 62);
  229.       u8g.print(Freq * 2);
  230.       break;
  231.     case  6:
  232.       u8g.drawStr(98, 14, "  1");
  233.       u8g.setPrintPos( 98, 62);
  234.       u8g.print(Freq);
  235.       break;
  236.     case  7:
  237.       u8g.drawStr(98, 14, "  2");
  238.       u8g.setPrintPos( 98, 62);
  239.       u8g.print(Freq / 2);
  240.       break;
  241.     case  8:
  242.       u8g.drawStr(98, 14, "  5");
  243.       u8g.setPrintPos( 98, 62);
  244.       u8g.print(Freq / 5);
  245.       break;
  246.     case  9:
  247.       u8g.drawStr(98, 14, " 10");
  248.       u8g.setPrintPos( 98, 62);
  249.       u8g.print(Freq / 10);
  250.       break;
  251.     default: break;
  252.   }
  253. }

  254. //键盘扫描
  255. void Key_scan()
  256. {
  257.   if (digitalRead(Key_add) == LOW)
  258.   {
  259.     while (digitalRead(Key_add) == LOW);
  260.     Key++;
  261.     if (Key == 10)
  262.       Key = 9;
  263.     delay(10);
  264.   }
  265.   if (digitalRead(Key_sub) == LOW)
  266.   {
  267.     while (digitalRead(Key_sub) == LOW);
  268.     Key--;
  269.     if (Key == 0)
  270.       Key = 1;
  271.     delay(10);
  272.   }
  273.   if (digitalRead(Key_hold) == LOW)
  274.   {
  275.     while (digitalRead(Key_hold) == LOW);
  276.     hold = ~hold;
  277.     delay(10);
  278.   }
  279. }

  280. void loop( )
  281. {
  282.   sample( );
  283.   Measure( );
  284.   Transform( );
  285.   Key_scan( );
  286.   if (hold == 0)
  287.   {
  288.     u8g.firstPage( );
  289.     do
  290.     {
  291.       draw( );
  292.     }
  293.     while ( u8g.nextPage( ));
  294.   }
  295. }

复制代码


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top