找回密码
 立即注册
查看: 159|回复: 2

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

[复制链接]

该用户从未签到

4

主题

1

回帖

142

积分

等待验证会员

积分
142
发表于 2024-3-22 17:15:16 | 显示全部楼层 |阅读模式
       stc8g1k08a是深圳国芯人工智能的一款8脚8位兼容51系列的单片机  
       价格很便宜 但麻雀虽小五脏俱全 且速度还挺快下面就是用它做的小东西 精度不是很高


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




制作出来的实物图如下:

151912ryn8tfyfpbvypmyl.jpg

151912zs4vkusonj7o4jsq.jpg

151913ntfmtcbjfx1nno4q.jpg


电路原理图如下:

151912rridffz3eddjrjrc.jpg


单片机源程序如下:

  • #include "reg51.h"
  • #include "intrins.h"
  • #include"main.h"
  • #include<math.h>
  • unsigned char xdata se[128];//把AD转换后的临时数据存于该数组
  • unsigned char code sm[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//用于显示一列中的一点
  • unsigned int code time[9]={1,40,100,500,1000,2600,5250,10000,25000};
  • unsigned int code time1[9]={1,3,5,20,40,100,200,400,1000};
  • unsigned char xdata timd[5];
  • unsigned char xdata ju_li[5];
  • 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[m]);
  •         }
  •                  timd[0]=time1[m]%10;
  •                  timd[1]=time1[m]/10%10;
  •                  timd[2]=time1[m]/100%10;
  •                  timd[3]=time1[m]/1000%10;
  •                  timd[4]=time1[m]/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[4-i]+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[z]/7);
  •                 OLED_WrCmd(0x00+(z%16));
  •                 OLED_WrCmd(0x10+z/16);
  •                 OLED_WrDat(sm[se[z]%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[0]=q%10;
  •                 ju_li[1]=q/10%10;
  •                 ju_li[2]=q/100%10;
  •                 ju_li[3]=q/1000%10;
  •                 ju_li[4]=q/10000%10;
  •          for(i=0;i<5;i++)
  •          {
  •          oled1_8x16( 48+8*i,4,ju_li[4-i]);
  •          }
  •                  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);
  •          }
  •   }
  • }





代码: ad_led.rar (66.39 KB, 下载次数: 8)


1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复 送花

使用道具 举报

  • TA的每日心情
    慵懒
    4 小时前
  • 签到天数: 63 天

    [LV.6]常住居民II

    0

    主题

    157

    回帖

    425

    积分

    中级会员

    积分
    425
    发表于 2024-3-22 17:48:38 | 显示全部楼层
    最远距离多少
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    6 小时前
  • 签到天数: 76 天

    [LV.6]常住居民II

    4

    主题

    671

    回帖

    1053

    积分

    金牌会员

    积分
    1053
    发表于 2024-3-22 22:04:28 来自手机 | 显示全部楼层
    sr04模块最远距离4米
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-20 12:50 , Processed in 0.116466 second(s), 39 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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