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

📄 chaoshengbo.c

📁 用超声波来测量距离
💻 C
字号:
unsigned int  distance=0,value = 0,lastdistan=0;
unsigned char Dis[5]=" .   ";
unsigned char cont=0;
long double times,vliu;

unsigned char flag=0;
unsigned char Wucha = 9;
/***********************************************
函数名:delay_ms
子函数:无
输  入:n
输  出:无
功  能:延迟n*0.05MS子程序
------------------------------------------------
************************************************/
void delay_ms(unsigned int n)
{
    unsigned int i=114;
	for(;n>0;n--)
	{
	    while(i--);
		i=114;
	}
}

/***********************************************
函数名:SIGNAL(SIG_INTERRUPT0)
子函数:无
输  入:无
输  出:无
功  能:外中断0服务程序
------------------------------------------------
************************************************/
SIGNAL(SIG_INTERRUPT0)
{
    GICR&=~(1<<INT0);
	if(flag == 0)
	{
	    GICR  |= 0x40;
	    flag = 1;
	}
	else
	{
	TCCR2  = 0x00;//停止定时器
    value  = TCNT2;
	
	times = (long double)((value+cont*255)*0.004);//ms单步是8us,由于是反射的波所以用4us
	vliu = (long double)(33.15+0.06*(TEMP_int+0.1*TEMP_flo));//cm/ms  
	
	lastdistan = (unsigned int)(times*vliu)-Wucha;
	if(lastdistan>7)
	{
	distance = lastdistan;
	Dis[0] = DataString[distance%1000/100];
	Dis[2] = DataString[distance%100/10];
	Dis[3] = DataString[distance%10];
	Dis[4] = '\0';
	dispstr_12864(3,1,Dis);
	
	if(distance>200){WORDFLAG = 0;PORTA = 0x01;}
	    else if(distance>100){WORDFLAG = 1;PORTA = 0x00;}
		    else if(distance>50){WORDFLAG = 2;PORTA = 0x02;}
			    else {WORDFLAG = 3;PORTA = 0x04;}
	}
	
	}
}

void init_devices(void)
{
	cli(); //禁止所有中断
	RD7 = 1;
	OD7 = 0;
	RD2 = 0;
	MCUCR |= 0x03;
	//GICR  |= 0x40;
	TCCR2  = 0x00;//停止定时器
	TCNT2  = 0x00;//初始值
	OCR2   = 0x00;//匹配值
	TIMSK |= 0x40;//中断允许
	//TCCR2  = 0x05;//启动定时器
	sei();//开全局中断
}


//T2溢出中断服务程序
SIGNAL(SIG_OVERFLOW2)
{
    cont++;
	TCNT2 = 0x00;
}
//测距离
void Distance(void)
{
    unsigned char i,j;
    TIMSK &= ~(1<<TOIE0); // T0溢出中断允许
	flag = 0;
    init_devices();
 
    TCNT2 = 0;
	cont  = 0;
	TCCR2  = 0x05;//启动定时器,单步8us
	for(j=0;j<7;j++)
	{
	    OD7 = 1;
		for(i=0;i<29;i++)asm("nop");
		OD7 = 0;
		for(i=0;i<49;i++)asm("nop");
	}
	delay_ms(3);
	GICR  |= 0x40;
    delay_ms(1300);
	GICR&=~(1<<INT0);
	TIMSK |= (1<<TOIE0); // T0溢出中断允许      
}


⌨️ 快捷键说明

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