百桃园 发表于 2024-3-22 17:15:16

基于8G1K08A 单片机的简易示波器和超声波测距二合一小制作 附程序

       STC8G1K08A是深圳国芯人工智能的一款8脚8位兼容51系列的单片机
       价格很便宜 但麻雀虽小五脏俱全 且速度还挺快下面就是用它做的小东西 精度不是很高


       本人也是刚入门 水平有限 希望大家多多指教共两个按键 :按住周期和启动按键5秒钟
后两个程序互相切换、短按示波器是切换扫描周期、超声波测距是启动按键、波形锁定是示波器波形固定用的




制作出来的实物图如下:








电路原理图如下:




单片机源程序如下:


[*]#include "reg51.h"
[*]#include "intrins.h"
[*]#include"main.h"
[*]#include<math.h>
[*]
[*]unsigned char xdata se;//把AD转换后的临时数据存于该数组
[*]unsigned char code sm={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//用于显示一列中的一点
[*]unsigned int code time={1,40,100,500,1000,2600,5250,10000,25000};
[*]unsigned int code time1={1,3,5,20,40,100,200,400,1000};
[*]unsigned char xdata timd;
[*]unsigned char xdata ju_li;
[*]unsigned char p,z=0;
[*]unsigned int i=0,q=0;
[*]unsigned int m=5;
[*]//unsigned double q;
[*]sbit k1=P3^1;
[*]sbit trig=P3^3;
[*]sbit echo=P3^2;
[*]void delay_us(unsigned int i)
[*]{
[*]      while(i)
[*]      {
[*]          unsigned char a;
[*]    for(a=5;a>0;a--);
[*]      i--;
[*]      }
[*]
[*]}
[*]void delay100ms(unsigned int i)   //误差 -0.000000000025us
[*]{
[*]   while(i)
[*]   {
[*]   unsigned char a,b,c;
[*]    for(c=106;c>0;c--)
[*]      for(b=197;b>0;b--)
[*]            for(a=38;a>0;a--);
[*]    _nop_();//if Keil,require use intrins.h
[*]      i--;
[*]      }
[*]}
[*]void main()
[*]{
[*]      P0M1 = 0;   P0M0 = 0;   //设置为准双向口
[*]    P1M1 = 0;   P1M0 = 0;   //设置为准双向口
[*]    P2M1 = 0;   P2M0 = 0;   //设置为准双向口
[*]    P3M1 = 0;   P3M0 = 0;   //设置为准双向口
[*]    P4M1 = 0;   P4M0 = 0;   //设置为准双向口
[*]    P5M1 = 0;   P5M0 = 0;   //设置为准双向口
[*]    /*      P_SW2 = 0x80;//特殊寄存器允许位(0x80)
[*]      CKSEL = 0x00; //选择内部 IRC ( 默认 )
[*]      CLKDIV = 0x03; //时钟 3分频
[*]      P_SW2 = 0x00;
[*]      */
[*]      ad_init();      //ad转换初始化
[*]    OLED_Init(); //OLED初始化
[*]
[*]      for(z=0;z<128;z++)                           // 起   显示启动示波器文字
[*]      {
[*]                  for(i=0;i<8;i++)   //清屏
[*]                {
[*]                                 OLED_WrCmd(0xb0+i);
[*]                              OLED_WrCmd(0x00+(z%16));
[*]                        OLED_WrCmd(0x10+z/16);
[*]                              OLED_WrDat(0x00);
[*]                }
[*]      }
[*]                for (i=0;i<8;i++)
[*]         {
[*]                OLED_P16x16Ch(i*16,i/8*2+2,i);
[*]         }
[*]         delay100ms(30);
[*]               for(z=0;z<128;z++)
[*]      {
[*]                  for(i=0;i<8;i++)   //清屏
[*]                {
[*]                                 OLED_WrCmd(0xb0+i);
[*]                              OLED_WrCmd(0x00+(z%16));
[*]                        OLED_WrCmd(0x10+z/16);
[*]                              OLED_WrDat(0x00);
[*]                }
[*]      }                                                                              //止
[*]
[*]
[*]while(1)
[*]{
[*]      if(k1==0)
[*]      {
[*]               i=0;
[*]                m++;
[*]               while(!k1)
[*]               {
[*]
[*]                        delay100ms(1);
[*]                        i++;
[*]
[*]
[*]                        if(i>50)
[*]
[*]                        goto bosh;
[*]
[*]               }
[*]
[*]               if(m>8)
[*]               {
[*]                         m=0;
[*]               }
[*]               //i++;
[*]   }
[*]//*******************AD转换将临时数据存于数组se[] ****************************************
[*]
[*]
[*]                for(i=0;i<128;i++)
[*]      {
[*]                se=56-ad_dat()/18;
[*]                delay(time);
[*]
[*]      }
[*]               timd=time1%10;
[*]               timd=time1/10%10;
[*]               timd=time1/100%10;
[*]               timd=time1/1000%10;
[*]               timd=time1/10000%10;
[*]               OLED_P6x8Str(10,7,"Time = ");
[*]         OLED_P6x8Str(10+70,7," ms");
[*]
[*]
[*]         for(i=0;i<5;i++)                                          //显示扫描周期每一位 共五位
[*]         {
[*]         oled_6x8((10+40)+6*i,7,timd+16);
[*]               }
[*]
[*]
[*]
[*]//**********************oled显示****************************
[*]/*    for(i=0;i<7;i++)
[*]
[*]         {
[*]                              OLED_WrCmd(0xb0+i);
[*]                              OLED_WrCmd(0x00+(z%16));
[*]                        OLED_WrCmd(0x10+z/16);
[*]                              OLED_WrDat(0x00);
[*]         }
[*]
[*]      */
[*]
[*]      for(z=0;z<128;z++)
[*]      {
[*]
[*]                for(i=0;i<7;i++)
[*]
[*]         {
[*]                              OLED_WrCmd(0xb0+i);
[*]                              OLED_WrCmd(0x00+(z%16));
[*]                        OLED_WrCmd(0x10+z/16);
[*]                              if((i==3)&&(z%4==0))
[*]                              OLED_WrDat(0x10);
[*]                              else if(z==63)
[*]                              OLED_WrDat(0x44);
[*]                              else
[*]                              OLED_WrDat(0x00);
[*]         }
[*]                OLED_WrCmd(0xb0+se/7);
[*]                OLED_WrCmd(0x00+(z%16));
[*]                OLED_WrCmd(0x10+z/16);
[*]                OLED_WrDat(sm%7]);
[*]
[*]
[*]      //      OLED_WrDat(0x00);
[*]
[*]      }
[*]
[*]         if(trig==0)
[*]         {
[*]               delay100ms(10);
[*]                while(trig);
[*]                while(!trig);
[*]
[*]         }
[*]
[*]}
[*]
[*]
[*]      //启动超声波测距程序。。。。。。
[*]      bosh:
[*]                for(z=0;z<128;z++)
[*]      {
[*]                  for(i=0;i<8;i++)   //清屏
[*]                {
[*]                                 OLED_WrCmd(0xb0+i);
[*]                              OLED_WrCmd(0x00+(z%16));
[*]                        OLED_WrCmd(0x10+z/16);
[*]                              OLED_WrDat(0x00);
[*]                }
[*]      }
[*]                for (i=0;i<8;i++)
[*]         {
[*]                OLED_P16x16Ch(i*16,i/8*2+2,i+8);
[*]         }
[*]
[*]
[*]      delay100ms(30);
[*]                for(z=0;z<128;z++)
[*]      {
[*]                  for(i=0;i<8;i++)   //清屏
[*]                {
[*]                                 OLED_WrCmd(0xb0+i);
[*]                              OLED_WrCmd(0x00+(z%16));
[*]                        OLED_WrCmd(0x10+z/16);
[*]                              OLED_WrDat(0x00);
[*]                }
[*]      }
[*]
[*]
[*]      while(1)
[*]{
[*]                  if(k1==0)
[*]      {
[*]               q=0;
[*]                trig=0;
[*]                delay_us(1000);
[*]                trig=1;
[*]
[*]                i=10;
[*]               while(!echo)
[*]               {
[*]                         delay_us(1);
[*]                        i--;
[*]                i=0;
[*]               }
[*]               while(echo)
[*]               {
[*]                  delay_us(1);
[*]                  q++;
[*]               }
[*]               q=q*0.21;
[*]
[*]
[*]
[*]
[*]               while(!k1)
[*]               {
[*]                         i++;
[*]                delay100ms(1);
[*]
[*]
[*]                        if(i>50)
[*]                        return;
[*]             }
[*]
[*]
[*]
[*]
[*]    }
[*]            //q=156;
[*]                ju_li=q%10;
[*]                ju_li=q/10%10;
[*]                ju_li=q/100%10;
[*]                ju_li=q/1000%10;
[*]                ju_li=q/10000%10;
[*]         for(i=0;i<5;i++)
[*]         {
[*]         oled1_8x16( 48+8*i,4,ju_li);
[*]         }
[*]               for (i=0;i<6;i++)
[*]         {
[*]                OLED_P16x16Ch(i*16,i/8*2,19+i);
[*]         }
[*]                        for (i=0;i<3;i++)
[*]         {
[*]                OLED_P16x16Ch(i*16,i/8*2+2+2,19+6+i);
[*]
[*]         }
[*]                        for (i=0;i<2;i++)
[*]         {
[*]                OLED_P16x16Ch(95+i*16,i/8*2+2+2,19+6+3+i);
[*]         }
[*]
[*]}
[*]}





代码:


yjawei 发表于 2024-3-22 17:48:38

{:4_189:}最远距离多少

soma 发表于 2024-3-22 22:04:28

sr04模块最远距离4米

zhudean11 发表于 2024-10-16 08:25:25

{:5_332:}

wugq_sh 发表于 2024-10-25 14:00:11

{:5_332:}
页: [1]
查看完整版本: 基于8G1K08A 单片机的简易示波器和超声波测距二合一小制作 附程序