|
ATMEGA8單片機制作的超聲波測距儀,測量范圍10cm-250cm,測距小于100cm時,誤差是1~2cm.,大于100cm時,誤差是3~5cm。5V供電 檢測距離 0.5M,ATMEGA8單片機制作的超聲波測距儀由3位LED數碼管顯示障礙物距離, 3位LED數碼管采用積木式插裝方式,便于調試檢查及使用在不同場合。這款超超聲波測距儀,電路簡單,制作容易,ATMEGA8單片機制作的超聲波測距儀比較適合手于制作超聲波避障小車的避障傳感器。下面附上電原理圖、源程序,方便大家仿制,需要說明的一點,這款超聲波測距儀的資料來源于網絡,作者:xinchangkk,這里要感謝一下作者的無私奉獻。
點擊
ATMEGA8單片機制作的超聲波測距儀程序.zip
(2.27 KB, 下載次數: 37)
2015-4-12 01:52 上傳
點擊文件名下載附件
下載積分: 黑幣 -5

- 雙龍SL-SRF-25超聲波測距—AVR單片機
- /*********************************************************************
- Project : 超聲波測距
- Chip type : ATMEGA8
- Clock frequency: 8.000000MHz
- *********************************************************************/
- #include<iom8v.h>
- #include<macros.h>
- #pragma interrupt_handler intt0:10 //T0溢出中斷
- #pragma interrupt_handler icp_timer1:6 //T1捕捉中斷
- #pragma data:code //設定數據區為程序存儲器
- const unsigned char tab1[]={0X28,0XEE,0X32,0XA2,0XE4,
- 0XA1,0X21,0XEA,0X20,0XA0};//七段譯碼字型表(lm,cm)
- const unsigned char tab2[]={0X08,0XCE,0X12,0X82,0XC4,
- 0X81,0X01,0XCA,0X00,0X80};//七段譯碼字型表(m)
- #pragma data:data //設定數據區回到數據存儲器
- unsigned char ledbuff[]={0X08,0X28,0X28};//顯示緩沖區
- unsigned char count;
- unsigned char newcount;
- unsigned char oldcount;
- void intt0(void)//T0中斷定時程序,定時58US,即測距1CM.
- {
- TCNT0=0XC6;
- count++;
- }
- void icp_timer1(void)//ICP1捕捉中斷,捕捉頻率38.5~41.6
- {
- if (96<=ICR1<=104)
- {
- SREG&=0X7f;
- newcount=count-13;
- ICR1=0;
- TCNT1=0;
- TCCR1B=0X81;
- }
- }
- void delay_1us(void)//1us
- {
- asm("nop");
- }
- void delay_us(unsigned int t)//tus
- {
- unsigned int i=0;
- for(i=0;i<t;i++)
- delay_1us();
- }
- void delay_1ms(void)//1ms
- {
- unsigned int i;
- for(i=1;i<1142;i++);
- }
- void delay_ms(unsigned char t)
- {
- unsigned char i=0;
- for(i=0;i<t;i++)
- {
- delay_1ms();
- }
- }
- void send40kHz(void) //發射40KHz超聲波
- {
- count=0;
- TIMSK&=0XDF;//禁止ICP1使能
- OCR2=0X64;
- TCCR2=0X19;
- }
- void close40kHz(void) //停止發射超聲波
- {
- TCCR2=0X00;
- }
- void hextobcd(unsigned char m)//將count十六進制數據轉換為LED七段碼
- {
- unsigned char temp;
- temp=m%10;
- ledbuff[0]=tab1[temp];//mm位
- m=m/10;
- temp=m%10;
- ledbuff[1]=tab1[temp];//lm位
- temp=m/10;
- ledbuff[2]=tab2[temp];//m位
- }
- void display3led(void) //數碼管顯示
- {
- unsigned char i;
- for(i=0;i<3;i++)
- {
- PORTD=ledbuff;
- PORTC=~(1<<i);//PC0-mm位,PC1-lm位,PC2-m位
- delay_1ms();
- PORTC=(1<<i);
- }
- }
- void display8led(void) //8LED顯示
- {
- if(newcount<10)
- PORTD=0XFE;
- else if (newcount<20)
- PORTD=0XFD;
- else if (newcount<30)
- PORTD=0XFB;
- else if (newcount<40)
- PORTD=0XF7;
- else if (newcount<50)
- PORTD=0XEF;
- else if (newcount<100)
- PORTD=0XDF;
- else if (newcount<180)
- PORTD=0XBF;
- else
- PORTD=0X7F;
- }
- void mcu_init(void)//MCU初始化
- {
- DDRD=0XFF;
- PORTD=0XFF;
- DDRC=0XDF; //PC5為輸入
- PORTC=0XFF;
- DDRB=0XFE;
- PORTB=0XF7;
- TCNT2=0X00;
- TCNT0=0XC6; //T0定時58US
- TCCR0=0X02; //T0定時器1/8分頻
- TCNT1=0X00;
- TCCR1A=0X00;
- TCCR1B=0X81; //輸入捕獲噪音抑制允許,ICP1下降沿觸發,系統時鐘
- TIMSK=0X01; //使能T0定時溢出
- }
- void main(void)
- {
- unsigned char i;
- mcu_init();
- for(;;)
- {
- send40kHz();
- SREG|=0X80;
- delay_us(50);
- close40kHz();
- delay_us(20);
- TIMSK=0X21;
- if(!(PINC&0X20)) //如果插上JD1短路塊,則數碼管顯示距離
- {
- if (newcount!=oldcount)
- oldcount=newcount;
- hextobcd(oldcount);
- for(i=0;i<20;i++)
- display3led();
- }
- else
- {
- PORTC=0XFF;
- display8led();
- delay_ms(100);
- }
- }
- }
- 雙龍SL-SRF-25超聲波避障程序—51單片機
- /***********************************************************************/
- /*
- 廣州雙龍電子
- WWW.SL.COM.CN
- 功能:
- 超聲波避障,避障距離為10cm;前進遇障后退左轉彎.
- 接線方法:
- 52板P1.0(用短線)接超聲波傳感器J1-1(J1插針的第一腳)
- 注意:
- 用戶可以根據自已的避障距離,把52板P1.0腳連接到超聲波傳感器的相應腳
- 以下是避障距離范圍情況:
- 1: J1-1 避障距離范圍5~9cm
- 2: J1-2 避障距離范圍10~19cm
- 3: J1-3 避障距離范圍20~29cm
- 4: J1-4 避障距離范圍30~39cm
- 5: J1-5 避障距離范圍40~49cm
- 6: J1-6 避障距離范圍50~99cm
- 7: J1-7 避障距離范圍100~179cm
- 8: J1-8 避障距離范圍180~250cm
- Chip type : AT89S52
- Clock frequency : 24MHz
- */
- /************************************************************************/
- #include "reg52.h"
- sbit P1_0=P1^0; //定義避障距離檢測腳
- void delay_1ms(void) //1毫秒延時程序
- {
- unsigned char j=0,i=8;
- do
- {
- while(--j) ;
- }
- while(--i);
- }
- void delay(unsigned char i) // 毫秒級延時程序
- {
- while(i--)
- delay_1ms();
- }
- void forward(void) //LED4~5亮,前進
- {
- P0=0XE7;
- P3=0x50;
- }
- void left (void) //LED1~3亮,左轉
- {
- P0=0XF8;
- P3=0x60;
- }
- void back (void) //LED全亮,后退
- {
- P0=0;
- P3=0XA0;
- }
- void init(void) //端口初始化
- {
- P1|=0X01; //要讀取P1.0,就先寫1
- P0=255; //8LED全不亮
- P3=0;
- }
- /***********************************************************************
- 主函數
- ***********************************************************************/
- void main(void)
- {
- init(); //系統初始化
- while(1) //循環
- {
- if(!P1_0) //如果在避障范圍,則后退,左轉彎
- {
- back();
- delay(200); //后退200毫秒
- left();
- delay(200); //左轉90度.
- }
- else
- {
- forward();
- delay(200);
- }
- }
- }
復制代碼
|
|