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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 14425|回復(fù): 18
收起左側(cè)

基于stc8g1k08a單片機(jī)的簡(jiǎn)易示波器和超聲波測(cè)距二合一小制作 附程序

  [復(fù)制鏈接]
ID:849913 發(fā)表于 2021-4-22 15:20 | 顯示全部樓層 |閱讀模式
stc8g1k08a是深圳宏晶科技的一款8腳8位兼容51系列的單片機(jī)  價(jià)格很便宜 但麻雀雖小五臟俱全 且速度還挺快下面就是用它做的小東東 精度不是很高 本人也是剛?cè)腴T 水平有限 希望大家多多指教共兩個(gè)按鍵 :按住周期和啟動(dòng)按鍵5秒鐘后兩個(gè)程序互相切換  短按示波器是切換掃描周期  超聲波測(cè)距是啟動(dòng)按鍵  波形鎖定是示波器波形固定用的

制作出來的實(shí)物圖如下:
51hei圖片_20210422143655.jpg 51hei圖片_20210422143700.jpg 51hei圖片_20210422143705.jpg 51hei圖片_20210422143632.jpg

電路原理圖如下:
51hei圖片_20210422143642.jpg

單片機(jī)源程序如下:
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #include"main.h"
  4. #include<math.h>

  5. unsigned char xdata se[128];//把AD轉(zhuǎn)換后的臨時(shí)數(shù)據(jù)存于該數(shù)組
  6. unsigned char code sm[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//用于顯示一列中的一點(diǎn)
  7. unsigned int code time[9]={1,40,100,500,1000,2600,5250,10000,25000};
  8. unsigned int code time1[9]={1,3,5,20,40,100,200,400,1000};
  9. unsigned char xdata timd[5];
  10. unsigned char xdata ju_li[5];
  11. unsigned char p,z=0;
  12. unsigned int i=0,q=0;
  13. unsigned int m=5;
  14. //unsigned double q;
  15. sbit k1=P3^1;
  16. sbit trig=P3^3;
  17. sbit echo=P3^2;
  18. void delay_us(unsigned int i)
  19. {
  20.         while(i)
  21.         {
  22.           unsigned char a;
  23.     for(a=5;a>0;a--);
  24.         i--;
  25.         }
  26.        
  27. }
  28. void delay100ms(unsigned int i)   //誤差 -0.000000000025us
  29. {
  30.    while(i)
  31.    {
  32.    unsigned char a,b,c;
  33.     for(c=106;c>0;c--)
  34.         for(b=197;b>0;b--)
  35.             for(a=38;a>0;a--);
  36.     _nop_();  //if Keil,require use intrins.h
  37.         i--;
  38.         }
  39. }
  40. void main()
  41. {
  42.         P0M1 = 0;   P0M0 = 0;   //設(shè)置為準(zhǔn)雙向口
  43.     P1M1 = 0;   P1M0 = 0;   //設(shè)置為準(zhǔn)雙向口
  44.     P2M1 = 0;   P2M0 = 0;   //設(shè)置為準(zhǔn)雙向口
  45.     P3M1 = 0;   P3M0 = 0;   //設(shè)置為準(zhǔn)雙向口
  46.     P4M1 = 0;   P4M0 = 0;   //設(shè)置為準(zhǔn)雙向口
  47.     P5M1 = 0;   P5M0 = 0;   //設(shè)置為準(zhǔn)雙向口
  48.     /*        P_SW2 = 0x80;  //特殊寄存器允許位(0x80)
  49.         CKSEL = 0x00; //選擇內(nèi)部 IRC ( 默認(rèn) )
  50.         CLKDIV = 0x03; //時(shí)鐘 3分頻
  51.         P_SW2 = 0x00;
  52.         */       
  53.         ad_init();        //ad轉(zhuǎn)換初始化
  54.     OLED_Init(); //OLED初始化
  55.           
  56.         for(z=0;z<128;z++)                             // 起   顯示啟動(dòng)示波器文字
  57.         {
  58.                   for(i=0;i<8;i++)   //清屏
  59.                 {
  60.                                  OLED_WrCmd(0xb0+i);
  61.                                 OLED_WrCmd(0x00+(z%16));
  62.                         OLED_WrCmd(0x10+z/16);
  63.                                 OLED_WrDat(0x00);
  64.                 }
  65.         }
  66.                 for (i=0;i<8;i++)
  67.          {
  68.                 OLED_P16x16Ch(i*16,i/8*2+2,i);
  69.          }
  70.          delay100ms(30);
  71.                  for(z=0;z<128;z++)               
  72.         {
  73.                   for(i=0;i<8;i++)   //清屏
  74.                 {
  75.                                  OLED_WrCmd(0xb0+i);
  76.                                 OLED_WrCmd(0x00+(z%16));
  77.                         OLED_WrCmd(0x10+z/16);
  78.                                 OLED_WrDat(0x00);
  79.                 }
  80.         }                                                                                //止


  81.   while(1)
  82.   {
  83.         if(k1==0)
  84.         {
  85.                  i=0;
  86.                 m++;
  87.                  while(!k1)
  88.                  {
  89.                         
  90.                         delay100ms(1);
  91.                         i++;

  92.                        
  93.                         if(i>50)

  94.                         goto bosh;
  95.                        
  96.                  }
  97.                  
  98.                  if(m>8)
  99.                  {
  100.                          m=0;
  101.                  }
  102.                  //i++;
  103.      }
  104. //*******************AD轉(zhuǎn)換將臨時(shí)數(shù)據(jù)存于數(shù)組se[] ****************************************


  105.                 for(i=0;i<128;i++)
  106.         {
  107.                 se[i]=56-ad_dat()/18;
  108.                 delay(time[m]);

  109.         }
  110.                  timd[0]=time1[m]%10;
  111.                  timd[1]=time1[m]/10%10;
  112.                  timd[2]=time1[m]/100%10;
  113.                  timd[3]=time1[m]/1000%10;
  114.                  timd[4]=time1[m]/10000%10;
  115.                  OLED_P6x8Str(10,7,"Time = ");
  116.          OLED_P6x8Str(10+70,7," ms");

  117.        
  118.          for(i=0;i<5;i++)                                          //顯示掃描周期每一位 共五位
  119.          {
  120.          oled_6x8((10+40)+6*i,7,timd[4-i]+16);
  121.                  }
  122.                  


  123. //**********************oled顯示****************************
  124. /*    for(i=0;i<7;i++)
  125.        
  126.            {
  127.                                 OLED_WrCmd(0xb0+i);
  128.                                 OLED_WrCmd(0x00+(z%16));
  129.                         OLED_WrCmd(0x10+z/16);
  130.                                 OLED_WrDat(0x00);
  131.            }
  132.        
  133.         */
  134.           
  135.         for(z=0;z<128;z++)
  136.         {
  137.        
  138.                 for(i=0;i<7;i++)
  139.        
  140.            {
  141.                                 OLED_WrCmd(0xb0+i);
  142.                                 OLED_WrCmd(0x00+(z%16));
  143.                         OLED_WrCmd(0x10+z/16);
  144.                                 if((i==3)&&(z%4==0))
  145.                                 OLED_WrDat(0x10);
  146.                                 else if(z==63)
  147.                                 OLED_WrDat(0x44);
  148.                                 else
  149.                                 OLED_WrDat(0x00);
  150.            }
  151.                 OLED_WrCmd(0xb0+se[z]/7);
  152.                 OLED_WrCmd(0x00+(z%16));
  153.                 OLED_WrCmd(0x10+z/16);
  154.                 OLED_WrDat(sm[se[z]%7]);       
  155.        
  156.                
  157.         //        OLED_WrDat(0x00);
  158.                
  159.         }
  160.        
  161.          if(trig==0)
  162.          {
  163.                  delay100ms(10);
  164.                 while(trig);
  165.                 while(!trig);
  166.                
  167.          }  
  168.          
  169.   }
  170.   

  171.         //啟動(dòng)超聲波測(cè)距程序。。。。。。
  172.         bosh:
  173.                 for(z=0;z<128;z++)
  174.         {
  175.                   for(i=0;i<8;i++)   //清屏
  176.                 {
  177.                                  OLED_WrCmd(0xb0+i);
  178.                                 OLED_WrCmd(0x00+(z%16));
  179.                         OLED_WrCmd(0x10+z/16);
  180.                                 OLED_WrDat(0x00);
  181.                 }
  182.         }
  183.                 for (i=0;i<8;i++)
  184.          {
  185.                 OLED_P16x16Ch(i*16,i/8*2+2,i+8);
  186.          }
  187.                        
  188.        
  189.         delay100ms(30);
  190.                 for(z=0;z<128;z++)
  191.         {
  192.                   for(i=0;i<8;i++)   //清屏
  193.                 {
  194.                                  OLED_WrCmd(0xb0+i);
  195.                                 OLED_WrCmd(0x00+(z%16));
  196.                         OLED_WrCmd(0x10+z/16);
  197.                                 OLED_WrDat(0x00);
  198.                 }
  199.         }

  200.                        
  201.         while(1)
  202.   {
  203.                   if(k1==0)
  204.         {
  205.                  q=0;
  206.                 trig=0;
  207.                 delay_us(1000);
  208.                 trig=1;
  209.        
  210.                 i=10;
  211.                  while(!echo)
  212.                  {
  213.                          delay_us(1);
  214.                         i--;
  215.                 i=0;       
  216.                  }
  217.                  while(echo)
  218.                  {
  219.                   delay_us(1);
  220.                   q++;       
  221.                  }
  222.                  q=q*0.21;
  223.                        
  224.        


  225.                  while(!k1)
  226.                  {
  227.                          i++;
  228.                 delay100ms(1);

  229.                        
  230.                         if(i>50)
  231.                         return;
  232.              }
  233.                         
  234.                  
  235.                

  236.     }
  237.             //q=156;
  238.                 ju_li[0]=q%10;
  239.                 ju_li[1]=q/10%10;
  240.                 ju_li[2]=q/100%10;
  241.                 ju_li[3]=q/1000%10;
  242.                 ju_li[4]=q/10000%10;
  243.          for(i=0;i<5;i++)
  244.          {
  245.          oled1_8x16( 48+8*i,4,ju_li[4-i]);
  246.          }
  247.                  for (i=0;i<6;i++)
  248.          {
  249.                 OLED_P16x16Ch(i*16,i/8*2,19+i);
  250.          }
  251.                         for (i=0;i<3;i++)
  252.          {
  253.                 OLED_P16x16Ch(i*16,i/8*2+2+2,19+6+i);

  254.          }
  255.                         for (i=0;i<2;i++)
  256.          {
  257.                 OLED_P16x16Ch(95+i*16,i/8*2+2+2,19+6+3+i);
  258.          }
  259.          
  260.   }
  261. }
復(fù)制代碼
51hei.png
所有資料51hei提供下載:
ad_led.rar (66.39 KB, 下載次數(shù): 224)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:849913 發(fā)表于 2021-4-22 18:55 | 顯示全部樓層
謝謝版主幫我整理 忘了告訴大家 單片機(jī)下載程序是 時(shí)鐘選擇33.1776MZ
回復(fù)

使用道具 舉報(bào)

ID:857072 發(fā)表于 2021-4-24 11:15 來自手機(jī) | 顯示全部樓層
有意思,下來有時(shí)間研究一下
回復(fù)

使用道具 舉報(bào)

ID:756506 發(fā)表于 2021-4-24 11:21 | 顯示全部樓層
不錯(cuò),有時(shí)間來做一個(gè)
回復(fù)

使用道具 舉報(bào)

ID:431787 發(fā)表于 2021-5-2 20:10 | 顯示全部樓層
keil5好像編譯不成功
回復(fù)

使用道具 舉報(bào)

ID:915390 發(fā)表于 2021-5-3 22:00 來自手機(jī) | 顯示全部樓層
學(xué)到了,有空弄一個(gè)
回復(fù)

使用道具 舉報(bào)

ID:601214 發(fā)表于 2021-5-30 10:00 | 顯示全部樓層
這個(gè)能做成示波器嗎?
回復(fù)

使用道具 舉報(bào)

ID:849913 發(fā)表于 2021-5-30 21:41 | 顯示全部樓層
zhike 發(fā)表于 2021-5-30 10:00
這個(gè)能做成示波器嗎?

簡(jiǎn)易的 都是出于自己對(duì)示波器工作原理的理解  頻率和精度都不高 主要是出于興趣玩玩
回復(fù)

使用道具 舉報(bào)

ID:414556 發(fā)表于 2021-5-30 23:19 | 顯示全部樓層
測(cè)距精度高不高,有沒有精度微調(diào)
回復(fù)

使用道具 舉報(bào)

ID:849913 發(fā)表于 2021-6-3 15:26 | 顯示全部樓層
測(cè)距精度可以用軟件調(diào)節(jié) 前提就是做著玩的 目的是對(duì)示波器和測(cè)試儀構(gòu)思的實(shí)踐
回復(fù)

使用道具 舉報(bào)

ID:927469 發(fā)表于 2021-7-5 22:09 | 顯示全部樓層

把文件頭改一下就能編譯
#include "reg51.h"
#include "intrins.h"
#include"main.h"
#include<math.h>
改成:
#include <STC8G.h>
#ifndef     __STC8G_H__
#define     __STC8G_H__
回復(fù)

使用道具 舉報(bào)

ID:849913 發(fā)表于 2021-7-10 11:42 | 顯示全部樓層
kmikmi 發(fā)表于 2021-7-5 22:09
把文件頭改一下就能編譯
#include "reg51.h"
#include "intrins.h"

謝謝指點(diǎn) 我還不知道有這個(gè)方法  所以把reg51.h里面加了很多與8G相關(guān)的東西
回復(fù)

使用道具 舉報(bào)

ID:953759 發(fā)表于 2021-7-17 10:57 | 顯示全部樓層
老董 發(fā)表于 2021-4-22 18:55
謝謝版主幫我整理 忘了告訴大家 單片機(jī)下載程序是 時(shí)鐘選擇33.1776MZ

您好,這個(gè)時(shí)鐘是怎么確定的呢?
回復(fù)

使用道具 舉報(bào)

ID:558833 發(fā)表于 2022-2-14 21:29 | 顯示全部樓層
面包板插線,直接下載成功
回復(fù)

使用道具 舉報(bào)

ID:185675 發(fā)表于 2022-6-8 22:32 | 顯示全部樓層
//一個(gè)簡(jiǎn)單的在stc8g1ko8A上可以運(yùn)行的小demo,可以用于簡(jiǎn)單的AD測(cè)量,define修改一下就行了
#define TIME_3S 30000
#define TIME_2S 30000
#define TIME_1MS 100
#define  TIME_2MS 200
#define  TIME_5MS 500
// 狀態(tài)機(jī)
#define READY_ST 1
#define CAPCHARGE 2
#define MOT_ST 3
#define STOP_ST 4
#define CHARGE_ST 5
#define DELAY_ST 6
// 信號(hào)接收
// 狀態(tài)機(jī)
#define keyRun
#define keyMot
// 數(shù)值
#define U500 20
#define U6500 500
#define U8000 700

unsigned int STATUS
unsigned int ADS
// 計(jì)數(shù)器
unsigned int keyRunCounter
unsigned int keyShutDownCounter
unsigned int shortCurrentCounter
unsigned int delaySTCounter
unsigned int capChargeCounter
unsigned int OVMonitCounter_1
unsigned int OVMonitCounter_2


mian()
{
case Status
    Run:
        Gpio.init;//keyRun 為推挽
    Mot:
        Gpio.init2;//keyRun 為input
    default:
        Gpio.init;//初始化為Run
}
void ISR()
{
    /*濾波器*/

    /*保護(hù)*/
    Protect();
    /*按鍵檢測(cè)*/
    keyMonitor();

    /*狀態(tài)與動(dòng)作*/
    switch STATUS:
    case READY_ST:
        setGPIO1;
    case CHARGE_ST:
        setGPIO1();
    case DELAY_ST:
        setGPIO1();
    case MOT_ST:
        setGPIO1();
    case STOP_ST:
        setGPIO1();   
    default:   
}


/******************************
*執(zhí)行保護(hù)邏輯
****************************/
void Protect()
{
    // Short State monitor
    if (STATUS != READY_ST) && (ADS < U500)//在待機(jī)時(shí)不檢測(cè),其他時(shí)段都不放過
    {
        shortCurrentCounter++;
    }
    else
    {
        shortCurrentCounter = 0;
    }
    if (shortCurrentCounter > TIME_1MS)
    {
        shortCurrentCounter = 0;
        STATUS = STOP_ST;
        return;
    }
    // OverVoltage Monitor 1
    if (STATUS != READY_ST) && (ADS > U500)//
    {
        OVMonitCounter_1++;
    }
    else
    {
        OVMonitCounter_1 = 0;
    }
    if (OVMonitCounter_1 > OVMonitCounter_1Debounce)
    {
        OVMonitCounter_1 = 0;
        STATUS = DELAY_ST;
    }
    // OverVoltage Monitor 2
    if (STATUS != READY_ST) && (ADS > U7500)//
    {
        OVMonitCounter_2++;
    }
    else
    {
        OVMonitCounter_2 = 0;
    }
    if (OVMonitCounter_2 > OVMonitCounter_2Debounce)
    {
        OVMonitCounter_2 = 0;
        STATUS = DELAY_ST;
    }
}
/******************************
*按鍵檢測(cè)邏輯
****************************/
void keyMonitor()
{
    //待機(jī)狀態(tài),長(zhǎng)按*秒開機(jī)
    if (STATUS == READY_ST) && (keyRun == 1)//待機(jī)狀態(tài),長(zhǎng)按3秒開機(jī)
    {
        keyRunCounter++;
    }
    else
    {
        keyRunCounter = 0;
    }
    if (keyRunCounter > TIME_3S)
    {
        keyRunCounter = 0;
        STATUS = CHARGE_ST;
    }
    //運(yùn)行狀態(tài),信號(hào)消失1ms關(guān)機(jī)
    if ((STATUS == CHARGE_ST) || (STATUS == DELAY_ST) || (STATUS == CAPCHARGE)  )&& (keyRun == 0)
    {
        keyShutDownCounter++;
    }
    else
    {
        keyShutDownCounter = 0;
    }
    if (keyShutDownCounter > TIME_3S)
    {
        keyShutDownCounter = 0;
        STATUS = READY_ST;
    }
   
    /*母線大電容充電2秒,開始工作*/
    if (STATUS == CAPCHARGE)  
    {
        if  (capChargeCounter < TIME_2S)
        {
            capChargeCounter++;
        }
        else
        {
            capChargeCounter = 0;
            STATUS = CHARGE_ST;
        }
    }
    //delay狀態(tài),1ms后使能檢測(cè)
    if ((STATUS == DELAY_ST) ) //&& (ADS < U500) delay 之后1ms再次檢測(cè),不夠再加,夠了就再次進(jìn)入delay
    {
        delaySTCounter++;
    }
    else
    {
        delaySTCounter = 0;
    }
    if (delaySTCounter > TIME_2MS)
    {
        delaySTCounter = 0;
        STATUS = CHARGE_ST;
    }
}

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:1042937 發(fā)表于 2022-8-27 15:48 | 顯示全部樓層
有時(shí)間研究一下
回復(fù)

使用道具 舉報(bào)

ID:476058 發(fā)表于 2022-10-15 22:33 | 顯示全部樓層
共同學(xué)習(xí),共同進(jìn)步,向大佬學(xué)習(xí)!
回復(fù)

使用道具 舉報(bào)

ID:681572 發(fā)表于 2023-4-14 09:17 | 顯示全部樓層
請(qǐng)問這個(gè)是用keil4還是keil5建立的工程啊??建立工程時(shí)選擇哪個(gè)器件啊?為什么我的keil4 C51里面沒有這個(gè)stc8g1k08a器件啊???
回復(fù)

使用道具 舉報(bào)

ID:1110792 發(fā)表于 2024-9-13 22:12 | 顯示全部樓層
厲害,有器件,但不知道能不能弄成,學(xué)習(xí)了。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久久三级 | 91视频久久 | 中文字幕av中文字幕 | 精品一区二区三区四区 | 日本一区二区三区四区 | 国产一区二区在线看 | 欧美在线成人影院 | 国产精品一区免费 | 嫩草懂你的影院入口 | 粉嫩一区二区三区性色av | 欧美乱大交xxxxx另类电影 | 午夜综合 | 国产伊人精品 | 欧美视频在线一区 | 亚洲精品久久久一区二区三区 | 亚洲高清视频一区二区 | 日韩中文字幕视频在线观看 | 国产一区二区三区亚洲 | 久久在线 | 亚洲欧洲日韩精品 中文字幕 | www.亚洲精品 | 影音先锋中文在线 | 人人干在线视频 | 91大神在线资源观看无广告 | 国产成人精品综合 | 日韩久久久久久 | 奇色影视 | 国产亚韩| 99久久久99久久国产片鸭王 | 久久国内精品 | 操久久 | 午夜天堂精品久久久久 | 中文字幕在线观看第一页 | 亚洲一卡二卡 | 黄色毛片一级 | 国产精品久久久久久久久久久久 | 久久99精品久久久久久秒播九色 | 欧美在线色 | 天天草天天爱 | 91香蕉嫩草 | 精品一区二区三区在线观看国产 |