迅维网
标题:
arduino单片机便携式数字示波器DIY过程
[打印本页]
作者:
バ幸福De右岸
时间:
2017-2-7 12:50
标题:
arduino单片机便携式数字示波器DIY过程
登录/注册后看高清大图
程序:
#include <U8glib.h> //声明库
U8GLIB_ST7920_128X64_4X u8g(13, 12, 11); // 声明液晶屏 13=sck, 12=mosi, 11=cs
int Input = A0; //声明输入引脚
int Key_add = 8; //声明按钮引脚
int Key_sub = 9;
int Key_hold = 10;
int x, y; //声明坐标
int i, i1, i2, V_min, V_max, V_mid, t, t0, t1, sta, Key = 1, hold = 0;
long Freq;
float Vpp;
int Y[96]; //声明信号值储存数组
int Buffer[192];
const uint8_t L[] PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x60,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x18,0x00,
0x00,0x70,0x40,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x3F,0xFC,0x00,
0x00,0x76,0x70,0x00,0x83,0xFC,0x00,0x0F,0xF0,0x00,0x03,0x80,0x01,0xFF,0x9C,0x00,
0x01,0x7E,0x70,0x01,0x9F,0xFC,0x00,0x3F,0xE0,0x01,0xC1,0x80,0x01,0x99,0x98,0x00,
0x01,0xFC,0x60,0x01,0xFC,0x1E,0x00,0x1C,0x00,0x01,0xC1,0x9C,0x01,0x99,0xF8,0x00,
0x01,0xF0,0xE0,0x01,0x83,0xB8,0x00,0x00,0x00,0x00,0xC3,0xFE,0x01,0xFE,0xC0,0x00,
0x00,0x7E,0xC6,0x03,0x87,0xE0,0x00,0x00,0x00,0x00,0x3F,0xFE,0x00,0x86,0x1E,0x00,
0x07,0xF8,0xFF,0x03,0x7D,0xC0,0x00,0x07,0xFF,0x00,0x39,0x98,0x00,0x06,0xFE,0x00,
0x01,0xFD,0xF8,0x00,0x33,0x80,0x0F,0xFF,0xFF,0x86,0x39,0x80,0x01,0xFF,0xF8,0x00,
0x01,0xFF,0xB0,0x00,0x07,0x00,0x0F,0xFF,0x00,0x07,0x39,0x80,0x01,0xFF,0x00,0x00,
0x07,0x27,0x30,0x00,0x07,0xFF,0x00,0x07,0x00,0x07,0x3F,0xF0,0x00,0x1F,0x80,0x00,
0x0E,0xFB,0x30,0x01,0xFF,0xFF,0x80,0x87,0x00,0x00,0x3F,0x70,0x00,0x38,0xF0,0x00,
0x08,0xFF,0xF0,0x0F,0xFF,0x80,0x00,0x87,0x38,0x00,0xBC,0x60,0x00,0x78,0x7E,0x00,
0x07,0xFD,0xE0,0x0F,0x03,0x80,0x01,0x87,0x3E,0x01,0xBF,0xE0,0x01,0xE0,0x3F,0x80,
0x1F,0xD8,0xE0,0x00,0x03,0x80,0x01,0x87,0x1E,0x03,0x33,0xE0,0x07,0x9C,0x7C,0x00,
0x08,0xD8,0xE0,0x00,0x03,0x80,0x03,0x87,0x0F,0x03,0x31,0xC0,0x01,0xFF,0xFE,0x00,
0x00,0xF1,0xF8,0x00,0x03,0x80,0x03,0x07,0x06,0x07,0x31,0xF0,0x01,0x8D,0x8C,0x00,
0x00,0xFF,0x3C,0x00,0x03,0x80,0x01,0x1F,0x00,0x07,0x67,0xFE,0x01,0x9D,0x9C,0x00,
0x01,0xFE,0x1F,0x00,0x3F,0x80,0x00,0x1F,0x00,0x06,0xDF,0x3F,0x81,0xFD,0xFC,0x00,
0x07,0x88,0x1F,0x80,0x1F,0x00,0x00,0x0F,0x00,0x00,0xB8,0x0F,0xC0,0xE0,0xC0,0x00,
0x06,0x00,0x00,0x00,0x0F,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,
0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x3C,0x0C,0x7F,0xC0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x7C,0x0C,0x7F,0xC0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xDC,0xEE,0x3C,0x7F,0xC0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x8F,0xC7,0x7C,0x03,0x80,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xC7,0x6C,0x03,0x80,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,0xC7,0x0C,0x07,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,0xC7,0x0C,0x06,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0xC7,0x0C,0x0E,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0xC7,0x0C,0x0E,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF1,0xC7,0x0C,0x0C,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xE0,0xEE,0x0C,0x1C,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFE,0x7E,0x0C,0x1C,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFE,0x7C,0x0C,0x1C,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
void setup( )
{
pinMode(Key_add, INPUT);
digitalWrite(Key_add, HIGH);
pinMode(Key_sub, INPUT);
digitalWrite(Key_sub, HIGH);
pinMode(Key_hold, INPUT);
digitalWrite(Key_hold, HIGH);
ADMUX = 0xe0;
ADCSRA = 0xe2;
u8g.setFont(u8g_font_5x7);
u8g.firstPage();
do {
u8g.drawBitmapP( 0, 0, 16, 64, L);
} while ( u8g.nextPage() );
delay(2000);
}
void sample( )
{ for (i = 0; i < 192; i++)
{
Buffer
= ADCH;
switch (Key)
{
case 1:
break;
case 2:
delayMicroseconds(4);
break;
case 3:
delayMicroseconds(10);
break;
case 4:
delayMicroseconds(23);
break;
case 5:
delayMicroseconds(60);
break;
case 6:
delayMicroseconds(123);
break;
case 7:
delayMicroseconds(248);
break;
case 8:
delayMicroseconds(623);
break;
case 9:
delayMicroseconds(1247);
break;
default: break;
}
}
}
void Measure()
{
V_max = Buffer[0];
V_min = Buffer[0];
for (i = 0; i < 192; i++)
{
if (Buffer
> V_max)
V_max = Buffer
;
if (Buffer
< V_min)
V_min = Buffer
;
}
V_mid = (V_max + V_min) / 2;
Vpp = (V_max - V_min) * 1.1 / 255;
for (i = 0; i < 97; i++)
{
if (Buffer
< V_mid && Buffer[i + 1] >= V_mid)
{
i1 = i;
break;
}
}
for (i = i1 + 1; i < 98 + i1; i++)
{
if (Buffer
< V_mid && Buffer[i + 1] >= V_mid)
{
i2 = i;
break;
}
}
t = i2 - i1;
if (t > 0)
Freq = 8000 / t;
else
Freq = 0;
}
void Transform( )
{
for (sta = 0; sta < 96; sta++)
{
if (Buffer[sta] < 128 && Buffer[sta + 2] > 128)
break;
}
for (i = 0; i < 96; i++)
Y
= 63 - (Buffer[i + sta] >> 2);
}
void draw( )
{
for (x = 0; x < 95; x++)
u8g.drawLine(x, Y[x], x, Y[x + 1]); //画线
//画边框
u8g.drawFrame(0, 0, 97, 64);
// 画坐标轴
u8g.drawLine(48, 0, 48, 63);
u8g.drawLine(0, 32, 96, 32);
for (x = 0; x < 96; x += 8)
u8g.drawLine(x, 31, x, 33);
for (y = 0; y < 64; y += 8)
u8g.drawLine(47, y, 49, y);
//画网格
for (x = 8; x < 96; x += 8)
{
for (y = 8; y < 64; y += 8)
u8g.drawPixel(x, y);
}
//显示参数
u8g.drawStr(98, 7, "MS/div");
u8g.drawStr(98, 23, "V/div");
u8g.drawStr(98, 30, "0.324");
u8g.drawStr(98, 40, "Vpp");
u8g.setPrintPos( 98, 47);
u8g.print(Vpp);
u8g.drawStr(118, 47, "V");
u8g.drawStr(98, 55, "F(HZ)");
switch (Key)
{
case 1:
u8g.drawStr(98, 14, "0.02");
u8g.setPrintPos( 98, 62);
u8g.print(Freq * 50);
break;
case 2:
u8g.drawStr(98, 14, "0.05");
u8g.setPrintPos( 98, 62);
u8g.print(Freq * 20);
break;
case 3:
u8g.drawStr(98, 14, " 0.1");
u8g.setPrintPos( 98, 62);
u8g.print(Freq * 10);
break;
case 4:
u8g.drawStr(98, 14, " 0.2");
u8g.setPrintPos( 98, 62);
u8g.print(Freq * 5);
break;
case 5:
u8g.drawStr(98, 14, " 0.5");
u8g.setPrintPos( 98, 62);
u8g.print(Freq * 2);
break;
case 6:
u8g.drawStr(98, 14, " 1");
u8g.setPrintPos( 98, 62);
u8g.print(Freq);
break;
case 7:
u8g.drawStr(98, 14, " 2");
u8g.setPrintPos( 98, 62);
u8g.print(Freq / 2);
break;
case 8:
u8g.drawStr(98, 14, " 5");
u8g.setPrintPos( 98, 62);
u8g.print(Freq / 5);
break;
case 9:
u8g.drawStr(98, 14, " 10");
u8g.setPrintPos( 98, 62);
u8g.print(Freq / 10);
break;
default: break;
}
}
//键盘扫描
void Key_scan()
{
if (digitalRead(Key_add) == LOW)
{
while (digitalRead(Key_add) == LOW);
Key++;
if (Key == 10)
Key = 9;
delay(10);
}
if (digitalRead(Key_sub) == LOW)
{
while (digitalRead(Key_sub) == LOW);
Key--;
if (Key == 0)
Key = 1;
delay(10);
}
if (digitalRead(Key_hold) == LOW)
{
while (digitalRead(Key_hold) == LOW);
hold = ~hold;
delay(10);
}
}
void loop( )
{
sample( );
Measure( );
Transform( );
Key_scan( );
if (hold == 0)
{
u8g.firstPage( );
do
{
draw( );
}
while ( u8g.nextPage( ));
}
}
[color=rgb(51, 102, 153) !important]
复制代码
[color=rgb(51, 102, 153) !important]
作者:
yucongwu7410
时间:
2017-2-7 21:27
本帖最后由 yucongwu7410 于 2017-2-7 21:29 编辑
那一堆0x00的信号值储存数组是怎么调用的?U8glib.h库里包含了哪些东西
作者:
バ幸福De右岸
时间:
2017-2-8 06:37
yucongwu7410 发表于 2017-2-7 21:27
那一堆0x00的信号值储存数组是怎么调用的?U8glib.h库里包含了哪些东西
这个帖子是转载的,这里面的东西我也不明白..不好意思了
作者:
沈元
时间:
2017-3-7 14:16
这样做出来的示波器 只有几M的带宽吧
欢迎光临 迅维网 (https://www.chinafix.com/)
Powered by Discuz! X3.4