找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机MINI示波器2.0制作 LQFP48开源文件 PCB与源程序

  [复制链接]
跳转到指定楼层
楼主
原创作者是:老刘爱捣鼓 大家可以去看他的视频:https://space.bilibili.com/40587802

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


制作出来的实物图如下:


单片机源程序如下:
  1. /*
  2.     Mini DSO with STC MCU
  3.     操作说明:
  4.         主界面-选项设置模式:
  5.             单击编码器:切换开始/暂停采样
  6.             双击编码器:切换波形水平滚动模式/选项设置模式
  7.             长按编码器:进入设置界面
  8.             旋转编码器:修改当前参数
  9.             按下同时旋转编码器:在参数间切换
  10.             
  11.         主界面-波形水平滚动模式:
  12.             单击编码器:切换开始/暂停采样
  13.             双击编码器:切换波形水平滚动模式/选项设置模式
  14.             长按编码器:进入设置界面
  15.             旋转编码器:水平滚动波形(在暂停采样状态下有效)
  16.             按下同时旋转编码器:垂直滚动波形(仅在暂停采样状态下有效)
  17.             
  18.         设置界面:
  19.             单击编码器:无效
  20.             双击编码器:无效
  21.             长按编码器:返回主界面
  22.             旋转编码器:修改当前选项
  23.             按下同时旋转编码器:切换选项

  24.     主界面参数:
  25.         横轴时间区间:"500ms", "200ms", "100ms", "50ms", "20ms", "10ms","5ms", "2ms", "1ms", "500us", "200us", "100us"(100us仅在自动触发模式下可用)
  26.         纵轴电压区间:设定电压量程上限,最大30V,顺时针旋转编码器将电压上限设置为0则进入自动量程,逆时针旋转进入手动量程
  27.         触发值:设定触发电压值,触发位置被放在屏幕中心
  28.         触发方向:上下箭头,分别代表上升沿触发和下降沿触发
  29.         触发方式:
  30.             Auto(自动触发)  :连续采样,指示灯始终点亮,通过单击编码器控制启停;触发成功时,触发点位于屏幕中心,触发失败则波形无规律滚动,屏幕左侧显示Fail标志
  31.             Normal(普通触发):等待预采样,待指示灯亮起表示预采样结束,这时可以输入信号;
  32.                               触发成功后,显示波形,并继续等待下次触发;
  33.                               如果有新的触发成功,则自动显示新的波形,如没有新的触发成功则屏幕波形保持并一直等待下次触发;
  34.                               需注意设置正确的触发值,否则一直处于等待触发状态,屏幕不会显示波形
  35.             Single(单次触发):等待预采样,待指示灯亮起表示预采样结束,这时可以输入信号;
  36.                               触发成功后,显示波形,并停止采样,需用户单击编码器开始下次采样        
  37.                               需注意设置正确的触发值,否则一直处于等待触发状态,屏幕不会显示波形
  38.             
  39.     主界面状态显示:        
  40.         Run:正在采样
  41.         Stop:停止采样
  42.         Fail:自动模式下,触发值超出波形范围引起触发失败
  43.         Auto:自动量程
  44.             
  45.     设置界面选项:
  46.         PMode(绘图模式):
  47.             Vector:波形以矢量显示
  48.             Dots  :波形以点阵显示
  49.         LSB(采样系数):分压系数的100倍,比如用10k加2k的电阻进行分压,分压系数为(10+2/2)=6,LSB理论取值为6x100=600,根据实际电阻精度进行微调        
  50.         BRT:OLED亮度

  51.     保存设置:长按编码器退出设置界面时,设置界面和主界面的所有参数被保存到EEPROM

  52.     2020-04-30更新
  53.     1. 增加单次触发和普通触发功能,可自定义触发点用来捕捉波形变化
  54.     2. 按照规格书要求将ADC采样端口设置为高阻输入
  55.     2020-5-3更新
  56.     1. 增加波形频率显示
  57.     2. 使用编码器水平/垂直滚动波形
  58.     3. 使用编码器垂直缩放波形
  59.     4. 用户可设定触发电平
  60. */

  61. #include <reg51.h>
  62. #include "global.h"
  63. #include "delay.h"
  64. #include "adc_stc8.h"
  65. #include "config_stc.h"
  66. #include "settings.h"
  67. #include "chart.h"
  68. #include "ssd1306.h"

  69. // #include "uart.h"
  70. // #include "stdio.h"

  71. #define VBAT_UPDATE_FREQ 40 //电池电压信息的更新频率 VBAT_UPDATE_FREQ*25ms
  72. #define VBAT_LSB 600        //电池电压采样分压系数*100
  73. #define INT_0 0             //外部中断0序号,编码器旋转
  74. #define INT_1 2             //外部中断1序号,编码器按下
  75. #define TIMER_0 1           //定时器0中断序号

  76. void init()
  77. {
  78.     InSettings = 0;         //初始化开机界面
  79.     OptionInSettings = 0;   //初始化设置界面的选项编号
  80.     OptionInChart = 0;      //初始化主界面的选项标号
  81.     WaveScroll = 0;         //清零波形滚动标志
  82.     OptionChanged = 0;      //清零设置修改标志
  83.     ADCRunning = 1;         //置位采样标志
  84.     ADCInterrupt = 0;       //清零ADC中断标志
  85.     ADCComplete = 0;        //清零ADC完成标志
  86.     WaveUpdate = 0;         //清零波形更新标志
  87.     ClearWave = 0;          //清零清除波形标志
  88.     ClearDisplay = 1;       //置位清空屏幕标志
  89.     EC11PressAndRotate = 0; //清零编码器旋转标志
  90.     UpdateVbat = 0;         //清零采样电池电压标志
  91.     ADCComplete = 0;        //清零ADC完成采样标志
  92.     WaveFreq = 0;           //清零波形频率
  93.     TriPos = 50;            //初始化触发点位置
  94.     TriPosOffset = 0;       //初始化触发点偏移量
  95.     TriFail = 0;            //清零触发失败标志
  96.     VMax = 0;               //清零波形电压最大值
  97.     VMin = 0;               //清零波形电压最小值
  98.     WaveLengthSumNum = 0;   //清零波形长度求和次数
  99.     WaveLengthSum = 0;      //清零波形长度求和

  100.     /* 波形滚动模式下正在采样则禁用外部中断0(编码器旋转)
  101.        Disable external interrupt 0(Encoder rotation) in waveform scroll mode when sampling*/
  102.     if (ADCRunning && WaveScroll)
  103.         EX0 = 0;

  104.     /* 获取内部参考电压值
  105.        Get internal reference voltage */
  106.     BGV = GetBGV();
  107. }

  108. void runWhenInSettrings()
  109. {
  110.     P_Ready = 0;
  111.     ClearDisplay = 1;
  112.     while (InSettings)
  113.     {
  114.         /* 更新电池电压信息
  115.            Update voltage infor of battery */
  116.         if (UpdateVbat)
  117.         {
  118.             UpdateVbat = 0;
  119.             VBat = GetVoltage(ADC_BAT, VBAT_LSB);
  120.         }

  121.         /* 更新屏幕亮度
  122.            Update OLED Brightness */
  123.         if (OLED_BrightnessChanged)
  124.         {
  125.             OLED_BrightnessChanged = 0;
  126.             OLED_Write_Command(0x81);
  127.             OLED_Write_Command(OLED_Brightness * 10);
  128.         }

  129.         /* 更新参数
  130.            Update parameters */
  131.         if (DisplayUpdate)
  132.         {
  133.             DisplayUpdate = 0;
  134.             PlotSettings();
  135.             OLED_Display();
  136.         }
  137.     }

  138.     /* 保存设置
  139.        Save Settings */
  140.     EA = 0;
  141.     if (OptionChanged)
  142.     {
  143.         OptionChanged = 0;
  144.         ClearDisplay = 0;
  145.         /* 保存设置并显示保存状态
  146.            Save settings and display saving status*/
  147.         PlotSaveStatus(Save_Options());
  148.         OLED_Display();
  149.         Delay1000ms();
  150.     }

  151.     /* 退出settings后刷新屏幕
  152.        Redraw display after exit settings */
  153.     ClearDisplay = 1;
  154.     PlotChart();
  155.     OLED_Display();
  156.     IE0 = 0;
  157.     IE1 = 0;
  158.     EA = 1;
  159. }

  160. /*
  161.     ADCRuning=1
  162.     |        WaveUpdate=1
  163.     |        |        ClearWave=1
  164.     |        |        ClearWave=0
  165.     |        WaveUpdate=0
  166.     ADCRuning=0
  167.         DisplayUpdate=1
  168.             WaveUpdate=1
  169.             |        ClearWave=1
  170.             |        ClearWave=0
  171.             WaveUpdate=0
  172. */
  173. void runWhenADCInterrupt()
  174. {
  175.     ADCInterrupt = 0;
  176.     P_Ready = 0;

  177.     /* ADC采样运行
  178.        ADC Sampling Running */
  179.     if (ADCRunning)
  180.     {
  181.         EX0 = 0;

  182.         if (WaveUpdate)
  183.         {
  184.             WaveUpdate = 0;
  185.             ClearDisplay = 1;

  186.             /* 清空波形缓存
  187.                Clear waveform in buffer*/
  188.             if (ClearWave)
  189.             {
  190.                 ClearWave = 0;
  191.                 memset(ADCbuf, 0x00, SAMPLE_NUM * 2);
  192.                 WaveFreq = 0;
  193.                 TriFail = 0;
  194.                 VMax = 0;
  195.                 VMin = 0;
  196.                 PlotChart();
  197.             }
  198.             /* 显示缓存中的波形
  199.                Display waveform in buffer*/
  200.             else
  201.             {
  202.                 AnalyseData();
  203.                 PlotChart();
  204.                 PlotWave();
  205.             }
  206.         }
  207.         else
  208.         {
  209.             ClearDisplay = 0;
  210.             PlotChart();
  211.         }
  212.         OLED_Display();

  213.         /* ADCRuning和WaveScroll同时置位时,不开启外部中断0(编码器旋转)
  214.            Not to enable external interrupt 0(Encoder Rotation) when both of ADCRunning and WaveScroll set. */
  215.         if (!WaveScroll)
  216.         {
  217.             IE0 = 0;
  218.             EX0 = 1;
  219.         }
  220.     }

  221.     /* ADC采样停止
  222.        ADC Sampling Stopped */
  223.     else
  224.     {
  225.         while (!ADCRunning && !InSettings)
  226.         {
  227.             if (DisplayUpdate)
  228.             {
  229.                 EX0 = 0;
  230.                 DisplayUpdate = 0;
  231.                 if (WaveUpdate)
  232.                 {
  233.                     WaveUpdate = 0;
  234.                     /* 分析缓存中完成采样的采样数据
  235.                        Analyse completed sampling data in buffer */
  236.                     AnalyseData();
  237.                     ClearDisplay = 1;

  238.                     /* 清空屏幕,绘制波形
  239.                        Clear display and draw waveform */
  240.                     if (ScaleH == ScaleH_tmp)
  241.                     {
  242.                         /* 采样点数有限,不支持横向缩放波形,只有时间区间与完成采样的时间区间相同才绘制波形
  243.                            Since the sampling points limitation, scaling waveform along horizontal is not support.
  244.                            Show waveform only when time scale is same as that when sampling completed */
  245.                         PlotChart();
  246.                         PlotWave();
  247.                     }

  248.                     /* 清空屏幕,不绘制波形
  249.                        Clear display and no waveform */
  250.                     else
  251.                     {
  252.                         WaveFreq = 0; //清零WaveFreq,绘制界面时,频率位置会显示****Hz
  253.                         PlotChart();
  254.                     }
  255.                 }
  256.                 /* 只更新屏幕上的参数,波形不变
  257.                    Update parameters on display only, keep waveform */
  258.                 else
  259.                 {
  260.                     ClearDisplay = 0;
  261.                     PlotChart();
  262.                 }

  263.                 OLED_Display();
  264.                 IE0 = 0;
  265.                 EX0 = 1;
  266.             }
  267.         }
  268.     }
  269. }

  270. void runWhenADCComplete()
  271. {
  272.     /*  ADC采样完成 - 单次触发
  273.         ADC Sampling Complete - Single Trigger Mode */
  274.     if (TriMode == 2)
  275.     {
  276.         EX0 = 0;
  277.         ADCInterrupt = 1;
  278.         DisplayUpdate = 0;
  279.         WaveUpdate = 0;
  280.         ADCRunning = 0; //清零ADC运行标志,停止采样
  281.         AnalyseData();
  282.         ClearDisplay = 1;
  283.         PlotChart();
  284.         PlotWave();
  285.         OLED_Display();
  286.         IE0 = 0;
  287.         EX0 = 1;
  288.     }

  289.     /*  ADC采样完成 - 自动触发或普通触发
  290.         ADC Sampling Complete - Auto or Normal Trigger Mode */
  291.     else
  292.     {
  293.         //EX0 = 0;
  294.         ClearDisplay = 1; //置位清空屏幕标志
  295.         AnalyseData();    //分析采样数据
  296.         PlotChart();      //绘制主界面
  297.         PlotWave();       //绘制波形
  298.         OLED_Display();
  299.         //IE0 = 0;
  300.         //EX0 = 1;
  301.     }
  302. }

  303. /* 程序入口
  304.    Program Entry */
  305. void main()
  306. {
  307.     /* 将ADC端口P0.4,P0.6设置为高阻
  308.        Set ADC port P0.4, P0.6 as high-impedance */
  309.     P0M1 |= 0x50;
  310.     P0M0 &= ~0x50;

  311.     /* 设置指示灯端口P1.1为推挽输出
  312.        Set indicator port P1.1 as push-pull output */
  313.     P0M1 &= ~0x02;
  314.     P0M0 |= 0x02;

  315.     /* 设置编码器端口P3.2,P3.3,P3.4为准双向
  316.        Set Encoder port P3.2, P3.3, P3.4 as quasi bidirectional */
  317.     P3M1 &= ~0x1C;
  318.     P3M0 &= ~0x1C;

  319.     /* 设置OLED端口P2.3,P2.4,P2.5,P2.6,P2.7为准双向
  320.        Set OLED port P2.3, P2.4, P2.5, P2.6 as quasi bidirectional */
  321.     P2M1 &= ~0xF8;
  322.     P2M0 &= ~0xF8;

  323.     /* 编码器旋转外部中断
  324.        Interrupt for rotating of Encoder */
  325.     IT0 = 0; //外部中断0触发方式,上升沿和下降沿
  326.     PX0 = 1; //外部中断0高优先级,可打断按键中断,用于判断按下同时旋转
  327.     EX0 = 1; //开启外部中断0

  328.     /* 编码器按键外部中断
  329.        Interrupt for clicking of Encoder */
  330.     IT1 = 1; //外部中断1触发方式,下降沿
  331.     PX1 = 0; //外部中断1低优先级
  332.     EX1 = 1; //开启外部中断1

  333.     /* 定时器0,为更新电池电压信息计时
  334.        Timer 0, for updating voltage of battery */
  335.     AUXR &= 0x7F; //定时器时钟12T模式
  336.     TMOD &= 0xF0; //设置定时器模式
  337.     TL0 = 0x46;   //设置定时初值 //27MHz,25ms
  338.     TH0 = 0x24;   //设置定时初值
  339.     TF0 = 0;      //清除TF0标志
  340.     ET0 = 1;      //允许定时器0中断

  341.     /* 开总中断
  342.        Enable global interrupt */
  343.     EA = 1;

  344.     //UartInit();

  345.     Read_Options();
  346.     init();
  347.     OLED_Init();
  348.     OLED_SetFontWidth(6);
  349.     PlotChart();
  350.     OLED_Display();

  351.     while (1)
  352.     {
  353.         P_Ready = 0;

  354.         /* 采样波形
  355.            Sampling*/
  356.         GetWaveData();

  357.         /* 进入设置界面
  358.            Enter Settings Interface */
  359.         if (InSettings)
  360.         {
  361.             runWhenInSettrings();
  362.         }

  363.         /* ADC采样中断
  364.            ADC Sampling Interrupt */
  365.         else if (ADCInterrupt)
  366.         {
  367.             runWhenADCInterrupt();
  368.         }

  369.         /* ADC采样完成
  370.            ADC Sampling Complete */
  371.         else
  372.         {
  373.             runWhenADCComplete();
  374.         }
  375.     }
  376. }

  377. /* 分析编码器旋转
  378.    Analyse Rotation of Encoder */
  379. void Scan_EC11(void)
  380. {
  381.     /* 延时去抖动
  382.        Delay to remove jitter */
  383.     Delay500us();

  384.     /* 正转
  385.        Clockwise */
  386.     if (EC11_A != EC11_B)
  387.     {
  388.         Change_Val(1);
  389.     }

  390.     /* 反转
  391.        Anticlockwise */
  392.     else if (EC11_A == EC11_B)
  393.     {
  394.         Change_Val(0);
  395.     }
  396. }

  397. /* 编码器旋转中断
  398.    Interrput for Encoder Rotated */
  399. void INT0_interrupt(void) interrupt INT_0
  400. {
  401.     Delay500us();

  402.     /* 编码器是否被按下
  403.        Whether the Encoder is pressed */
  404.     if (!EC11_KEY)
  405.         EC11PressAndRotate = 1;
  406.     else
  407.         EC11PressAndRotate = 0;

  408.     Scan_EC11();
  409.     ADCInterrupt = 1;
  410.     DisplayUpdate = 1;
  411.     IE1 = 0; //清零外部中断1标志位
  412.     IE0 = 0; //清零外部中断0标志位
  413. }

  414. /* 编码器点击中断
  415.    Interrput for Encoder Pressed */
  416. void INT1_interrupt(void) interrupt INT_1
  417. {
  418.     Delay50ms();
  419.     if (!EC11_KEY)
  420.     {
  421.         EC11PressAndRotate = 0;

  422.         /*  长按编码器按键 - 切换主界面和设置界面
  423.             Long presse Encoder - Switch main interface and settings interface */
  424.         if (Delay800ms_Long_Press())
  425.         {
  426.             InSettings = ~InSettings;

  427.             /*  进入设置界面
  428.                 Enter Settings  */
  429.             if (InSettings)
  430.             {
  431.                 DisplayUpdate = 1;
  432.                 UpdateVbat = 1;
  433.                 TF0 = 0; //清零定时器0溢出标志
  434.                 TR0 = 1; //定时器0开始计时,开始电池电压信息更新计时
  435.                 IE0 = 0; //清零外部中断0中断标志
  436.                 EX0 = 1; //开启外部中断0(编码器旋转)
  437.             }

  438.             /*  回到主界面
  439.                 Retrurn to main interface   */
  440.             else
  441.             {
  442.                 TR0 = 0; //清零定时器0溢出标志
  443.                 TF0 = 0; //定时器0停止计时,停止电池电压信息更新计时
  444.                 WaveFreq = 0;
  445.                 TriFail = 0;
  446.                 VMax = 0;
  447.                 VMin = 0;
  448.                 DisplayUpdate = 1;
  449.                 WaveUpdate = 1;
  450.                 ClearWave = 0;
  451.             }
  452.             ADCInterrupt = 1;
  453.         }

  454.         /*  按住编码器同时旋转
  455.             Rotate Encoder while pressing  */
  456.         else if (EC11PressAndRotate)
  457.         {
  458.             /* 由编码器旋转中断执行操作
  459.                Operations Performed by Interrupt of Encoder Rotation */
  460.         }

  461.         /* 双击编码器按键 - 在主界面,滚动波形和选项模式之间切换
  462.            Double click Encoder - Switch between Waveform Scroll Mode and Parameter Mode in Main Interface */
  463.         else if (Delay300ms_Double_Click())
  464.         {
  465.             /* 主界面
  466.                Main Interface*/
  467.             if (!InSettings)
  468.             {
  469.                 WaveScroll = ~WaveScroll;
  470.                 OptionChanged = 1;
  471.                 ADCInterrupt = 1;
  472.                 DisplayUpdate = 1;
  473.                 ClearWave = 0;
  474.             }
  475.         }

  476.         /*  单击编码器按键 - 在主界面,切换Stop/Run状态
  477.             Single click Encoder - Switch Run/Stop in main interface    */
  478.         else if (!InSettings)
  479.         {
  480.             EX0 = 0;
  481.             ADCRunning = ~ADCRunning;
  482.             if (ADCRunning)
  483.             {
  484.                 WaveUpdate = 1;
  485.                 ClearWave = 1;
  486.             }
  487.             else
  488.             {
  489.                 DisplayUpdate = 1;
  490.                 WaveUpdate = 1;
  491.             }
  492.             ADCInterrupt = 1;
  493.             IE0 = 0;
  494.             IE1 = 0;
  495.         }
  496.     }
  497.     IE1 = 0;
  498. }

  499. /* 为更新Vbat计时
  500.    Timer for updating Vbat */
  501. void TIMER0_interrupt(void) interrupt TIMER_0
  502. {
  503.     static uint8 n;

  504.     if (++n >= VBAT_UPDATE_FREQ)
  505.     {
  506.         n = 0;
  507.         UpdateVbat = 1;
  508.         DisplayUpdate = 1;
  509.     }
  510. }
