📄 cscj_timer0_2.c
字号:
#include <iom128v.h>
#include <iom128.h>
#include <macros.h>
#include "lcd12864.h"
#include <BIT.h>
#define csbout _PB4
#define uchar unsigned char
#define uint unsigned int
//#pragma interrupt_handler timer3:30
uint c=0,flag=0,aa=0,b=0,csin;
uint s=0,cscj=34;//3.4mm/10us
/*******************************************
函数名称: delayus
功 能: 延时指定微秒(8.31M晶振)
参 数: us--延时的微秒数(大约,不是很精确,MS越大越准确)
返回值 : 无
/********************************************/
void delayus(uint us)
{
uint i;
us=us*13/10; //13/10是在8.31MHz晶振下,通过反复实验得到的数值
for( i=0;i<us;i++);
}
/*******************************************
函数名称: delay()
功 能: 8.31MHz晶振下延时 z ms
参 数: z
返回值 : 无
/********************************************/
void delayms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=1185;y>0;y--);
}
/*******************************************
函数名称: timer1()
功 能: 进入中断后让发光二极管点亮
检测是否收到超声波
返回值 : 无
/********************************************/
/*void timer1()
{
TCNT1H=0xff;//3c;
TCNT1L=0xf6;//b0;
aa++;
if(aa>=10)
{
aa=0;
s=0;
//bb++;
DDRB&=~BIT(PB4);
TIMSK&=~0x04;
delayms(10);
DDRB|=BIT(PB4);
TIMSK|=0x04;
}
}*/
/*******************************************
函数名称: timer3()
功 能: 进入中断后让发光二极管点亮
检测是否收到超声波
返回值 : 无
/********************************************/
void timer3()
{
TCNT3H=0X43;
TCNT3L=0Xf9;
b++;
if(b==5)
{
b=0;
c=1;
flag=0;
ETIMSK&=~0x04;
}
}
/*******************************************
函数名称: timer0_init()
功 能: 定时器0初始化 配置输出40khz占空比50%的方波
参 数: 无
返回值 : 无
/********************************************/
void timer0_init()
{
DDRB&=~BIT(PB4);
ASSR&=~BIT(3);
TCCR0=0X19;
OCR0=0X66;//经示波器测试产生39.92kHZ的正弦方波
TIMSK|=BIT(1);
}
/*******************************************
函数名称: timer1_init()
功 能: 定时器1初始化 用于测量距离以及控制超声波发射接收
参 数: 无
返回值 : 无
/********************************************/
void timer1_init()
{
TCCR1B=0X02;
TCNT1H=0x00;//0X3c;ff
TCNT1L=0x00;//0Xb0;f6
TIMSK&=~BIT(2);
//SREG|=BIT(7);//问题在这 开全局中断时不能产生40khz 方波
}
/*******************************************
函数名称: timer3_init()
功 能: 定时器3初始化 用于测量距离以及控制超声波发射接收
参 数: 无
返回值 : 无
/********************************************/
void timer3_init()
{
TCCR3B=0X02;
TCNT3H=0X43;
TCNT3L=0Xf9;
ETIMSK|=0x04;
SREG|=BIT(7);
}
void main()
{
uint i,j;
DDRA=0XFF;
DDRD&=~BIT(2);
PORTD|=BIT(2);
PORTA=0X00;
timer3_init();
timer1_init();
timer0_init();
lcd12864_init();/* */
line1 = "检测到障碍物";
line2 = " 距离:";
DDRB|=BIT(PB4);
TIMSK|=0x04;
while(1)
{
if(flag==1)
{
line1 = "检测到障碍物";
line2 = " 距离:";
display();
flag=0;
PORTA=0X77;/**/
write_com(0x94);
write_data((s%1000/100)+0x30);
write_data((s%100/10)+0x30);
write_data((s%10)+0x30);
lcd_write("mm");
delayms(500);
PORTA=0X00;
TCNT1L=0x00;
TCNT1H=0x00;
DDRB|=BIT(PB4);
TIMSK|=0x04;
}
//if(c==1)
// {
i=0;
// TCNT1L=0x00;
// TCNT1H=0x00;
//DDRB|=BIT(PB4);
// TIMSK|=0x04;
csin=PIND&BIT(2);
while(csin==BIT(2))
{
if(++i>=8000)
break;
}
DDRB&=~BIT(PB4);
TIMSK&=~0x04;
// TCNT3H=0X43;
// TCNT3L=0Xf9;
// ETIMSK|=0x04;
if(i<8000)
{
flag=1;
aa=TCNT1H*256+TCNT1L;
s=aa*cscj/20-100;
TCNT1L=0x00;
TCNT1H=0x00;
}
// }
if(i>=8000)
{
TCNT1L=0x00;
TCNT1H=0x00;
DDRB|=BIT(PB4);
TIMSK|=0x04;
}
if(flag==0)
{
clear_dis();
s=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -