制作出来的实物图如下:
电路原理图如下:
单片机源程序如下:
#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[i]=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); } } }
复制代码