|
本帖最后由 wangming 于 2015-2-11 02:07 編輯
這是一款單片機超聲波測距原理圖,這款單片機超聲波測距板電路簡單,制作容易,無需進行調試,電路焊焊接好后,下裝程序后即可工作。 


- //////////////////////////////////////////////////////////////////////////////////////
- // AT89C2051單片機超聲波測距程序 //
- // 編寫:yuan_jia //
- // QQ:111716 //
- // 2014年7月 //
- // 晶振:12MH //
- ////////////////////////////////////////////////////////////////////////////////////
- #include <REG2051.H>
- #define k1 P3_4
- #define csbout P3_5 //超聲波發送
- #define csbint P3_7 //超聲波接收
- #define csbc=0.034
- #define bg P3_3
- unsigned char csbds,opto,digit,buffer[3],xm1,xm2,xm0,key,jpjs;//顯示標識
- unsigned char convert[10]={0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9段碼
- unsigned int s,t,i, xx,j,sj1,sj2,sj3,mqs,sx1;
- bit cl;
- void csbcj();
- void delay(j); //延時函數
- void scanLED(); //顯示函數
- void timeToBuffer(); //顯示轉換函數
- void keyscan();
- void k1cl();
- void k2cl();
- void k3cl();
- void k4cl();
- void offmsd();
- void main() //主函數
- {
- EA=1; //開中斷
- TMOD=0x11; //設定時器0為計數,設定時器1定時
- ET0=1; //定時器0中斷允許
- ET1=1; //定時器1中斷允許
- TH0=0x00;
- TL0=0x00;
- TH1=0x9E;
- TL1=0x57;
- csbds=0;
- csbint=1;
- csbout=1;
- cl=0;
- ōpto=0xff;
- jpjs=0;
- sj1=45;
- sj2=200;
- sj3=400;
- k4cl();
- TR1=1;
- while(1)
- {
- keyscan();
- if(jpjs<1)
- {
- csbcj();
- if(s>sj3)
- {
- buffer[2]=0x76;
- buffer[1]=0x76;
- buffer[0]=0x76;
- }
- else if(s<sj1)
- {
- buffer[2]=0x40;
- buffer[1]=0x40;
- buffer[0]=0x40;
- }
- else timeToBuffer();
- }
- else timeToBuffer(); //將值轉換成LED段碼
- offmsd();
- scanLED(); //顯示函數
- if(s<sj2)
- bg=0;
- bg=1;
- }
- }
- void scanLED() //顯示功能模塊
- {
- digit=0x04;
- for( i=0; i<3; i++) //3位數顯示
- {
- P3=~digit&opto; //依次顯示各位數
- P1=~buffer; //顯示數據送P1口
- delay(20); //延時處理
- P1=0xff; //P1口置高電平(關閉)
- if((P3&0x10)==0) //判斷3位是否顯示完
- key=0;
- digit>>=1; //循環右移1位
- }
- }
- void timeToBuffer() //轉換段碼功能模塊
- {
- xm0=s/100;
- xm1=(s-100*xm0)/10;
- xm2=s-100*xm0-10*xm1;
- buffer[2]=convert[xm2];
- buffer[1]=convert[xm1];
- buffer[0]=convert[xm0];
- }
- void delay(i)
- {
- while(--i);
- }
- void timer1int (void) interrupt 3 using 2
- {
- TH1=0x9E;
- TL1=0x57;
- csbds++;
- if(csbds>=40)
- {
- csbds=0;
- cl=1;
- }
- }
- void csbcj()
- {
- if(cl==1)
- {
- TR1=0;
- TH0=0x00;
- TL0=0x00;
- i=10;
- while(i--)
- {
- csbout=!csbout;
- }
- TR0=1;
- i=mqs; //盲區
- while(i--)
- {
- }
- i=0;
- while(csbint)
- {
- i++;
- if(i>=2450) //上限值
- csbint=0;
- }
- TR0=0;
- TH1=0x9E;
- TL1=0x57;
- t=TH0;
- t=t*256+TL0;
- s=t*csbc/2;
- TR1=1;
- cl=0;
- }
- }
- void keyscan() //健盤處理函數
- {
- xx=0;
- if(k1!=1) // 判斷開關是否按下
- {
- delay(400); //延時去抖動
- if(k1!=1) // 判斷開關是否按下
- {
- while(!k1)
- {
- delay(30);
- xx++;
- }
- if(xx>2000)
- {
- jpjs++;
- if(jpjs>4)
- jpjs=0;
- }
- xx=0;
- switch(jpjs)
- {
- case 1: k1cl();break;
- case 2: k2cl();break;
- case 3: k3cl();break;
- case 4: k4cl();break;
- }
- }
- }
- }
- void k1cl()
- {
- sj1=sj1+5;
- if(sj1>100)
- sj1=30;
- s=sj1;
- }
- void k2cl()
- {
- sj2=sj2+5;
- if(sj2>500)
- sj2=40;
- s=sj2;
- }
- void k3cl()
- {
- sj3=sj3+10;
- if(sj3>500)
- sj3=100;
- s=sj3;
- }
- void k4cl()
- {
- sx1=sj1-1;
- sx1=sx1/csbc;
- mqs=sx1/4.5;
- }
- void offmsd()
- {
- if (buffer[0] == 0x3f)
- buffer[0] = 0x00;
- }
復制代碼
|
|