📄 cscj_timer1.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 + -