#include <avr/io.h>
#include "lcd1602.h"
#define F_CPU 7372800 /* 单片机主频为7.3728MHz,用于延时子程序 */
#include <util/delay.h>
#include <avr/signal.h>
/****************************
/********* 定义变量及声明****************************************/
float t=3;
unsigned int fristv,secondv;
int i=0;
#define delay_us(x) _delay_us(x) //AVR GCC延时函数 x(us)
#define delay_ms(x) _delay_ms(x) //AVR GCC延时函数 x(ms)
unsigned char flag=0xff;
#define sonar_clr PORTD &= ~(1 << PD4); //RS置低
#define sonar_set PORTD |= (1 << PD4);
/****************************************************/
/********输入捕获模式设置*****************************/
void sonar_init()
{
TCNT1=0x10;
TIMSK|=1<<TICIE1; //ICP中断使能
TCCR1A=0X00;
TCCR1B=(1<<CS10)|(1<<CS11)|(0<<CS12)|(1<<ICES1)|(0<<WGM12)|(0<<WGM13); //外部时钟1分频,上升沿触发ICP,T1为普通模式
}
/******************************************************************************************
/**********************输入捕获模式测算距离*************************************/
SIGNAL(SIG_INPUT_CAPTURE1)
{
i=i+1;
//LCD_write_char(0,0,5);
if((i==1)) //判断是否为第一次(上升沿)进捕获中断
{
fristv=ICR1;
//flag=0X00;
TCCR1B=0X01; //设置为下降沿触发捕获中断,允许下降沿进入
//LCD_write_BCD(0,0,fristv);
TIFR=(1<<ICF1);
}
else if((i==2))
{ secondv=ICR1;
t=(secondv-fristv)*0.1417; //12Mhz的外部晶振S=T*340/2/12
i=0; //第二次进捕获中断
TCCR1B=0X41; //完成一次测距,重新设置为高电平触发CPI中断
// LCD_write_BCD(8,1,second);
}
//LCD_write_BCD(0,1,t);
}
/************************************************************************************/
int main()
{
lcd_system_init();
LCD_init();
sonar_init();
sei();
while(1)
{
sonar_set;
delay_us(15);
sonar_clr;
delay_us(15);
LCD_write_BCD(8,1,secondv);
LCD_write_BCD(0,0,fristv);
LCD_write_BCD(0,1,i);
}
} |