谁有基于AVR atmega16超声波测距程序 发给我
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;
}
}
#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;
}
}
福州大禹电子科技
2024-12-16 广告
2024-12-16 广告
福州大禹电子科技有限公司成立于2008年自创办以来,专注超声产品的研发和产业化,始终坚持技术创新是企业发展动力的理念,运用最基础的物理声学原理,攻克了一系列卡脖子难题,成功打破了国外垄断,把超声技术运用到了工控、水利、市政、环保、医疗,海洋...
点击进入详情页
本回答由福州大禹电子科技提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询