复制代码

所有资料51hei附件下载(PCB与代码):
MINI示波器2.0-LQFP48开源文件.7z (4.83 MB, 下载次数: 271)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:258542 发表于 2021-9-28 22:07 | 只看该作者
在b站上见过,很牛逼的一个
回复

使用道具 举报

板凳
ID:61493 发表于 2021-9-29 15:16 | 只看该作者
不错,那个屏能不能用在大一点的,那个OLED太小了
回复

使用道具 举报

地板
ID:229641 发表于 2021-10-2 21:11 来自手机 | 只看该作者
有么有iic屏幕的?
回复

使用道具 举报

5#
ID:804975 发表于 2021-10-4 00:52 | 只看该作者
这个视频我也看了。
回复

使用道具 举报

6#
ID:65369 发表于 2021-10-9 09:16 | 只看该作者
这个够给力了,放在十年前这个也不敢想象的
回复

使用道具 举报

7#
ID:971289 发表于 2021-10-14 08:46 | 只看该作者
水平相当可以,点赞
回复

使用道具 举报

8#
ID:229641 发表于 2021-10-14 21:02 来自手机 | 只看该作者
有iic的OLED屏幕版本的吗?
回复

使用道具 举报

9#
ID:588154 发表于 2021-10-24 19:29 | 只看该作者
为什么我下载程序的时候一直显示:正在检测目标单片机啊?
回复

