久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 18151|回復: 25
打印 上一主題 下一主題
收起左側

51單片機簡單示波器 帶LM393遲滯比較器與12864顯示波形 附源碼

  [復制鏈接]
跳轉到指定樓層
樓主
一、系統構成
    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,正常顯示時,調整每格時間;波形凍結后,實現波形平移。所以在波形凍結狀態下是不能調節時間的!

實物圖:


電路原理圖如下:


單片機源程序如下:
  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黑下載附件…………
復制代碼


所有資料51hei提供下載:
51單片機簡單示波器.rar (3.55 MB, 下載次數: 331)


評分

參與人數 3黑幣 +70 收起 理由
tieq1952 + 15 贊一個!
fengye615 + 5
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏15 分享淘帖 頂4 踩
回復

使用道具 舉報

沙發
ID:162514 發表于 2018-5-20 15:22 | 只看該作者
thank you !
回復

使用道具 舉報

板凳
ID:70490 發表于 2018-5-20 21:47 | 只看該作者
正在學習這方面的知識,太好了。謝謝!
回復

使用道具 舉報

地板
ID:53978 發表于 2018-6-7 17:14 | 只看該作者
電腦不是“大道必成”那個嘛 有啥不同的地方阿
回復

使用道具 舉報

5#
ID:343102 發表于 2018-6-11 20:52 | 只看該作者
謝謝分享,下來學習學習
回復

使用道具 舉報

6#
ID:283751 發表于 2018-6-11 22:23 | 只看該作者
非常棒 做成示波器 雖然不是很直觀
回復

使用道具 舉報

7#
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);
        }   
}
回復

使用道具 舉報

8#
ID:125889 發表于 2018-8-29 07:45 | 只看該作者
正好有學習一下12C5A60S2,下載學習,謝謝樓主分享
回復

使用道具 舉報

9#
ID:392360 發表于 2018-9-1 16:29 | 只看該作者
正好有學習一下12C5A60S2,下載學習,謝謝樓主分享
回復

使用道具 舉報

10#
ID:392859 發表于 2018-9-3 12:19 | 只看該作者
值得學習!!
回復

使用道具 舉報

11#
ID:325624 發表于 2018-9-5 10:05 來自手機 | 只看該作者
喜歡玩單片機又不會程序,謝謝啦
回復

使用道具 舉報

12#
ID:247623 發表于 2019-1-16 22:35 | 只看該作者
你看看你的原理圖,LCD12864明明是錯的,還放在那,還有PCB布線圖都沒布好就放出來,不嫌丟人嗎
回復

使用道具 舉報

13#
ID:472919 發表于 2019-1-25 18:03 | 只看該作者
求百度盤鏈接,這個不好下
回復

使用道具 舉報

14#
ID:164963 發表于 2019-3-16 13:38 | 只看該作者
非常好..........................
回復

使用道具 舉報

15#
ID:357045 發表于 2019-4-1 14:19 | 只看該作者
樓主,可以詳細的介紹下Lm393在這示波器的作用與功能嗎?
回復

使用道具 舉報

16#
ID:357045 發表于 2019-4-1 14:28 | 只看該作者
本帖最后由 囂張的小胖子 于 2019-4-2 10:38 編輯

你好樓主,可以詳細介紹下LM393芯片在這里的功能和原理作用嗎?謝謝。
大佬,你就花花時間幫我解決下這問題,江湖救急。
回復

使用道具 舉報

17#
ID:253767 發表于 2019-4-3 07:23 | 只看該作者
thank you !
回復

使用道具 舉報

18#
ID:93248 發表于 2019-5-3 17:25 | 只看該作者
囂張的小胖子 發表于 2019-4-1 14:28
你好樓主,可以詳細介紹下LM393芯片在這里的功能和原理作用嗎?謝謝。
大佬,你就花花時間幫我解決下這問 ...

LM393組成遲滯比較器測量小信號頻率,不需要頻率顯示時該部分可以省略
回復

使用道具 舉報

19#
ID:93248 發表于 2019-5-3 17:31 | 只看該作者
yilinghai 發表于 2019-1-16 22:35
你看看你的原理圖,LCD12864明明是錯的,還放在那,還有PCB布線圖都沒布好就放出來,不嫌丟人嗎

這位哥們,請你尊重下別人。從你的回復已經知你的修養了。
1.LCD有錯,請你指出。
2.所畫的PCB用于方便在洞洞板上焊接而已,并非用于生產。沒畫線的和頂層的線都是飛線。
回復

使用道具 舉報

20#
ID:537018 發表于 2019-5-13 16:07 | 只看該作者
長知識
回復

使用道具 舉報

21#
ID:558833 發表于 2019-6-12 14:07 | 只看該作者
正需要這方面的例程,感謝分享。
回復

使用道具 舉報

22#
ID:519003 發表于 2019-6-12 14:46 | 只看該作者
真不錯
回復

使用道具 舉報

23#
ID:56665 發表于 2019-6-12 15:41 | 只看該作者
謝謝分享!
回復

使用道具 舉報

24#
ID:377382 發表于 2020-6-10 00:04 | 只看該作者
謝謝樓主的分享
回復

使用道具 舉報

25#
ID:990594 發表于 2021-12-10 16:43 | 只看該作者
樓主。你好,還有什么比較器可以代替pm393嗎
回復

使用道具 舉報

26#
ID:104480 發表于 2022-1-2 22:01 | 只看該作者
謝謝樓主,剛好想做個示波器,借鑒了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 97免费视频在线观看 | 亚洲精品视频在线观看视频 | 成人精品一区二区三区中文字幕 | 韩国av一区二区 | 日韩黄a | 久久亚洲国产精品 | 99久久精品国产一区二区三区 | 亚洲精久| 人人性人人性碰国产 | 久久乐国产精品 | 欧美成人激情 | 精品中文字幕一区二区 | 国产精品亚洲欧美日韩一区在线 | 成人h视频在线观看 | 亚洲精品一区二区另类图片 | 欧美一级三级 | 天天久久| 欧美一级在线 | 91在线精品视频 | 久久日本 | 最新高清无码专区 | 欧日韩不卡在线视频 | 成人在线视频免费播放 | 一区二区三区在线免费观看 | 三级黄色片在线观看 | 欧州一区二区三区 | 日韩一级欧美一级 | 精品日韩在线 | 天天操天天射综合网 | 91私密视频 | 久色视频在线 | 国产亚洲精品综合一区 | 国产在线精品一区二区三区 | 日韩日韩日韩日韩日韩日韩日韩 | 欧美a v在线 | 免费在线国产视频 | 一区二区视频在线观看 | 国产一区亚洲二区三区 | 国产成人精品一区二区三区 | 亚洲精品欧美一区二区三区 | 成人欧美一区二区三区1314 |