藍橋杯STC基礎代碼-超聲波與頻率測量

上一章-藍橋杯STC基礎代碼-EEPROM和數模轉換

文章地址

超聲波

簡介

這裏是引用

板子超聲波是以 P10-發送端 P11-接收端
通過控制 發送端 ,我們製造40khz佔空比爲 50 的超聲波。
這個過程其實就是P10在高低電平不斷的切來切去。

sbit tx = P1^0;
sbit rx = P1^1;

#define  somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
	u8 i ;
	
	
	for(i = 0 ; i< 8 ;i ++)
	{
		tx = 1;
		somenop;somenop;somenop;somenop;
		tx = 0;
		somenop;somenop;somenop;somenop;
	}

具體過程如上,可以記住是拉高後停止40個 NOP 然後拉低再停止 40個NOP
循環八次是爲了加強超聲波。

超聲波的計時

在這裏我是用定時器0,配置過程比較簡單,可以直接在STC-ISP找到

這裏是引用

void ulr_TIM0_Init(void)
{
	AUXR |= 0x80;	
	TMOD &= 0xF0;		
	TL0 = 0;		
	TH0 = 0;		
	TF0 = 0;		
	TR0 = 0;			

	ET0 = 0;   //關閉中斷 可加可不加
}

使用超聲波流程

Created with Raphaël 2.2.0初始化定時器製造40khz超聲波定時器數值清0 ,開啓定時器等待接收端接收到超聲波或者定時器溢出是否正常計算結果結束yesno

超聲波代碼

sbit tx = P1^0;
sbit rx = P1^1;

#define  somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}

void ulr_TIM0_Init(void)
{
	AUXR |= 0x80;		
	TMOD &= 0xF0;		
	TL0 = 0;		
	TH0 = 0;		
	TF0 = 0;	
	TR0 = 0;	

	ET0 = 0;
}

float distance;

void Get_ulr_distance(void)
{
	u8 i ;
	
	for(i = 0 ; i< 8 ;i ++)
	{
		tx = 1;
		somenop;somenop;somenop;somenop;
		tx = 0;
		somenop;somenop;somenop;somenop;
	}
	TL0 = 0;
	TH0 = 0;
	TR0 = 1;
	
	while((rx == 1) &&( TF0 == 0))
	{
		
	}
	TR0 = 0;
	
	if(TF0)
	{
		TF0 = 0;
		distance = 255;
	}
	
	else
	{
		distance = ( (TH0 <<8 ) | TL0 ) * 0.00153; //cm
	}
	
	
}

定時器初始化放在系統初始化裏面
獲取超聲波函數可以放在100ms時間軸裏面,最好不要太快。

乘0.00153的原因:
定時器每走滿一次 即 走了 65536次則大約是 1/168.5s
(TH0 <<8 ) | TL0 是定時器的值

(TH0 <<8 ) | TL0 / 65536 = T / 1/168.5s
得到時間T爲 (TH0 <<8 ) | TL0 / (65536 * 168.5 )
聲的傳播速度340 ,一來一回我們算的是距離的兩倍。
所以距離爲 (TH0 <<8 ) | TL0 * 340 * T /2 = 0.00153 cm

頻率測量

簡介

頻率測量可以看成是1s內有多少個脈衝,所以我們只要配置定時器爲計數模式,然後計算1秒內有多少個脈衝,在這裏我們還要考慮定時器計數會溢出的問題,所以我們就要利用到定時器中斷了。
我的代碼是用定時器0,跟上面的超聲波一樣,但是如果有些題兩個都要用到的話,那也可以改成定時器1。

定時器的初始化

我們也可以利用燒錄器的代碼
不過要記得加上把定時器配置成計數器模式

void FRE_TIM0_Init(void)
{
	AUXR |= 0x80;;		  //12T
	TMOD &= 0xF0;	   
	TMOD |= 0x04;		   
	TL0 = 0x00;		
	TH0 = 0x00;	
	TF0 = 0;	
	
	ET0 = 1;   
	
	TR0 = 1;		
}

u16 fre_cnt;
void TIM0_interrupt(void) interrupt 1
{
	fre_cnt ++;
}

這裏我用fre_cnt存儲計數器溢出的次數。

頻率計算

頻率計算比較簡單,把溢出的次數65536 加上現在計數器的次數,就等於總的次數了,溢出的次數乘65536的原因是每次溢出都是已經計數了65536*

u16 tim1_fre;

void  Get_fre(void)
{
	TR0 = 0;
	tim1_fre =( TH0 << 8 ) | TL0 + fre_cnt * 65536;
	TL0 = 0x00;		
	TH0 = 0x00;		
	fre_cnt = 0;	
	TR0 = 1;
}

這個函數一定要放在 1s時間軸裏 。

總代碼

void FRE_TIM0_Init(void)
{
	AUXR |= 0x80;;		  //12T
	TMOD &= 0xF0;	   
	TMOD |= 0x04;		    //
	TL0 = 0x00;		
	TH0 = 0x00;	
	TF0 = 0;	
	
	ET0 = 1;   //¿ªÆôÖжÏ
	
	TR0 = 1;		
}

u16 fre_cnt;
void TIM0_interrupt(void) interrupt 1
{
	fre_cnt ++;
}

u16 tim1_fre;

void  Get_fre(void)
{
	TR0 = 0;
	tim1_fre =( TH0 << 8 ) | TL0 + fre_cnt * 65536;
	TL0 = 0x00;		
	TH0 = 0x00;		
	fre_cnt = 0;	
	TR0 = 1;
}

關於基礎的代碼到這就完結了,謝謝關注

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章