使用道具 举报

10#
ID:588154 发表于 2021-10-24 19:30 | 只看该作者
为什么我给单片机烧录程序的时候一直显示:正在检测目标单片机啊?
单片机型号选正确了的、RX和TX也没接错。
回复

使用道具 举报

11#
ID:229830 发表于 2021-11-10 19:09 | 只看该作者
秦_瘦 发表于 2021-10-24 19:30
为什么我给单片机烧录程序的时候一直显示:正在检测目标单片机啊?
单片机型号选正确了的、RX和TX也没接错 ...

先点下载,再上电
回复

使用道具 举报

12#
ID:367875 发表于 2021-11-10 22:14 | 只看该作者
秦_瘦 发表于 2021-10-24 19:29
为什么我下载程序的时候一直显示:正在检测目标单片机啊?

单片机要重新上电
回复

使用道具 举报

13#
ID:230500 发表于 2021-11-26 00:17 | 只看该作者
厉害, 能把51挡32用的 都是软件高手达人,
回复

使用道具 举报

14#
ID:3802 发表于 2021-12-10 17:06 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

15#
ID:503691 发表于 2021-12-15 14:45 | 只看该作者
51黑有你更精彩
回复

使用道具 举报

16#
ID:977861 发表于 2021-12-21 22:41 | 只看该作者
主要技术参数如何?只能玩玩吧
回复

