找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 17127|回复: 25
收起左侧

51单片机简单示波器 带LM393迟滞比较器与12864显示波形 附源码

  [复制链接]
ID:93248 发表于 2018-5-16 21:58 | 显示全部楼层 |阅读模式
一、系统构成
    STC12C5A60S2单片机内部AD采样;LCD12864显示波形;LM393组成迟滞比较器测量小信号频率,不需要频率显示时该部分可以省略。
    为最大程度简化设计,信号通过电容直接进入单片机AD输入端,无输入时,通过调整R10使波形处于中心线位置即可。
二、基本功能
    1、时间每格:10ms/5ms/2ma/1ms/500us/200us/100us/50us/20us。基本能显示20~20Kh信号。
    2、电压每格:1V/0.5V/0.2V。
    3、HOLD功能:冻结波形后,左右平移能显示共4屏(含当前屏)波形。
    4、自带一路5Khz方波输出。
    5、用户设置参数断电保持。该功能对电源电压稳定性要求较高,欠压或过压参数会被冲掉或不能正常开机。
三、使用说明
    1、K6按键,坐标线样式转换:(1)散点加坐标线,该样式参考了上一届DIY大赛吴老师的示波器显示样式;(2)仅有坐标线;(3)空白。三种样式轮流切换。
    2、K1按键,波形冻结与正常显示切换。波形冻结状态下,左下角显示频率的地方会显示HOLD MODE。
    3、K2/K3,每格电压值调整,1V/0.5V/0.2V轮流切换。
    4、K4/K5,正常显示时,调整每格时间;波形冻结后,实现波形平移。所以在波形冻结状态下是不能调节时间的!

实物图:
实物.png 8.png 7.png 6.png 5.png 4.png 3.png 2.png 1.png

电路原理图如下:
0.png 0.png

