上一章-藍橋杯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; //關閉中斷 可加可不加
}
使用超聲波流程
超聲波代碼
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;
}
關於基礎的代碼到這就完結了,謝謝關注