|
/****************************
作用:利用超声波测距
函数说明:当输入捕获到信号,大于200HZ时,turn=1,产生动作
/*****************************/
#include"iom128v.h"
#include"macros.h"
#define uchar unsigned char
#define uint unsigned int
#include"Display.c"
#define a (PIND&0X10)
long time, flag,S;
void init(void)
{
TCCR1A=0X00; //非比较匹配.PWM模式,一般模式
TCCR1B=0X02;
TCNT1H=0;
TCNT1L=0;
DDRB|=BIT(4);
DDRD|=BIT(4);
PORTD=0;
DDRD&=~BIT(4);
SREG|=BIT(7); //开全局中断
}
void start(void)
{
PORTB=0XFF;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
PORTB=0;
}
void Conut(void)
{
time=TCNT1H*256+TCNT1L;
TCNT1H=0;
TCNT1L=0;
S=(time*1.7)/100; //算出来是CM
if((S>=700)||flag==1) //超出测量范围显示“-”
{
flag=0;
Write_Add(0,0);
Write_Data('-');
}
else
{
Write_Add(0,0);
Write_Num(S%10000/1000);
Write_Num(S%1000/100);
Write_Num(S%100/10);
Write_Num(S%10);
}
}
void main(void)
{
LCD_init();
init();
TCNT1H=0;
TCNT1L=0;
while(1)
{
start();
while(!(a==0x10));
SREG|=BIT(7);;//使能定时器1中断
while(a==0x10);
SREG&=~BIT(7);;
Conut();
Delaynms_Dis(100);
}
}
#pragma interrupt_handler timer_1:15
void timer_1(void)
{
flag=1;
}
以上是我根据51的例程的改的,不知道哪错了,估摸着用SREG|=BIT(7)代替51的TR0有问题,avr里有控制定时器计数的寄存器吗,而不是控制中断的开关 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|