




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于atmega88的超声波测距仪作品采用ATMEL公司的ATMGEA88 作为MCU,内部有8K FLASH,1kram。工作在内部8M RC振荡下,耗电仅为2MA左右。采用RISC指令集的AVR核心,运算速度大大超过传统的51单片机。内部带有3个定时器,8路10位AD(模数转换器),串口,硬件SPI,方便使用。大批量采购价格目前由于炒货的原因涨价到12RMB。(具体问题可以搜索下,网上吹捧得很多)推荐你看一下中文的PDF,到处都有下载的。采用这块芯片主要来说就有一点,比51先进,功耗低,内带AD,而且外部不需要加晶振。使用一块LCD5110手机屏作为显示设备,可以显示输出电压以及当前状态。
2、液晶屏参数为72*48,点阵式,使用一个驱动库作为支持,方便开发,工作在3.3V电压下。耗电极低,小于1MA,背光耗电为20MA。屏的资料到使用一片LDO(低压差线性稳压源)作为系统电源,LM1117-3.3V,输出电压为3.3V,最大电流500MA以下为单片机的复位电路和烧录程序用的接口本设计中应用了MAX232来放大发射的40K信号,MAX232本来是用作串口电源转换器,它的本质是一个电荷泵升压器,所以可以直接将发射电压提高到正负9伏,使信号发射能力大大加强。超声波发射头使用的是普通的压电式头,中心频率都在40KHZ。有R,T之分。由于接受到的信号比较小,所以使用运放将接收后的信号放大。A
3、D623为ADI公司的轨至轨仪表放大器,单电源优化,可以工作在3V的极低电压。只需要使用一个电阻就可以改变放大倍率,最大放大倍率为1000,带宽增益乘积比为1M。功耗极低,可以满足长期工作的需要。信号放大后,将输入到单片机的模拟比较器中进行比较。当信号输入幅度大于一定值时,定义为接受到信号。超声波发射后,等待第一次回波经过后,打开中断,就可以等待超声波信号的到来。只要将发射时间和接收时间用定时器计时,就可以精确的得出超声波回声所用的时间。然后通过18B20采集温度后便可以计算出当前测距仪与被测物体的距离经过测算后,我选择将AIN1的值确定为2.7V,这样在接收的回波中,可以通过延时去掉。具体可
4、以看波形。如图中所示,第一个黑点是我们发出的信号的时候,直接从发射头横向送到接收头造成的误差信号。第二个黑店是接收信号的回波。当我将触发点选择到2.7V时,延时0.5MS后,就可以将发射的第一个误差信号消去,并将中断打开,等待第二个信号的进入。当信号电平高于2.7V后(这个是一个正弦波,会上下波动的),模拟比较器将触发,并通过AVR内部的选通,进入定时器1的输入捕捉中断中。只要此时停下计时器,便可以得出信号发射到信号接收的时间差。造成这种状况的主要原因为PWM发射和关断有延时,而发射头本身的电容会导致发射继续持续一段时间软件流程图#include <mega88p.h>#inclu
5、de <delay.h>#include "lcd5110.h"unsigned int time,t;unsigned long int juli,c;unsigned char chufa,run,time0,time1,yichu,chaoshi;#define uint unsigned int#define uchar unsigned char/ Pin change 8-14 interrupt service routine#ifndef RXB8#define RXB8 1#endif#ifndef TXB8#define TXB8 0#end
6、if#ifndef UPE#define UPE 2#endif#ifndef DOR#define DOR 3#endif#ifndef FE#define FE 4#endif#ifndef UDRE#define UDRE 5#endif#ifndef RXC#define RXC 7#endif#define FRAMING_ERROR (1<<FE)#define PARITY_ERROR (1<<UPE)#define DATA_OVERRUN (1<<DOR)#define DATA_REGISTER_EMPTY (1<<UDRE)
7、#define RX_COMPLETE (1<<RXC)/ USART Receiver buffer#define RX_BUFFER_SIZE0 8char rx_buffer0RX_BUFFER_SIZE0;#if RX_BUFFER_SIZE0<256unsigned char rx_wr_index0,rx_rd_index0,rx_counter0;#elseunsigned int rx_wr_index0,rx_rd_index0,rx_counter0;#endif/ This flag is set on USART Receiver buffer ove
8、rflowbit rx_buffer_overflow0;/ USART Receiver interrupt service routineinterrupt USART_RXC void usart_rx_isr(void)char status,data;status=UCSR0A;data=UDR0;if (status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN)=0) rx_buffer0rx_wr_index0=data; if (+rx_wr_index0 = RX_BUFFER_SIZE0) rx_wr_index0=
9、0; if (+rx_counter0 = RX_BUFFER_SIZE0) rx_counter0=0; rx_buffer_overflow0=1; ; ;#ifndef _DEBUG_TERMINAL_IO_/ Get a character from the USART Receiver buffer#define _ALTERNATE_GETCHAR_#pragma used+char getchar(void)char data;while (rx_counter0=0);data=rx_buffer0rx_rd_index0;if (+rx_rd_index0 = RX_BUFF
10、ER_SIZE0) rx_rd_index0=0;#asm("cli")-rx_counter0;#asm("sei")return data;#pragma used-#endif/ Standard Input/Output functions#include <stdio.h>/ Timer 0 overflow interrupt service routineinterrupt TIM0_OVF void timer0_ovf_isr(void) #asm("cli")if(chaoshi=10) run=1;
11、chaoshi+; #asm("sei")/ Place your code hereuchar ds1820_reset(void) uchar i; DDRD.4=1; PORTD.4=0; delay_us(500); /*延时500uS(480-960)*/ PORTD.4=1; DDRD.4=0; delay_us(80); /*延时80uS*/ i =PIND.4; delay_us(500); /*延时500uS(保持>480uS)*/ if (i) return 0x00; else return 0x01; uchar ds1820_read_byt
12、e(void) uchar i; uchar value = 0; for (i = 8; i != 0; i-) value >>= 1; DDRD.4=1;PORTD.4=0;PORTD.4=1; DDRD.4=0; if (PIND.4) value|=0x80; delay_us(60); /*延时60uS*/ return(value); void ds1820_write_byte(uchar value) uchar i; for (i = 8; i != 0; i-) DDRD.4=1;PORTD.4=0; delay_us(4); if (value &
13、0x01) PORTD.4=1; delay_us(80); /*延时80uS*/ PORTD.4=1; /*位结束*/ value >>= 1; void ds1820_start(void) ds1820_reset(); ds1820_write_byte(0xCC); /*勿略地址*/ ds1820_write_byte(0x44); /*启动转换*/ unsigned int ds1820_read_temp(void) unsigned int i; uchar buf9; ds1820_reset(); ds1820_write_byte(0xCC); /*勿略地址*
14、/ ds1820_write_byte(0xBE); /*读取温度*/ for (i = 0; i < 9; i+) bufi = ds1820_read_byte(); i = buf1; i <<= 8; i |= buf0; i=i*0.625*100; return i; / Timer1 overflow interrupt service routineinterrupt TIM1_OVF void timer1_ovf_isr(void) #asm("cli") yichu+; #asm("sei") / Place yo
15、ur code here/ Timer1 input capture interrupt service routineinterrupt TIM1_CAPT void timer1_capt_isr(void) /定时器中断,处理停止计数器之后的工作 #asm("cli") TCCR1B=0x00; /停止计数器 time1=TCNT1L; time0=TCNT1H; time=time0*256+time1; ds1820_start(); delay_us(210); t=ds1820_read_temp(); /读取18b20的温度 LCD_write_6_8str
16、ing(0,0," Temperature "); LCD_write_6_8string(0,1," "); LCD_write_float(24,1,(float)t/1000); c=(unsigned long int)t*607/10000+33150; /计算声速 juli=(unsigned long int)time*c/80000/2; LCD_write_6_8string(0,2," Sound speed "); LCD_write_6_8string(0,3," cm "); LCD_wr
17、ite_float(12,3,(float)c/100); LCD_write_6_8string(0,4," Distance "); LCD_write_6_8string(0,5," cm "); LCD_write_float(12,5,(float)juli/100); /LCD_write_number(0,5,time); #asm("sei") / Place your code here / Declare your global variables herevoid main(void)/ Declare your
18、 local variables here/ Crystal Oscillator division factor: 1#pragma optsize-CLKPR=0x80;CLKPR=0x00;#ifdef _OPTIMIZE_SIZE_#pragma optsize+#endif/ Input/Output Ports initialization/ Port B initialization/ Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out / State7=0 State6=
19、0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTB=0x00;DDRB=0xFF;/ Port C initialization/ Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In / State6=T State5=T State4=T State3=P State2=P State1=T State0=T PORTC=0x0C;DDRC=0x00;/ Port D initialization/ Func7=In Func6=In Func5=
20、In Func4=In Func3=Out Func2=In Func1=In Func0=In / State7=T State6=T State5=T State4=T State3=0 State2=T State1=T State0=T PORTD=0x00;DDRD=0x08;/ Timer/Counter 0 initialization/ Clock source: System Clock/ Clock value: 7.813 kHz/ Mode: Normal top=FFh/ OC0A output: Disconnected/ OC0B output: Disconne
21、ctedTCCR0A=0x00;TCCR0B=0x05;TCNT0=0x00;OCR0A=0x00;OCR0B=0x00;/ Timer/Counter 1 initialization/ Clock source: System Clock/ Clock value: 8000.000 kHz/ Mode: Normal top=FFFFh/ OC1A output: Discon./ OC1B output: Discon./ Noise Canceler: Off/ Input Capture on Rising Edge/ Timer1 Overflow Interrupt: On/
22、Input Capture Interrupt: On/ Compare A Match Interrupt: Off/ Compare B Match Interrupt: OffTCCR1A=0x00;/TCCR1B=0x41;TCCR1B=0X00;TCNT1H=0x00;TCNT1L=0x00;ICR1H=0x00;ICR1L=0x00;OCR1AH=0x00;OCR1AL=0x00;OCR1BH=0x00;OCR1BL=0x00;/ Timer/Counter 2 initialization/ Clock source: System Clock/ Clock value: 800
23、0.000 kHz/ Mode: CTC top=OCR2A/ OC2A output: Disconnected/ OC2B output: Toggle on compare matchASSR=0x00;TCCR2A=0x12;TCCR2B=0x00;/TCCR2B=0x01;TCNT2=0x00;OCR2A=0x66;OCR2B=0x00;/*/ External Interrupt(s) initialization/ INT0: Off/ INT1: Off/ Interrupt on any change on pins PCINT0-7: Off/ Interrupt on a
24、ny change on pins PCINT8-14: On/ Interrupt on any change on pins PCINT16-23: OffEICRA=0x00;EIMSK=0x00;PCICR=0x02;PCMSK1=0x0C;PCIFR=0x02;*/ Timer/Counter 0 Interrupt(s) initializationTIMSK0=0x01;/ Timer/Counter 1 Interrupt(s) initializationTIMSK1=0x21;/ Timer/Counter 2 Interrupt(s) initializationTIMSK2=0x00;/ USART initialization/ Communication Parameters: 8 Data, 1 Stop, No Parity/ USART Receiver: On/ USART Transmitter: On/ USART0 Mode: Asyn
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《数学概念与运用》课件
- 《色彩学基础》课件
- 送儿子出国劳务合同协议
- 退休劳动合同补偿协议
- 水果配送协议书
- 建房相邻关系协议书
- 狗狗寄养协议书
- 还款货款合同协议书范本
- 软件公司收入合同协议
- 转租超级蜂巢合同协议
- 辐射安全考核(X射线探伤)题库(含答案)
- 2025年甘肃兰州市事业单位公开招聘考试笔试高频重点提升(共500题)附带答案详解
- 2025年四川成都农业科技职业学院招聘工作人员16人高频重点提升(共500题)附带答案详解
- 炎症介导的气道重塑研究-洞察分析
- 2025年南网国际公司招聘笔试参考题库含答案解析
- 新《民法典》知识竞赛题库及答案(500题)
- 电力工程质量目标、质量保证体系及技术组织措施
- 2025年新高考语文古诗文理解性默写(含新高考60篇)
- 超声科室发展规划
- 护理人文关怀与沟通
- 24小时陪护协议书最简单三个步骤
评论
0/150
提交评论