这是帮别人做的一个小玩意儿,主要是通过超声波来测量跳远的距离然后进行排序,有记录破纪录会报警,更新记录,显示每次跳远的距离。显示前三名。 具体端口看程序,电路图只是辅助。。。。。。 算了算了 我还是搬出来代码吧 。
US-100超声波测距模块可实现2cm~4.5m的非接触测距功能,拥有2.4~5.5V的宽电压输入范围,静态功耗低于2mA,自带温度传感器对测距结果进行校正,同时具有GPIO,串口等多种通信方式,内带看门狗,工作稳定可靠。
电路原理图如下:
单片机源程序如下:
- /**************************************************************/
- //使用时将US100跳帽拔下,使其设置为电平触发模式
- /***************************************************************/
- #include <reg52.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- //引脚定义
- sbit Trig1 = P3 ^ 3; //
- sbit Ecno1 = P3 ^ 2; //
- #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
- #define LCD_data P0 //数据口
- sbit LCD_RS = P3^5; //寄存器选择输入
- sbit LCD_RW = P3^6; //液晶读/写控制
- sbit LCD_EN = P3^4; //液晶使能控制
- sbit LCD_PSB = P3^7; //串/并方式控制
- sbit wela = P2^6;
- sbit dula = P2^7;
- sbit beep = P2^0;
- sbit KEY = P1^4; //测距按键
- int tt=0,cc=1;
- int jilu=50;
- uchar code num12864[]=
- {
- };
- // 函数声明
- void Write_char(uchar dat);
- bit lcd_busy();
- void Lcd_init(void);
- void LCD_Write_string(uchar *str);
- void LCD_set_xy( unsigned char x, unsigned char y );
- void StartModule() ;
- void Clr_Scr();
- unsigned char code num[]={"0123456789:."};
- unsigned char code M[] = {"M"};
- unsigned int time1=0;
- unsigned int time2=0;
- unsigned int time3=0;
- unsigned int time4=0;
- long s=0;
- long s1=0;
- long s2=0;
- long s3=0;
- long s4=0;
- long s5=0;
- long s6=0;
- long s7=0;
- long s8=0;
- long s9=0;
- long s10=0;
- long s11=0;
- long s12=0;
- long s13=0;
- bit flag =0;
-
- unsigned char disbuff1[4]={ 0,0,0,0,};
- unsigned char disbuff2[4]={ 0,0,0,0,};
- unsigned char disbuff3[4]={ 0,0,0,0,};
- unsigned char disbuff4[4]={ 0,0,0,0,};
- unsigned char disbuff5[4]={ 0,0,0,0,};
- unsigned char disbuff6[4]={ 0,0,0,0,};
- /******************************************************************************/
- /*******************************************************************/
- /* */
- /* 延时函数 */
- /* */
- /*******************************************************************/
- void delay(uint x)
- {
- uint i,j;
- for(i= x;i>0;i--)
- for(j=110;j>0;j--);
- }
- void lcd_wcmd(uchar cmd)
- {
- while(lcd_busy());
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_EN = 0;
- _nop_();
- _nop_();
- P0 = cmd;
- delayNOP();
- LCD_EN = 1;
- delayNOP();
- LCD_EN = 0;
- }
- void Lcd_init(void) //初始化LCD
- {
- LCD_PSB = 1; //并口方式
-
- lcd_wcmd(0x34); //扩充指令操作
- delay(5);
- lcd_wcmd(0x30); //基本指令操作
- delay(5);
- lcd_wcmd(0x0C); //显示开,关光标
- delay(5);
- lcd_wcmd(0x01); //清除LCD的显示内容
- delay(5);
- }
- bit lcd_busy()
- {
- bit result;
- LCD_RS = 0;
- LCD_RW = 1;
- LCD_EN = 1;
- delayNOP();
- result = (bit)(P0&0x80);
- LCD_EN = 0;
- return(result);
- }
- /******************************************************************************/
- /*void Write_char(uchar dat) //写指令或数据
- {
- while(lcd_busy());
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_EN = 0;
- P0 = dat;
- delayNOP();
- LCD_EN = 1;
- delayNOP();
- LCD_EN = 0;
- }
- */
-
- /******************************************************************************/
- void Delaynms(unsigned int di) //延时
- {
- unsigned int da,db;
- for(da=0;da<di;da++)
- for(db=0;db<10;db++);
- }
- /******************************************************************************/
- void Clr_Scr(void)//清屏函数
- {
- lcd_wcmd(0x01);
- }
- /******************************************************************************/
- void LCD_set_xy( unsigned char X, unsigned char Y )//设置LCD显示的起始位置,X为行,Y为列
- {
-
- uchar pos;
- if (X==0)
- {X=0x80;}
- else if (X==1)
- {X=0x90;}
- else if (X==2)
- {X=0x88;}
- else if (X==3)
- {X=0x98;}
- pos = X+Y ;
- lcd_wcmd(pos); //显示地址
- }
- void lcd_wdat(uchar dat)
- {
- while(lcd_busy());
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_EN = 0;
- P0 = dat;
- delayNOP();
- LCD_EN = 1;
- delayNOP();
- LCD_EN = 0;
- }
- /******************************************************************************/
-
- void LCD_Write_string(uchar *str)//D′è?×?·?′?oˉêy
- {
-
-
- for(;*str!='\0';str++)
- {
- lcd_wdat(*str);
- delay(2);
- }
-
- }
- /******************************************************************************/
- void LCD_Write_number(unsigned char s)// 数字显示函数
- {
-
- lcd_wdat(num[s]);
- Delaynms(1);
- }
- /******************************************************************************/
- void Lcd_Mark2(void)
- {
- Clr_Scr();//清屏
- LCD_set_xy(0,0);
- LCD_Write_string("第一名:");//
- LCD_set_xy(0,5);
- LCD_Write_string("m");
- LCD_set_xy(1,0);
- LCD_Write_string("第二名:");//
- LCD_set_xy(1,5);
- LCD_Write_string("m");
- LCD_set_xy(2,0);
- LCD_Write_string("第三名:");//
- LCD_set_xy(2,5);
- LCD_Write_string("m");
- LCD_set_xy(3,0);
- LCD_Write_string("xyz");//
- // LCD_Write_string("5");//
- LCD_set_xy(3,5);
- LCD_Write_string("m");
- }
- /********************************************************
- 函数名称:void LCD12864_image12864( uchar code *pPicture )
- 函数作用:LCD12864显示一张128*64的图片
- 参数说明:输入参数为字模数组,可以用图片取模软件获得
- ********************************************************/
- void LCD12864_image12864( uchar code *pPicture )
- {
- unsigned char i,j;
- lcd_wcmd( 0x34 ) ;
- lcd_wcmd( 0x36 ) ;
- for(i=0;i<32;i++)
- {
- lcd_wcmd( 0x80+i);
- lcd_wcmd( 0x80 );
- for(j=0;j<8;j++)
- {
- lcd_wdat( ~pPicture[i*16+j*2] );
- lcd_wdat( ~pPicture[i*16+j*2+1] );
- }
- }
- for(i=0;i<32;i++)
- {
- lcd_wcmd( 0x80+i) ;
- lcd_wcmd( 0x88 );
- for(j=0;j<8;j++)
- {
- lcd_wdat( ~pPicture[32*16+i*16+j*2] );
- lcd_wdat( ~pPicture[32*16+i*16+j*2+1] );
- }
- }
- lcd_wcmd( 0x30 ) ;
- }
- void now()
- {
- LCD_set_xy( 3, 5 );
- LCD_Write_number(disbuff5[1]);
- LCD_Write_string(".");
- LCD_Write_number(disbuff5[2]);
- LCD_Write_number(disbuff5[3]);
- }
- /********************************************************/
- void Conut1(void)
- {
- time1=TH0*256+TL0;
- TH0=0x00;
- TL0=0x00;
- s1=(time1*1.70)/100; // 11.0592M晶振
-
-
- if(flag==1) //超出测量
- {
- flag=0;
- LCD_set_xy( 0, 5 );
- LCD_Write_string(" ");
- }
- if(tt==1)
- {
- s2=s1;
-
- tt++; //不在采集
- }
- if(tt==3)
- {s3=s1;
- if(s3>=s2) {s5=s3;s3=s2;s2=s5;}
- if(s3<s2&&s3>=s4) {s2=s2;s3=s3;s4=s4;}
- tt++;
- }
- if(tt==5)
- {s4=s1;
- //now();
- if(s4>=s2) {s6=s4;s4=s3;s3=s2;s2=s6;}
- if(s4>s3) {s2=s2;s6=s4;s4=s3;s3=s6;}
- if(s4<=s3) {s2=s2;s3=s3;s4=s4;}
- if(s3>=s2) {s5=s3;s3=s2;s2=s5;}
- if(s3<s2&&s3>=s4) {s2=s2;s3=s3;s4=s4;}
- // now();
- tt++;
- }
- if(s2>jilu)
- {
- jilu=s2;
- beep=0;
- delay(500);
- beep=1;
- }
- if(cc%2==0)
- {
- //now();
- if(s1>=s2) {s5=s2;s3=s5;s2=s1;s4=s4; }
- if(s1>=s3&&s1<s2) {s5=s3;s3=s1;s2=s2;s4=s5; }
- if(s1>=s4&s1<s3) {s4=s1;s2=s2;s3=s3;}
- now();
- cc++;
- }
- disbuff1[1]=s2%1000/100;
- disbuff1[2]=s2%1000%100/10;
- disbuff1[3]=s2%1000%100%10;
- disbuff2[1]=s3%1000/100;
- disbuff2[2]=s3%1000%100/10;
- disbuff2[3]=s3%1000%100%10;
- disbuff3[1]=s4%1000/100;
- disbuff3[2]=s4%1000%100/10;
- disbuff3[3]=s4%1000%100%10;
- disbuff4[1]=jilu%1000/100;
- disbuff4[2]=jilu%1000%100/10;
- disbuff4[3]=jilu%1000%100%10;
- disbuff5[1]=s1%1000/100;
- disbuff5[2]=s1%1000%100/10;
- disbuff5[3]=s1%1000%100%10;
- LCD_set_xy( 0, 4 );
- LCD_Write_number(disbuff1[1]);
- LCD_Write_string(".");
- LCD_Write_number(disbuff1[2]);
- LCD_Write_number(disbuff1[3]);
- LCD_set_xy( 1, 4 );
- LCD_Write_number(disbuff2[1]);
- LCD_Write_string(".");
- LCD_Write_number(disbuff2[2]);
- LCD_Write_number(disbuff2[3]);
- LCD_set_xy( 2, 4 );
- LCD_Write_number(disbuff3[1]);
- LCD_Write_string(".");
- LCD_Write_number(disbuff3[2]);
- LCD_Write_number(disbuff3[3]);
-
-
- LCD_set_xy( 3, 2 );
- LCD_Write_number(disbuff4[1]);
- LCD_Write_string(".");
- LCD_Write_number(disbuff4[2]);
- LCD_Write_number(disbuff4[3]);
-
-
- }
-
- /********************************************************/
- void delay20us(void) //误差 -0.016637731481us
- {
- unsigned char a,b;
- for(b=1;b>0;b--)
- for(a=52;a>0;a--);
- //if Keil,require use intrins.h
- }
- void Delay5ms() //@11.0592MHz
- {
- unsigned char i, j;
- i = 54;
- j = 199;
- do
- {
- while (--j);
- } while (--i);
- }
- void Delay50ms() //@11.0592MHz
- {
- unsigned char i, j, k;
- i = 3;
- j = 26;
- k = 223;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
-
-
-
- void Delay300ms() //@11.0592MHz
- {
- unsigned char i, j, k;
- i = 13;
- j = 156;
- k = 83;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- /********************************************************/
- void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
- {
- flag=1; //中断溢出标志
- }
- /********************************************************/
- void StartModule1() //超声波触发函数
- { Trig1=0;
- delay20us();
- Trig1=1;
- delay20us(); //发射一个大于10us的脉冲,触发超声波发射
- Trig1=0;
- }
-
- void main(void)
- {
- TMOD=0x01; //设T0为方式1
- TH0=0x00;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
多路超声波测试(实物).zip
(253.14 KB, 下载次数: 28)
|