⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cscj_timer1.c

📁 一个超声波测距的东西
💻 C
字号:
/*******************************************
* 文件名: ultrawave.c
* 功能: 用超声波模块检测小车前方是否有障碍物并测量其距离
* 说明: 1.定时器0产生40khz占空比50%的方波驱动超声波发射头发射超声波
                2.定时器1定时计算超声波发射到接收需要的时间,从而计算距离
		        3.外部中断2用于检测是否遇到障碍物 遇到障碍物时进入外部中断处理子函数
		        4.分段进行距离校正,3~10cm减2cm,10~20减1cm,20~100精确
/********************************************/
#include <iom128v.h>
#include <macros.h>
#include "12864.h"
//变量、常量定义
static uchar data[16];
static float distance=0.0;
volatile flag=0;
volatile uint time_counter=0;
//中断定义
#pragma interrupt_handler interrupt_int2:4 
#pragma interrupt_handler interrupt_timer1:15

/*******************************************
* 函数名称: int2()
* 函数功能: 进入中断后置标志位,表示收到超声波,并计算距离           
* 入口参数: 无
* 出口参数: 无
/********************************************/
void interrupt_int2()  
{
   DDRB &= ~BIT(PB4); 
   EIMSK &= ~BIT(2);
   TIMSK &= ~BIT(2);   
   flag = 1;  
}

/*******************************************
* 函数名称: timer1()
* 函数功能: 进入定时器中断后time_counter加1,用于距离的计算
* 入口参数: 无
* 出口参数: 无
/********************************************/
void interrupt_timer1()
{
   TCNT1H = 0xff;
   TCNT1L = 0x60;
   time_counter++;
   if(time_counter == 589)//设定测量上限为1米
       {
	       TIMSK &= ~BIT(2);   
	       time_counter = 589;
	    }		   
}

/*******************************************
* 函数名称: int2_init()
* 函数功能: 外部中断2初始化
* 入口参数: 无
* 出口参数: 无
/********************************************/
void int2_init() 
{
   DDRD &= ~BIT(2); 
   PORTD|= BIT(2); //设置输出口上拉
   EICRA = 0X20; 
   EIMSK &= ~BIT(2); 
}

/*******************************************
* 函数名称: timer0_init()
* 函数功能: 定时器0初始化  配置输出40khz占空比50%的方波
* 入口参数: 无
* 出口参数: 无
/********************************************/
void timer0_init()
{
   DDRB &= ~BIT(PB4);
   ASSR &= ~BIT(3);
   TCCR0 = 0X19;
   OCR0 = 0Xc7;//经示波器测试产生39.92kHZ的正弦方波
}

/*******************************************
* 函数名称: timer1_init()
* 函数功能: 定时器1初始化 用于测量距离
* 入口参数: 无
* 出口参数: 无
/********************************************/
void timer1_init()
{
    TCCR1B = 0X01;// 设置分频数为1,16MHZ  
	TCNT1H = 0xFF;// 设置计数初值, 每10微秒进入定时器中断处理子函数 使time_counter加1
    TCNT1L = 0x60;
	TIMSK &= ~BIT(2);//关闭溢出中断
}

/**************************************************************
* 函数名称:calculate_distance()
* 函数功能:计算距离
* 入口参数:无
* 出口参数:无
**************************************************************/
float calculate_distance(uint time)
{
    float value;    
	value = time*0.17;//time的单位为10us,S=(T*time/2),单位:cm
	return value;//返回距离值	
}

void main()
{  
   CLI();
   DDRA = 0XFF;
   int2_init();
   timer1_init();
   timer0_init();
   Init_12864(); //液晶初始化
   LcmClearTXT();//液晶清屏
   Display_x_y_data(0,0,"距离:");//液晶显示
   Display_x_y_data(0,7,"CM");//液晶显示	
   SEI();
   DDRB |= BIT(PB4);
   TIMSK |= BIT(2);
   delay_us(200);//设定测量下限为3CM
   EIMSK |= BIT(2);
   while(1)
   {
      if(flag == 1)
	  {
	    //收到返回超声波,清除标志位
	    flag = 0;			
		//计算距

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -