求助:谁能给个atmega16对超声波hc-sr04测距程序。要可以用的!

 我来答
alicepeter等待
2011-08-25
知道答主
回答量:3
采纳率:0%
帮助的人:3.2万
展开全部
//ICC-AVR application builder : 2011-8-25 16:45:09
// Target : M16
// Crystal: 16.000Mhz
//PD6接trig,PD7接echo,系统时钟8分频,用T1的输入补捉
#include <iom16v.h>
#include <macros.h>
#include "lcd1602.h"
#include "delay.h"
#define uint unsigned int
#define uchar unsigned char
uchar dist_num[6]=" mm";//存放要显示的数据
void port_init(void)
{
PORTA = 0x00;
DDRA = 0xFF;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x03; //m103 output only
DDRC = 0xFC;
PORTD = 0xb0;
DDRD = 0xbF;
}

//TIMER1 initialize - prescale:8
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1KHz
// actual value: 1.000KHz (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xF8; //setup
TCNT1L = 0x30;
OCR1AH = 0x07;
OCR1AL = 0xD0;
OCR1BH = 0x07;
OCR1BL = 0xD0;
ICR1H = 0x07;
ICR1L = 0xD0;
TCCR1A = 0x00;
TCCR1B = 0xC2; //start Timer
}

//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer1_init();
lcd_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x20; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}

void main(void)
{
uchar i;
init_devices();
while(1)
{
PORTD|=0x80;
delay_us(20);
PORTD&=0x7f;
write_com(0x80);
for(i=0;i<6;i++)
{
write_data(dist_num[i]);
}
delay_ms(400);
}
}

#pragma interrupt_handler timer1_capt_isr:6
void timer1_capt_isr(void)
{
uint time=0;
float dist=0;
if(TCCR1B==0xC2)
{
TCNT1=0;
TCCR1B=0x82;
}
else
{
dist=TCNT1;
TCCR1B=0xC2;
if(TCNT1>60000);//超过5100mm作为错误处理
else
{
dist*=0.085;//系统时钟8分频,每记1次等于0.085mm
time=dist;//转换成整型,可以作取余运算
dist_num[0]=time/1000+48;
dist_num[1]=time%1000/100+48;
dist_num[2]=time%100/10+48;
dist_num[3]=time%10+48;
}
}
}
中断处理后数据都放在dist_num中,已经转换成asic||码。你可以用自己的显示模块显示。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
艾因蒂克
2024-11-28 广告
超声阵列探头是艾因蒂克科技(上海)有限公司在超声检测领域的一项重要技术产品。它采用先进的阵列设计,能够显著提高超声检测的精度和效率。该探头通过多个超声传感器的协同工作,实现对被检测物体的全方位、多角度扫描,从而更准确地发现物体内部的缺陷和问... 点击进入详情页
本回答由艾因蒂克提供
手机用户24304
2011-08-24 · 贡献了超过114个回答
知道答主
回答量:114
采纳率:0%
帮助的人:60.1万
展开全部
我有。用外部中断0做输入。

#include <mega16.h>
#include <delay.h>
#define uchar unsigned char
unsigned char ge,shi,bai,qian,flag,x,cont;
unsigned int temp,temp_1,temp_2,y;
flash unsigned char duan[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

void dis()
{
DDRA=0X0F;
DDRB=0XFF;
PORTA=0XFF;
PORTB=duan[qian];
PORTA.0=0;
delay_ms(1);
PORTA.0=1;

PORTB=duan[bai];
PORTA.1=0;
delay_ms(1);
PORTA.1=1;

PORTB=duan[shi];
PORTA.2=0;
delay_ms(1);
PORTA.2=1;

PORTB=duan[ge];
PORTA.3=0;
delay_ms(1);
PORTA.3=1;

}
void jisuan()
{
temp_1=temp;
temp_1=temp_1*17;
temp_1=temp_1/100;
ge=temp_1 % 10;
temp_1=temp_1 / 10;
shi=temp_1 % 10;
temp_1=temp_1 / 10;
bai=temp_1 % 10;
qian=temp_1 / 10;
flag=0;
temp=0;
}
void init()
{
temp=0;
DDRD.2=0;
DDRD.5=1;
PORTD.2=1;
GICR=0X00; //,先不允许中断 GICR=0X40; //INT0中断允许
MCUCR=0X0A; //下降沿触发
GIFR=0XC0; //清中断INT0中断标志位
DDRC=0XFF;

TCCR2=0X09; //不分频
TCNT2=0;
OCR2=119; //10US;
TIMSK=0X80;
SREG|=0X80;

}
interrupt [2] one_INT0()
{

x++;
if(x>=2)
{
TCCR2=0; //收到回波,停止计时。
GICR=0; //关INT0中断。
x=0;
PORTC=temp;
jisuan();
flag=0;
}
delay_us(20);
}
interrupt [4] two_T2() //T2定时器溢出中断,计时。
{
temp++;
}
void send40k()
{

DDRD.5=1; //CTC模式
TCCR1A=0X40;
TCCR1B=0X09;
OCR1A=149;
}
void close40k()
{
TCCR1B=0;
}
void main(void)
{
init();
flag=1;
DDRC=0XFF;
PORTC=0XFF;
DDRD.2=0;
PORTD.2=1;
while(flag)
{
GICR=0X00;
TCNT2=0;
temp=0;
send40k();
while(1);
TCCR2=0X09; //开始计时
delay_us(125);
close40k();
// PORTD.5=1;
delay_us(1500);
GICR=0X40; //开INT0中断。
while(!(temp>=6000)&&flag) //等待外部中断 防止卡死。 temp=5000,50ms,17米
{

}
if(temp>=6000)
{
GICR=0X00;
TCCR2=0X00;
ge=shi=bai=qian=0;
delay_ms(500);
}
y=700;
while(y--)dis();
flag=1;
}

}
追问
这不是抄的么?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式