|  | 
 
| STC8G1K08A是深圳国芯人工智能的一款8脚8位兼容51系列的单片机 价格很便宜 但麻雀虽小五脏俱全 且速度还挺快下面就是用它做的小东西 精度不是很高
 
 
 本人也是刚入门 水平有限 希望大家多多指教共两个按键 :按住周期和启动按键5秒钟
 后两个程序互相切换、短按示波器是切换扫描周期、超声波测距是启动按键、波形锁定是示波器波形固定用的
 
 
 
 
 制作出来的实物图如下:
 
 
   
 
   
 
   
 
 电路原理图如下:
 
 
   
 
 单片机源程序如下:
 
 
 #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, 下载次数: 144) 
 
 
 | 
1
喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
 
 +1楼主威武~
 |