使用道具 举报

17#
ID:59202 发表于 2022-7-26 17:06 | 只看该作者
就是个玩具,不过初学者可以学习一下
回复

使用道具 举报

18#
ID:1025635 发表于 2022-7-26 19:28 | 只看该作者
主要技术参数(频率范围)等如何
回复

使用道具 举报

19#
ID:430492 发表于 2022-7-27 08:39 | 只看该作者
这个很大程度还是让电工们了解一下原理,实用的话还是很有限的。
回复

使用道具 举报

20#
ID:130135 发表于 2022-9-16 00:24 | 只看该作者
历害6666, 能把51挡32用的 都是软件高手达人,
回复

使用道具 举报

21#
ID:1102669 发表于 2023-12-8 11:18 | 只看该作者
电压采样不是很懂。
回复

使用道具 举报

22#
ID:390438 发表于 2023-12-16 08:13 | 只看该作者
有空做一个,使用锂电池供电,维修电源时的好助手
回复

使用道具 举报

23#
ID:165291 发表于 2024-2-2 10:19 | 只看该作者
牛人,哔哩哔哩上怎么找你?
回复

使用道具 举报

24#
ID:95809 发表于 2024-2-3 00:30 来自手机 | 只看该作者
做过一个,就是屏幕太小了,看着费劲。
回复

使用道具 举报

25#
ID:965040 发表于 2024-4-10 22:12 | 只看该作者
秦_瘦 发表于 2021-10-24 19:30
为什么我给单片机烧录程序的时候一直显示:正在检测目标单片机啊?
单片机型号选正确了的、RX和TX也没接错 ...

单片机重新上电,上电下载程序
回复

使用道具 举报

26#
ID:965040 发表于 2024-4-10 23:07 | 只看该作者
太牛了,大神作品
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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