超声波.docx
- 文档编号:6799557
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:13
- 大小:18.08KB
超声波.docx
《超声波.docx》由会员分享,可在线阅读,更多相关《超声波.docx(13页珍藏版)》请在冰豆网上搜索。
超声波
#include
#include
#include"delay.h"
#include"display.h"
#include"sound.h"
//voidinit(void);
//voidinit_measure(void);
//voidmeasure(void);
ucharflag_timer0_full=0,flag_int0_down=0;
externuintdistance;
voidmeasure_init(void)
{
EIMSK=0x00;
EICRA=0xaa;//10101010
EIMSK=0x0f; //使能外部中断0
TCCR1B|=BIT(0);//
TIMSK|=BIT
(2);
TCNT1=0;
Rx_in;
Rx_1;
Tx_out;
Tx_0;
}
#pragmainterrupt_handlerint0:
2
voidint0(void)
{
distance=TCNT1;
distance=distance/58;
flag_int0_down=1;
}
#pragmainterrupt_handlertimer0_ovf:
15
voidtimer0_ovf(void)
{
flag_timer0_full=1;
}
voidmeasure(void)
{
uchartemp=0,wait=0;
SREG|=BIT(7);//
Rx_in;
Rx_1;
Tx_out;
Tx_0;
Tx_1; //
delay_us(20);
Tx_0;
Tx_1; //
delay_us(20);
Tx_0;
while
(1)
{
wait=Rx_v;
if(wait==1)
{
break;
}
}
TCNT1=0;
while(!
flag_int0_down);
flag_int0_down=0;
while(!
flag_timer0_full)
{
Lcd_DisplayData(0,3,distance);
}
flag_timer0_full=0;
TCNT1=0;
SREG&=~BIT(7);
}
voidmain(void)
{
measure_init();
lcd_init();
lcd_clr();
Lcd_DisplayString(0,0,"距离:
cm");
while
(1)
{
measure();
Lcd_DisplayData(0,3,distance);
}
}
/*
超声波测距程序
接口定义:
Echo接PD0(外部中断0)Trig接PD1
*/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
//引脚定义
#defineEcho_outDDRD|=BIT(0)
#defineEcho_inDDRD&=~BIT(0)
#defineEcho1PORTD|=BIT(0)
#defineEcho0PORTD&=~BIT(0)
#defineEcho_vPIND&BIT(0)
#defineTrig_outDDRD|=BIT
(1)
#defineTrig_inDDRD&=~BIT
(1)
#defineTrig1PORTD|=BIT
(1)
#defineTrig0PORTD&=~BIT
(1)
voiddelay(uintms);
voiddelay_us(uintus);
voidinit(void);
voidinit_ultrasonic();
voiddisplay(uinta);
voidultrasonic(void);
#pragmainterrupt_handlerint0:
2
#pragmainterrupt_handlertimer1_ovf:
15
/*数码管显示段码和位码*/
constuchartable_duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
constuchartable_wei[]={0x01,0X02,0X04,0X08};
ucharge=0,shi=0,bai=0,qian=0;
ucharflag_timer1_full=0,flag_int0_down=0;
uintdistance=0;
voidmain(void)
{
init();
init_ultrasonic();
delay(200);
while
(1)
{
ultrasonic();
display(distance);
}
}
voidinit(void)
{
DDRA=0XFF;
DDRB=0XFF;
DDRC=0XFF;
DDRD=0XFF;
DDRE=0XFF;
PORTD=0XFF;
}
voidinit_ultrasonic()
{
Echo_in;
Echo1;
Trig_out;
Trig0;
EICRA|=BIT
(1);//初始化外部中断0,用于检测接收到的脉冲
EIMSK|=BIT(0);
TCCR1B|=BIT
(1);//定时器初始化
TIMSK|=BIT
(2);
TCNT1=0;
}
voidint0(void)
{
distance=TCNT1;
distance=distance/58;
flag_int0_down=1;
}
voidtimer1_ovf(void)
{
flag_timer1_full=1;
}
/********************************************************************
*名称:
ultrasonic()
*功能:
超声波测距函数
*输入:
无
*输出:
测量值
***********************************************************************/
voidultrasonic(void)
{
uchartemp=0,wait=0;
SREG|=BIT(7);//开中断
Echo_in;
Echo1;
Trig_out;
Trig0;
Trig1;//发送声波20us
delay_us(20);
Trig0;
while
(1)
{
wait=Echo_v;
if(wait==1)
{
break;
}
}
TCNT1=0;
while(!
flag_int0_down);
flag_int0_down=0;
while(!
flag_timer1_full)
{
display(distance);
}
flag_timer1_full=0;
TCNT1=0;
SREG&=~BIT(7);
}
/********************************************************************
*名称:
display()
*功能:
4位数码管的显示函数
*输入:
显示值,最大值为9999
*输出:
无
***********************************************************************/
voiddisplay(uinta)
{
ge=a%10;
shi=(a/10)%10;
bai=(a/100)%10;
qian=(a/1000)%10;
PORTA=~table_duan[qian];
PORTB=table_wei[0];
delay
(1);
PORTA=~table_duan[bai];
PORTB=table_wei[1];
delay
(1);
PORTA=~table_duan[shi];
PORTB=table_wei[2];
delay
(1);
PORTA=~table_duan[ge];
PORTB=table_wei[3];
delay
(1);
}
/********************************************************************
*名称:
delay()
*功能:
8M晶振时延时1ms
*输入:
时间值
*输出:
无
***********************************************************************/
voiddelay(uintms)
{
uintx,y;
for(x=0;x { for(y=0;y<1141;y++); } } voiddelay_us(uintus)//1us延时程序,用于使端口输出稳定 { uintx_us,y_us; for(x_us=0;x_us { for(y_us=0;y_us<1;y_us++); } } AVR的超声波测距程序---基于定时器外部捕捉功能 /** AVRmega128 8M晶振 本程序使用了F口作为12864的数据口,故下载程序前应该把JTAG功能关闭 ***/ #include #include #defineucharunsignedchar #defineuintunsignedint #defineulong unsignedlong //LCD端口定义 #defineE PORTA.2 #defineRW PORTA.1 #defineRS PORTA.0 #definePSBPORTA.3 #defineRSTPORTA.4 #defineLCD_Data PORTF //超声波端口定义 #defineTRING PORTA.5 #defineECHO PINE.7 //变量定义 ulongov_counter=0; uintrising_edge,falling_edge; ulongpulse_clocks; ulongecho_data; doublespeed; uint temp; unsignedcharflashnumlist[]="0123456789"; unsignedcharflashaddrlist[32]= {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f}; voidInit_Port(); voidInit_Reg(); voidEcho_scan(); voidCeliang(); voidLcd_Init(); //12864初始化 voidLcd_Write_Str(unsignedcharflash*s); //12864写汉字 voidLcd_Write_Cmd(ucharcom); //12864写数据 voidLcd_Write_Data(uchardat); //12864写数据 voidLcmPrint(unsignedcharx,unsignedchary,unsignedcharflash*adata); voidLcd_WriteNum(uchari,ucharj,ulongnumber); voidJiemian() { Lcd_Write_Cmd(0x88); Lcd_Write_Str("距离: "); Lcd_Write_Cmd(0x88+6); Lcd_Write_Str("mm"); delay_ms(60); } voidmain() { Init_Port(); //端口初始化 Init_Reg(); //寄存器初始化 Lcd_Init(); //12864液晶初始化 Jiemian(); //画出基本界面 //使能T/C3扑捉中断 while (1) { Echo_scan(); //超声波模块启动测量 Celiang(); //计算距离 Lcd_WriteNum(3,4,echo_data); //显示距离 } } //*************超声波扫描********** voidEcho_scan() { TRING=1; delay_us(20); TRING=0; } voidCeliang() { pulse_clocks=(double)pulse_clocks; echo_data=pulse_clocks*0.340/2-18; // } //*****************中断服务程序****************** interrupt[TIM3_OVF]voidTimer3_ovf_isr() { ov_counter++; } interrupt[TIM3_CAPT]voidTimer3_capt_isr() { if(ECHO){ rising_edge=ICR3L; temp=ICR3H; rising_edge|=temp<<8; TCCR3B&=0xbf; ov_counter=0; } else{ falling_edge=ICR3L; temp=ICR3H; falling_edge|=temp<<8; TCCR3B|=0x40; pulse_clocks=(ulong)falling_edge-(ulong)rising_edge +(ulong)ov_counter*0x10000; } } ////////////////////////////////////// voidLcd_Init() { RST=0; delay_ms(100); RST=1; Lcd_Write_Cmd(0x30); //选择基本指令集 //选择8bit数据流 Lcd_Write_Cmd(0x03); Lcd_Write_Cmd(0x01); //清除显示,并且设定地址指针为00H Lcd_Write_Cmd(0x0c); //开显示(无游标、不反白) } voidInit_Port() { PORTE=0XFF; DDRE=0X7F; //PORE.7超声波信号输入 PORTF=0xff; DDRF=0xff; PORTA=0xff; DDRA=0xff; } voidInit_Reg() { TCCR3B=0X42; ETIMSK=0X24; #asm("sei"); } voidLcd_WriteNum(uchari,ucharj,ulongnumber)/*在第i行第j列开始写3位数据*/ { uchara,b,c,d,e,f,g; //a=number/1000000; //b=(number%1000000)/100000; c=(number%100000)/10000; d=(number%10000)/1000; e=(number%1000)/100; f=(number%100)/10; g=number%10; Lcd_Write_Cmd(addrlist[8*i+j-9]); //Lcd_Write_Data(numlist[a]); //Lcd_Write_Data(numlist[b]); Lcd_Write_Data(numlist[c]); Lcd_Write_Data(numlist[d]); Lcd_Write_Data(numlist[e]); Lcd_Write_Data(numlist[f]); Lcd_Write_Data(numlist[g]); } //在坐标(x,y)处显示字符串 voidLcmPrint(unsignedcharx,unsignedchary,unsignedcharflash*adata) { if((y>3)||(x>7)) return;//如果指定位置不在显示区域内,则不做任何写入直接返回 switch(y) { case0: Lcd_Write_Cmd(0x80+x); break; case1: Lcd_Write_Cmd(0x90+x); break; case2: Lcd_Write_Cmd(0x88+x); break; case3: Lcd_Write_Cmd(0x98+x); break; } while(*adata>0) { Lcd_Write_Data(*adata); ////写8位的字符数据 adata++; ////指针指向下一个地址单元 } } unsignedcharLcd_CheckBusy(void) { unsignedcharBusy; LCD_Data=0xff; RS=0; RW=1; E=1; delay_us (1); Busy=LCD_Data&0x80; E=0; returnBusy; } /*********************************** 从LCD中读出数据 ************************************/ unsignedcharLcd_ReadData(void) { unsignedcharTemp; while(Lcd_CheckBusy()); LCD_Data=0xff; RS=1; RW=1; E=1; delay_us (1); Temp=LCD_Data; E=0; returnTemp; } //-------------12864写数据函数----------------- voidLcd_Write_Data(uchardat) { delay_ms(3); RS=1; RW=0; E=1; LCD_Data=dat; E=0; } //-------------12864写命令函数---------------- voidLcd_Write_Cmd(ucharcom) { delay_ms(5); RS=0; RW=0; E=1; LCD_Data=com; E=0; } //-------------12864显示写汉字函数--------------- voidLcd_Write_Str(unsignedcharflash*s) { while(*s>0) { Lcd_Write_Data(*s); s++; delay_ms (1);// 原文是delay(50); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 超声波