這是幫別人做的一個小玩意兒,主要是通過超聲波來測量跳遠的距離然后進行排序,有記錄破紀錄會報警,更新記錄,顯示每次跳遠的距離。顯示前三名。 具體端口看程序,電路圖只是輔助。。。。。。 算了算了 我還是搬出來代碼吧 。
US-100超聲波測距模塊可實現(xiàn)2cm~4.5m的非接觸測距功能,擁有2.4~5.5V的寬電壓輸入范圍,靜態(tài)功耗低于2mA,自帶溫度傳感器對測距結(jié)果進行校正,同時具有GPIO,串口等多種通信方式,內(nèi)帶看門狗,工作穩(wěn)定可靠。
電路原理圖如下:
}@WO1P9~9ONQ$IABCW25G0E.png (108.36 KB, 下載次數(shù): 64)
下載附件
2019-3-29 07:51 上傳
單片機源程序如下:
- /**************************************************************/
- //使用時將US100跳帽拔下,使其設置為電平觸發(fā)模式
- /***************************************************************/
- #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 //數(shù)據(jù)口
- 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[]=
- {
- };
- // 函數(shù)聲明
- 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,};
- /******************************************************************************/
- /*******************************************************************/
- /* */
- /* 延時函數(shù) */
- /* */
- /*******************************************************************/
- 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); //顯示開,關(guān)光標
- delay(5);
- lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容
- 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) //寫指令或數(shù)據(jù)
- {
- 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)//清屏函數(shù)
- {
- 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)// 數(shù)字顯示函數(shù)
- {
-
- 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");
- }
- /********************************************************
- 函數(shù)名稱:void LCD12864_image12864( uchar code *pPicture )
- 函數(shù)作用:LCD12864顯示一張128*64的圖片
- 參數(shù)說明:輸入?yún)?shù)為字模數(shù)組,可以用圖片取模軟件獲得
- ********************************************************/
- 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中斷用來計數(shù)器溢出,超過測距范圍
- {
- flag=1; //中斷溢出標志
- }
- /********************************************************/
- void StartModule1() //超聲波觸發(fā)函數(shù)
- { Trig1=0;
- delay20us();
- Trig1=1;
- delay20us(); //發(fā)射一個大于10us的脈沖,觸發(fā)超聲波發(fā)射
- Trig1=0;
- }
-
- void main(void)
- {
- TMOD=0x01; //設T0為方式1
- TH0=0x00;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
多路超聲波測試(實物).zip
(253.14 KB, 下載次數(shù): 28)
2019-3-29 07:57 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|