单片机源程序如下:
  1. #include <stdio.h>
  2. #include <intrins.h>
  3. #include "ADC.h"
  4. #include "PCA.h"
  5. #include "Chars.h"
  6. #include "EEPROM.h"
  7. #include "LCD12864.h"
  8. #include "STC12C5A60S2.h"

  9. //时间/每格3-10ms 4-5ms 5-2ms 6-1ms 7-500us 8-200us 9-100us 10-50us 11-20us 12-10us
  10. unsigned char timpd;                        
  11. unsigned char volpd;                                        //示波器 电压/每格 1--1V/d,2--0.5V/d,3--0.2V/d
  12. unsigned long freqin;                                        //示波器输入的信号频率,单位Hz
  13. unsigned int  T1count;                                        //T1定时器,频率计数
  14. unsigned int  PCA0loop;                                        //PCA0循环初值
  15. unsigned int  PCA1loop;                                        //PCA1循环初值
  16. unsigned int  PCA0count;                                //PCA0计时累计
  17. unsigned int  PCA1count;                                //PCA1循环递增值,即输出方波周期/2.5
  18. unsigned int  samptime;                                        //采样时间,即定时器0的初值
  19. unsigned int  T0count;                                        //定时器采样时间间隔计数
  20. unsigned int  index;                                        //每次采样的wave0数组下标
  21. unsigned int  shiftindex;                                //移位时数组下标位置
  22. unsigned char hold;                                                //hold键标志位
  23. unsigned char autotim;                                        //是否根据频率自动选择时间每格,是=1,否=其它
  24. unsigned char shift;                                        //hold状态移位标志位。1、左移;2、右移
  25. //unsigned char grid;                                        //点格样式
  26. unsigned char shap;                                            //波形失真修正,上下轮流显示
  27. unsigned char ROMEN;                                        //需要写EEPROM时=0x55;不需要=其它
  28. unsigned char EEPROM[5];                                //四字节掉电保存数据,点格样式,时间/每格,电压/每格,波形样式,自动选时间档
  29. unsigned char idata wave[127];                        //当前显示数组
  30. unsigned char xdata wave0[512];                        //采样数组,处于不断更新状态
  31. unsigned char xdata wavep[512];                        //显示及HOLD缓存数组

  32. //******************************************************************//
  33. //小于100us/div(50/20/10)采用直接采样,软件延时
  34. //大于等于100us/div采用定时器采样
  35. //******************************************************************//

  36. void main(void)
  37. {
  38.         unsigned char disp;                                        //disp显示刷新标志位
  39.         unsigned char grid;                                        //点格样式
  40.         unsigned char wavemode;                                //波形样式
  41. //        unsigned char volmax;        
  42.         unsigned int i,j;
  43.         unsigned int delaybtn;                                //按键消抖延时
  44.         unsigned long int delay,delaymin,freqauto;        

  45.         disp=0;
  46.     freqin=0;
  47.         autotim=0;                                                        //默认设置,手动
  48.         timpd=8;                                                        //默认设置200us/div                                                        
  49.         volpd=1;                                                        //默认设置1V/div                                       
  50.         index=0;                                                            //赋值0非常重要
  51.         shiftindex=0;
  52.         T0count=0;
  53.         T1count=0;
  54.         PCA0loop=50000;                                                //PCA0定时20ms  //不分频时PCA0loop=62500; 480个周期1s
  55.         PCA0count=0;
  56.         //PCA1loop=15000;                                                //PCA1(P1.4)输出500Hz方波(产生LCD负压),本程序没开启                                                
  57.         //PCA1count=15000;
  58.         hold=0;
  59.         shift=0;
  60.         grid=1;                                                                //默认设置,坐标线
  61.         wavemode=1;                                                        //默认设置,粗线;=2细线
  62.         samptime=0xfee3;                                        //精确延时100us,此值严禁任何改动samptime=0xfee2;        
  63.         EEPROM[0]=grid;
  64.           EEPROM[1]=timpd;  
  65.           EEPROM[2]=volpd;  
  66.         EEPROM[3]=wavemode;
  67.         EEPROM[4]=autotim;
  68.         ROMEN=0x55;                                                        //临时测试,正式必须=0;

  69.         //M1/M0:00弱上拉,01强推挽,10输入(高阻),11开漏
  70.         P0M1=0x00;P0M0=0x00;                                //
  71.         P1M1=0xee;P1M0=0x11;                                //P1.0/P1.4推挽输出,其余设为输入
  72.         P2M1=0x00;P2M0=0x00;                                //
  73.         P3M1=0x00;P3M0=0x00;                                //

  74.         init_st7565();                                                //12864初始化

  75.         dispchar16(1,8,16,7,HZ1);                        //开机LOGO
  76.         write_string8(3,16,"www.crystalradio.cn");
  77.         dispchar16(5,10,12,9,HZ2);

  78.         ADCinit();
  79.         timerinit();
  80.         PCAinit();

  81.         //for(i=500;i>0;i--)for(j=5000;j>0;j--);        //延时1

  82.         IAPReadData(0,5,EEPROM);                        //读取上一次关机前最后的用户设置
  83.         if((EEPROM[0]>=0)&&(EEPROM[0]<=2)&&(EEPROM[1]>=3)&&(EEPROM[1]<=16)
  84.         &&(EEPROM[2]>=1)&&(EEPROM[2]<=4)&&(EEPROM[3]>=1)&&(EEPROM[3]<=2)&&(EEPROM[4]==0)||(EEPROM[4]==1))
  85.         {                                                                        //读取到合法设置则赋值,否则显示默认设置
  86.                 grid=EEPROM[0];
  87.                   timpd=EEPROM[1];  
  88.                   volpd=EEPROM[2];
  89.                 wavemode=EEPROM[3];
  90.              autotim=EEPROM[4];
  91.         }
  92.         
  93.         //for(i=500;i>0;i--)for(j=5000;j>0;j--);                //延时2

  94.         disp_grid(grid);                                        //显示网格
  95.     disp_osc_settings();                                //显示示波器设置

  96.         while(1)
  97.         {
  98.                 //---------------------1、采样-----------------------//
  99.                 //按了HOLD键,采样继续,但不允许对wavep缓存数组更新
  100.                 if(hold==0)
  101.                 {
  102.                         switch(timpd)        
  103.                         {
  104.                                 case  3:
  105.                                 case  4:                                        //5ms/div
  106.                                 case  5:                                        //2ms/div
  107.                                 case  6:                                        //1ms/div
  108.                                 case  7:                                        //500us/div
  109.                                 case  8:                                        //200us/div
  110.                                 case  9:                                        //100us/div
  111.                                 {
  112.                                         TR0=1;ET0=1;
  113.                                         if(index>=511)                        
  114.                                         {
  115.                                                 for(i=0;i<512;i++)
  116.                                                 {
  117.                                                         wavep[i]=wave0[i];
  118.                                                 }
  119.                                                 index=0;                        //采样下一组数据
  120.                                                 disp=1;                                //刷新标志置位
  121.                                         }
  122.                                         break;
  123.                                 }
  124.                                 case  10:                                        //50us/div
  125.                                 {        
  126.                                         TR0=0;ET0=0;
  127.                                         for(i=0;i<512;i++)                //50us/div
  128.                                         {
  129.                                                 wavep[i]=getADC(1);
  130.                                                 _nop_();_nop_();
  131.                                                 _nop_();_nop_();
  132.                                         }
  133.                                         disp=1;                                        //刷新标志置位
  134.                                         break;
  135.                                 }
  136.                                 case  11:                                        //20us(40us插值得来)
  137.                                 {
  138.                                         TR0=0;ET0=0;
  139.                                         fastADC();
  140.                                         for(i=0;i<512;i++)          //赋值(包含插值运算)
  141.                                         {
  142.                                                 if(!(i%2))
  143.                                                 {wavep[i]=wave0[i/2];}
  144.                                                 else
  145.                                                 {wavep[i]=(unsigned int)(wave0[i/2]+wave0[i/2+1])/2;}
  146.                                         }
  147.                                         disp=1;                                        //刷新标志置位
  148.                                         break;
  149.                                 }
  150.                                 case  12:                                        //10us(40us两次插值得来)
  151.                                 {
  152.                                         TR0=0;ET0=0;
  153.                                         fastADC();
  154.                                         for(i=0;i<512;i++)          //赋值(包含插值运算)
  155.                                         {
  156.                                                 if(!(i%2))
  157.                                                 {wavep[i]=wave0[i/2];}
  158.                                                 else
  159.                                                 {wavep[i]=(unsigned int)(wave0[i/2]+wave0[i/2+1])/2;}
  160.                                         }
  161.                                         for(i=0;i<512;i++)          //赋值(包含插值运算)
  162.                                         {
  163.                                                 wave0[i]=wavep[i];
  164.                                         }
  165.                                         for(i=0;i<512;i++)          //赋值(包含插值运算)
  166.                                         {
  167.                                                 if(!(i%2))
  168.                                                 {wavep[i]=wave0[i/2];}
  169.                                                 else
  170.                                                 {wavep[i]=(unsigned int)(wave0[i/2]+wave0[i/2+1])/2;}
  171.                                         }
  172.                                         disp=1;                                        //刷新标志置位
  173.                                         break;        
  174.                                 }
  175.                         }//switch(timpd)采样结束
  176.                 }

  177.                 //-------------------2-1:波形触发处理-----------------//
  178.                 if((disp==1)&&(hold==0))                        //接收到新数据且正常显示时才处理
  179.                 {
  180.                         for(i=2;i<127;i++)               
  181.                         {
  182.                                 if( (((signed int)wavep[i-2]-127)<=0)&&(((signed int)wavep[i-1]-127)<=0)//&&(((signed int)wavep[i]-127)<=0)
  183.                                 &&(((signed int)wavep[i+1]-127)>=0)&&(((signed int)wavep[i+2]-127)>=0)&&(((signed int)wavep[i+3]-127)>0) )
  184.                                 {        
  185.                                         shiftindex=i;
  186.                                         break;
  187.                                 }               
  188.                         }
  189.                 }//if((disp==1)&&(hold==0))波形触发处理结束

  190.                 //-------------------2-2:HOLD状态移位处理-----------------//
  191.                 if(hold==1)
  192.                 {
  193.                         if(shift==2)                                        //左移
  194.                         {
  195.                                 shiftindex=shiftindex+9;
  196.                                 if((shiftindex+126)>=512)
  197.                                 {
  198.                                         shiftindex=shiftindex-9;
  199.                                 }
  200.                         }
  201.                         if(shift==1)                                        //右移
  202.                         {
  203.                                 shiftindex=shiftindex-9;        //注意无符号数
  204.                                 if(shiftindex>512)                        //相当于判断小于0
  205.                                 {
  206.                                         shiftindex=shiftindex+9;//防止无限递减
  207.                                 }
  208.                         }
  209.                 }

  210.                 //-------------------3、电压衰减处理-----------------//
  211.                 switch(volpd)                                        //此部分余数计算可能有问题,需改进
  212.                 {
  213.                         case  1:                                        //1v/div
  214.                         {
  215.                                 for(i=0;i<127;i++)                  
  216.                                 {
  217.                                         if(((signed int)wavep[i+shiftindex]>=127))
  218.                                         {
  219.                                                 if(((wavep[i+shiftindex]-127)*35/256)<128)
  220.                                                         wave[i]=(unsigned int)(wavep[i+shiftindex]-127)*35/256+28;
  221.                                                 else
  222.                                                         wave[i]=(unsigned int)(wavep[i+shiftindex]-127)*35/256+29;
  223.                                         }
  224.                                         else
  225.                                         {
  226.                                                 if(((127-wavep[i+shiftindex])*35/256)<128)
  227.                                                         wave[i]=27-(unsigned int)(127-wavep[i+shiftindex])*35/256;
  228.                                                 else
  229.                                                         wave[i]=26-(unsigned int)(127-wavep[i+shiftindex])*35/256;
  230.                                         }
  231.                                 }
  232.                                 break;
  233.                         }
  234.                         case  2:                                        //0.5v/div
  235.                         {
  236.                                 for(i=0;i<127;i++)                  
  237.                                 {
  238.                                         if(((signed int)wavep[i+shiftindex]>=127))
  239.                                         {
  240.                                                 if(((wavep[i+shiftindex]-127)*35/128)<64)
  241.                                                         wave[i]=(unsigned int)(wavep[i+shiftindex]-127)*35/128+28;
  242.                                                 else
  243.                                                         wave[i]=(unsigned int)(wavep[i+shiftindex]-127)*35/128+29;
  244.                                         }
  245.                                         else
  246.                                         {
  247.                                                 if(((127-wavep[i+shiftindex])*35/128)<64)
  248.                                                         wave[i]=27-(unsigned int)(127-wavep[i+shiftindex])*35/128;
  249.                                                 else
  250.                                                         wave[i]=26-(unsigned int)(127-wavep[i+shiftindex])*35/128;
  251.                                                 //注意 要防止显示越界@@@@@@@@@@@@@@@@3(见LCD12864.c)
  252.                                                 if(wave[i]>27)wave[i]=0;                //防止超出LCD12864显示边界
  253.                                         }
  254.                                 }
  255.                                 break;
  256.                         }
  257.                         case  3:                                        //0.2v/div
  258.                         {
  259.                                 for(i=0;i<127;i++)                  
  260.                                 {
  261.                                         if(((signed int)wavep[i+shiftindex]>=127))
  262.                                         {
  263.                                                 if(((wavep[i+shiftindex]-127)*35/51)<26)                                                        
  264.                                                         wave[i]=(unsigned int)(wavep[i+shiftindex]-127)*35/51+28;                                                
  265.                                                 else                                                                          
  266.                                                         wave[i]=(unsigned int)(wavep[i+shiftindex]-127)*35/51+29;
  267.                                                 //if(wave[i]>56)wave[i]=56;
  268.                                         }
  269.                                         else
  270.                                         {
  271.                                                 if(((127-wavep[i+shiftindex])*35/51)<26)
  272.                                                         wave[i]=27-(unsigned int)(127-wavep[i+shiftindex])*35/51;
  273.                                                 else
  274.                                                         wave[i]=26-(unsigned int)(127-wavep[i+shiftindex])*35/51;
  275.                                                 if(wave[i]>27)wave[i]=0;                //防止超出LCD12864显示边界
  276.                                         }
  277.                                 }
  278.                                 break;
  279.                         }
  280.                         case  4:                                        //0.1v/div
  281.                         {
  282.                                 for(i=0;i<127;i++)                  
  283.                                 {
  284.                                         if(((signed int)wavep[i+shiftindex]>=127))
  285.                                         {
  286.                                                 if(((wavep[i+shiftindex]-127)*70/51)<26)                                                        
  287.                                                         wave[i]=(unsigned int)(wavep[i+shiftindex]-127)*70/51+28;                                                
  288.                                                 else                                                                          
  289.                                                         wave[i]=(unsigned int)(wavep[i+shiftindex]-127)*70/51+29;
  290.                                                 //if(wave[i]>56)wave[i]=56;
  291.                                         }
  292.                                         else
  293.                                         {
  294.                                                 if(((127-wavep[i+shiftindex])*70/51)<26)
  295.                                                         wave[i]=27-(unsigned int)(127-wavep[i+shiftindex])*70/51;
  296.                                                 else
  297.                                                         wave[i]=26-(unsigned int)(127-wavep[i+shiftindex])*70/51;
  298.                                                 if(wave[i]>27)wave[i]=0;                //防止超出LCD12864显示边界
  299.                                         }
  300.                                 }
  301.                                 break;
  302.                         }
  303.                 }//switch(volpd)电压衰减处理结束
  304.                
  305.                 //---------------------4、波形显示-------------------//

  306.                 if((disp==1)&&(hold==0))                //正常显示
  307.                 {
  308.                         TR0=0;ET0=0;                                //刷新过程不允许中断
  309.                         if(ROMEN==0x55)
  310.                         {
  311.                                 EEPROM[0]=grid;
  312.                                   EEPROM[1]=timpd;  
  313.                                   EEPROM[2]=volpd;
  314.                              EEPROM[3]=wavemode;
  315.                                 EEPROM[4]=autotim;
  316.                                 IAPWriteData(0,5,EEPROM);
  317.                                 ROMEN=0;
  318.                         }
  319.                         if(wavemode==1){dispwave2(grid);}                //矢量图
  320.                         if(wavemode==2){dispwave(grid);}                //散点图
  321.                         if(autotim==1)write_string8(3,106,"Auto");
  322.                         disp=0;                                                //刷新标志清零
  323.                         index=0;                                        //刷新后重新采样
  324.                         TR0=1;ET0=1;
  325.                 }
  326.                 if(hold==1)                                                //HOLD状态的显示
  327.                 {
  328.                         if(wavemode==1){dispwave2(grid);}                //矢量图
  329.                         if(wavemode==2){dispwave(grid);}                //散点图
  330.                         if(autotim==1)write_string8(3,106,"Auto");
  331.                         for(i=40;i>0;i--)                        //显示延时
  332.                         {
  333.                                 for(j=1200;j>0;j--);
  334.                                 //if(P1&0x38)break;                //有按键按下提前退出延时循环
  335.                         }               
  336.                 }
  337.                
  338.                 //---------------5、按键处理及显示延时---------------//

  339.                 shift=0;                                        //按键处理前清移位标志位
  340.                 if(wavemode==1)                                //矢量显示延时小
  341.                 {
  342.                         if(timpd==3){i=1;}
  343.                         else if(timpd==4){i=2;}
  344.                         else {i=30;}
  345.                 }                        
  346.                 if(wavemode==2)                                //散点显示延时大
  347.                 {
  348.                         if(timpd==3){i=1;}
  349.                         else if(timpd==4){i=2;}
  350.                         else {i=120;}
  351.                 }                        
  352.                 for(;i>0;i--)                                //散点显示刷新i=120
  353.                 {
  354.                         //不同采样率采用不同延时,以得到相同刷新率
  355.                         switch(timpd)                                       
  356.                         {
  357.                                 case  3:{j=1;delaymin=180000;delaybtn=60000;break;}                //10ms/div
  358.                                 case  4:{j=1;delaymin=140000;delaybtn=60000;break;}                //5ms/div
  359.                                 case  5:{j=100;delaymin=120000;delaybtn=40000;break;}                //2ms/div
  360.                                 case  6:{j=200;delaymin=120000;delaybtn=40000;break;}                //1ms/div
  361.                                 case  7:{j=400;delaymin=90000;delaybtn=30000;break;}                //500us/div
  362.                                 case  8:{j=200;delaymin=60000;delaybtn=20000;break;}                //200us/div
  363.                                 case  9:{j=120;delaymin=30000;delaybtn=10000;break;}                //100us/div
  364.                                 case  10:{j=1000;delaymin=250000;delaybtn=80000;break;}         //50us/div
  365.                                 case  11:{j=1000;delaymin=250000;delaybtn=80000;break;}         //20us(40us插值得来)
  366.                                 case  12:{j=1000;delaymin=250000;delaybtn=80000;break;}         //10us(40us两次插值得来)
  367.                         }
  368.                         for(;j>0;j--);                                        //内层循环延时
  369.                         //--------按键处理--------//
  370.                         //--1、HOLD键--//
  371.                         if((P3&0x04)==0)                                
  372.                         {
  373.                                 for(;delaybtn>0;delaybtn--);
  374.                                 if((P3&0x04)==0)               
  375.                                 {
  376.                                         delay=0;
  377.                                         if(hold==1){delaymin*=3;}//hold模式定时器全关,按键检测加长延时
  378.                                         while((P3&0x04)==0)
  379.                                         {
  380.                                                 delay++;
  381.                                         }
  382.                                         if(delay<delaymin)
  383.                                         {
  384.                                                 if(hold==0){hold=1;TR0=0;ET0=0;}
  385.                                                 else{hold=0;TR0=1;ET0=1;}
  386.                                         }
  387.                                         else
  388.                                         {
  389.                                                 if(hold==0)                        //hold模式下不切换自动手动
  390.                                                 {
  391.                                                         if(autotim==1){autotim=0;}
  392.                                                         else {autotim=1;}
  393.                                                         ROMEN=0x55;
  394.                                                 }
  395.                                         }
  396.                                 }
  397.                         }
  398.                         //--2、时间++/左移键--//
  399.                         if((P3&0x08)==0)                                
  400.                         {
  401.                                 if(hold==0)                                        //正常显示,时间++
  402.                                 {
  403.                                         for(;delaybtn>0;delaybtn--);
  404.                                         if((P3&0x08)==0)               
  405.                                         {
  406.                                                 while((P3&0x08)==0);
  407.                                                 index=0;                        //调整时间后必须重新采样
  408.                                                 timpd--;
  409.                                                 ROMEN=0x55;
  410.                                                 if(timpd<3){timpd=12;}
  411.                                         }
  412.                                 }
  413.                                 if(hold==1)                                        //HOLD状态,波形左移
  414.                                 {
  415.                                         for(j=50000;j>0;j--);
  416.                                         if((P3&0x08)==0)               
  417.                                         {
  418.                                                 shift=1;break;
  419.                                         }
  420.                                 }
  421.                         }
  422.                         //--3、时间--/右移键--//
  423.                         if((P3&0x80)==0)                                //时间--
  424.                         {
  425.                                 if(hold==0)                                        //正常显示,时间++
  426.                                 {
  427.                                         for(;delaybtn>0;delaybtn--);
  428.                                         if((P3&0x80)==0)               
  429.                                         {
  430.                                                 while((P3&0x80)==0);
  431.                                                 index=0;
  432.                                                 timpd++;
  433.                                                 ROMEN=0x55;
  434.                                                 if(timpd>12)timpd=3;
  435.                                         }
  436.                                 }
  437.                                 if(hold==1)                                        //HOLD状态,波形左移
  438.                                 {
  439.                                         for(j=50000;j>0;j--);
  440.                                         if((P3&0x80)==0)               
  441.                                         {
  442.                                                 shift=2;break;
  443.                                         }
  444.                                 }
  445.                         }
  446.                         //--4、//电压++--//
  447.                         if((P3&0x40)==0)                                //电压++
  448.                         {
  449.                                 for(;delaybtn>0;delaybtn--);
  450.                                 if((P3&0x40)==0)               
  451.                                 {
  452.                                         while((P3&0x40)==0);
  453.                                         volpd++;
  454.                                         if(volpd>4)volpd=1;
  455.                                         if(hold==0){ROMEN=0x55;}
  456.                                 }
  457.                         }
  458.                         //--5、//电压----//
  459.                         if((P3&0x10)==0)                                //电压--
  460.                         {
  461.                                 for(;delaybtn>0;delaybtn--);
  462.                                 if((P3&0x10)==0)               
  463.                                 {
  464.                                         while((P3&0x10)==0);
  465.                                         volpd--;
  466.                                         if(volpd<1)volpd=4;
  467.                                         if(hold==0){ROMEN=0x55;}
  468.                                 }
  469.                         }
  470.                         //--6、点格样式切换/线形切换--//
  471.                         if((P1&0x80)==0)                                //点格样式切换
  472.                         {
  473.                                 for(;delaybtn>0;delaybtn--);
  474.                                 if((P1&0x80)==0)               
  475.                                 {
  476.                                         delay=0;
  477.                                         if(hold==1){delaymin*=3;}//hold模式定时器全关,按键检测加长延时
  478.                                         while((P1&0x80)==0)
  479.                                         {
  480.                                                 delay++;
  481.                                         }
  482.                                         if(delay<delaymin)
  483.                                         {
  484.                                                 grid++;
  485.                                                 if(grid>3)grid=0;
  486.                                                 if(hold==0){ROMEN=0x55;}
  487.                                         }
  488.                                         else
  489.                                         {
  490.                                                 wavemode++;
  491.                                                 if(wavemode>2)wavemode=1;
  492.                                                 if(hold==0){ROMEN=0x55;}
  493.                                         }
  494.                                 }
  495.                         }
  496.                 }//for()按键处理end        

  497.                 //---------------6、根据频率自动选择采样时间---------------//
  498.                 if(autotim==1)
  499.                 {
  500.                         if(freqauto==freqin)
  501.                         {
  502.                                 if((freqin>5)&&(freqin<20)){timpd=3;}
  503.                                 else if((freqin>=20)&&(freqin<45)){timpd=4;}
  504.                                 else if((freqin>=45)&&(freqin<120)){timpd=5;}
  505.                                 else if((freqin>=120)&&(freqin<220)){timpd=6;}
  506.                                 else if((freqin>=220)&&(freqin<500)){timpd=7;}
  507.                                 else if((freqin>=500)&&(freqin<1200)){timpd=8;}
  508.                                 else if((freqin>=1200)&&(freqin<2200)){timpd=9;}
  509.                                 else if((freqin>=2200)&&(freqin<5000)){timpd=10;}
  510.                                 else if((freqin>=5000)&&(freqin<12000)){timpd=11;}
  511.                                 else if(freqin>=12000){timpd=12;}                                       
  512.                         }
  513.                         else
  514.                         {
  515.                                 freqauto=freqin;
  516.                         }
  517.                         //volmax=0;
  518.                         //for(j=0;j<512;j++)
  519.                         //{
  520.                         //        if(wavep[j]>volmax){volmax=wavep[i];}
  521.                         //}
  522.                         //if(volmax>187){volpd=1;}
  523.                         //else if(volmax>151){volpd=2;}
  524.                         //else if(volmax>135){volpd=3;}
  525.                         //else if(volmax>127){volpd=4;}
  526.                 }

  527.         }//while(1)-end
  528. //*/
  529. }
  530. /*
  531.                 //-------------------3、电压衰减处理-----------------//
  532.                 switch(volpd)                                        //此部分余数计算可能有问题,需改进
  533.                 {
  534.                         case  1:                                        //1v/div
  535.                         {
  536.                                 for(i=0;i<127;i++)                  
  537.                                 {
  538.                                         if(((signed int)wavep[i+shiftindex]>=127))
  539.                                         {
  540.                                                 if(((wavep[i+shiftindex]-127)*35/256)<128)
  541.                                                         wave[i]=(unsigned int)(wavep[i+shiftindex]-127)*35/256+28;
  542.                                                 else
  543.                                                         wave[i]=(unsigned int)(wavep[i+shiftindex]-127)*35/256+29;
  544.                                         }
  545.                                         else
  546.                                         {
  547.                                                 if(((127-wavep[i+shiftindex])*35/256)<128)
  548. ……………………

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

所有资料51hei提供下载:
51单片机简单示波器.rar (3.55 MB, 下载次数: 331)

评分

参与人数 3黑币 +70 收起 理由
tieq1952 + 15 赞一个!
fengye615 + 5
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:162514 发表于 2018-5-20 15:22 | 显示全部楼层
thank you !
回复

使用道具 举报

ID:70490 发表于 2018-5-20 21:47 | 显示全部楼层
正在学习这方面的知识,太好了。谢谢!!
回复

使用道具 举报

ID:53978 发表于 2018-6-7 17:14 | 显示全部楼层
电脑不是“大道必成”那个嘛 有啥不同的地方阿
回复

使用道具 举报

ID:343102 发表于 2018-6-11 20:52 | 显示全部楼层
谢谢分享,下来学习学习
回复

使用道具 举报

ID:283751 发表于 2018-6-11 22:23 | 显示全部楼层
非常棒 做成示波器 虽然不是很直观
回复

使用道具 举报

ID:370656 发表于 2018-7-20 20:21 | 显示全部楼层
51单片机中用12864显示波形中下面程序什么意思?什么功能?
void ShowData(unsigned char DataType,unsigned char X,unsigned char Y,unsigned char *DataArray)
{                                                                                        //列                    //页
    unsigned char i,DataLimit=8;
        if(DataType == Chrt)    // Chrt=1
        {
                DataLimit = 16;
        }           
    for(i=0;i<(DataLimit<<1);i++)  
    {
            if(i == 0)
            {
                SetPos(X<<3,Y);    //列左移3位,页数不变
               }
             else if(i == DataLimit)
               {
                      SetPos(X<<3,Y);           //列左移3位,页数不变
              }
                  LCD_Write(*(DataArray+i),LCD_DATA);
        }   
}
回复

使用道具 举报

ID:125889 发表于 2018-8-29 07:45 | 显示全部楼层
正好有学习一下12C5A60S2,下载学习,谢谢楼主分享
回复

使用道具 举报

ID:392360 发表于 2018-9-1 16:29 | 显示全部楼层
正好有学习一下12C5A60S2,下载学习,谢谢楼主分享
回复

使用道具 举报

ID:392859 发表于 2018-9-3 12:19 | 显示全部楼层
值得学习!!!
回复

使用道具 举报

ID:325624 发表于 2018-9-5 10:05 来自手机 | 显示全部楼层
喜欢玩单片机又不会程序,谢谢啦
回复

使用道具 举报

ID:247623 发表于 2019-1-16 22:35 | 显示全部楼层
你看看你的原理图,LCD12864明明是错的,还放在那,还有PCB布线图都没布好就放出来,不嫌丢人吗
回复

使用道具 举报

ID:472919 发表于 2019-1-25 18:03 | 显示全部楼层
求百度盘链接,这个不好下
回复

使用道具 举报

ID:164963 发表于 2019-3-16 13:38 | 显示全部楼层
非常好..........................
回复

使用道具 举报

ID:357045 发表于 2019-4-1 14:19 | 显示全部楼层
楼主,可以详细的介绍下Lm393在这示波器的作用与功能吗?
回复

使用道具 举报

ID:357045 发表于 2019-4-1 14:28 | 显示全部楼层
本帖最后由 嚣张的小胖子 于 2019-4-2 10:38 编辑

你好楼主,可以详细介绍下LM393芯片在这里的功能和原理作用吗?谢谢。
大佬,你就花花时间帮我解决下这问题,江湖救急啊!
回复

使用道具 举报

ID:253767 发表于 2019-4-3 07:23 | 显示全部楼层
thank you !
回复

使用道具 举报

ID:93248 发表于 2019-5-3 17:25 | 显示全部楼层
嚣张的小胖子 发表于 2019-4-1 14:28
你好楼主,可以详细介绍下LM393芯片在这里的功能和原理作用吗?谢谢。
大佬,你就花花时间帮我解决下这问 ...

LM393组成迟滞比较器测量小信号频率,不需要频率显示时该部分可以省略
回复

使用道具 举报

ID:93248 发表于 2019-5-3 17:31 | 显示全部楼层
yilinghai 发表于 2019-1-16 22:35
你看看你的原理图,LCD12864明明是错的,还放在那,还有PCB布线图都没布好就放出来,不嫌丢人吗

这位哥们,请你尊重下别人。从你的回复已经知你的修养了。
1.LCD有错,请你指出。
2.所画的PCB用于方便在洞洞板上焊接而已,并非用于生产。没画线的和顶层的线都是飞线。
回复

使用道具 举报

ID:537018 发表于 2019-5-13 16:07 | 显示全部楼层
长知识
回复

使用道具 举报

ID:558833 发表于 2019-6-12 14:07 | 显示全部楼层
正需要这方面的例程,感谢分享。
回复

使用道具 举报

ID:519003 发表于 2019-6-12 14:46 | 显示全部楼层
真不错
回复

使用道具 举报

ID:56665 发表于 2019-6-12 15:41 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

ID:377382 发表于 2020-6-10 00:04 | 显示全部楼层
谢谢楼主的分享
回复

使用道具 举报

ID:990594 发表于 2021-12-10 16:43 | 显示全部楼层
楼主。你好,还有什么比较器可以代替pm393吗
回复

使用道具 举报

ID:104480 发表于 2022-1-2 22:01 | 显示全部楼层
谢谢楼主,刚好想做个示波器,借鉴了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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