實驗步驟如下:
#包含?& ltREG52。H & gt
#定義?烏恰爾?未簽名?夏爾?
#定義?uint?未簽名?int?
#定義?ulong?未簽名?長的
#定義?LED_DAT?P1
sbit?LED_SEG0?=?p0^3;
sbit?LED_SEG1?=?p0^2;
sbit?LED_SEG2?=?p0^1;
sbit?LED_SEG3?=?p0^0;
//sbit?pin_SpeedSenser?=?p3^5;?//光電傳感器信號接T1。
#定義?CYLC時間?100?//12M晶振,定時器10ms?打斷壹次?我們是否每1秒計算壹次速度?//?1000ms/10ms?=?100
#定義?PLUS_PER?10?//碼盤的齒數?這裏假設碼盤上有10個齒,即傳感器檢測到10個脈沖,考慮1圈。
#定義?k?100.0?//校準系數
未簽名?夏爾?codetable[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f };
烏恰爾?數據?disbuf[4];//?顯示緩沖區?
uint?Tcounter?=?0;?//時間計數器
比特?Flag_Fresh?=?0;?//?刷新logo?
比特?Flag_clac?=?0;?//計算速度標誌?
比特?Flag_Err?=?0;?//加班標誌?
//在數碼管上顯示壹個四位數?
作廢?display fresh();
//計算轉速並將結果放入數碼管緩沖區?
作廢?ClacSpeed();
//初始化定時器T0
作廢?init _ timer 0();
//初始化定時器T1
作廢?init _ timer 1();
//延時功能?
作廢?延遲(uint?ms);
作廢?it_timer0()?打斷?1?/*?打斷?地址?是嗎?0x000b?*/
{
TF0?=?0;?//d定時器?T0用於數碼管的動態刷新?
//
TH0?=?0xC0/*?初始化?價值觀?*/
TL0?=?0x00?
Flag_Fresh?=?1;?
t counter++;?
if(t counter & gt;CYLC時間)
{?Flag_clac?=?1;//周期到了。是時候重新計算速度了嗎?
}
}
作廢?it_timer1()?打斷?3?/*?打斷?地址?是嗎?0x001b?*/
{
TF1?=?0;?//Timer T1用於單位時間接收的脈沖數?
//T1如果速度不是很快,永遠不會受益。
Flag_Err?=?1;?//如果速度很高,要考慮另壹種測速方法:脈寬計算為速度?
}
作廢?主要(無效)
{
Disbuf[0]?=?0;?//開機時初始化為0000。
Disbuf[1]?=?0;?
Disbuf[2]?=?0;
Disbuf[3]?=?0;
init _ timer 0();
init _ timer 1();
while(1)
{
if(Flag_Fresh)
{?Flag_Fresh?=?0;
display fresh();//?定期刷新數碼管顯示?
}
if(Flag_clac)
{?Flag_clac?=?0;
ClacSpeed();?//計算轉速,並將結果放入數碼管的緩沖區。
Tcounter?=?0;//周期性定時?清楚的
TH1=TL1?=?0x00//清除脈沖計數?
}
If(Flag_Err)//超範圍處理?
{
//數碼管顯示字母‘EEEE’?
Disbuf[0]?=?0x9e?//開機時初始化為0000。
Disbuf[1]?=?0x9e?
Disbuf[2]?=?0x9e
Disbuf[3]?=?0x9e
while(1)
{?display fresh();//不再測速?等待復位I
}
}
}?
}
//在數碼管上顯示壹個四位數。
作廢?顯示新鮮()
{
P2?|=?0xF0
LED_SEG0?=?0;
LED_DAT?=?table[Disbuf[0]];
延時(1);
P2?|=?0xF0
LED_SEG1?=?0;
LED_DAT?=?table[Disbuf[1]];
延時(1);
P2?|=?0xF0
LED_SEG2?=?0;
LED_DAT?=?table[Disbuf[2]];
延時(1);
P2?|=?0xF0
LED_SEG3?=?0;
LED_DAT?=?table[Disbuf[3]];
延時(1);
P2?|=?0xF0
}
//計算轉速,並將結果放入數碼管的緩沖區。
作廢?ClacSpeed()
{
uint?速度?;?
uint?PlusCounter
PlusCounter?=?TH1*256?+?TL 1;
速度?=?k *(PLUS counter/PLUS _ PER)/60;//K是校準系數。如果速度不準確,調整k的大小。
Disbuf[0]?=?(速度/1000)% 10;
Disbuf[1]?=?(速度/100)% 10;?
Disbuf[2]?=?(速度/10)% 10;
Disbuf[3]?=?速度% 10;
}
//初始化定時器T0
作廢?init_timer0()
{
TMOD?& amp=?0xf0?//計時10毫秒?/*?定時器?0?mode?1?用什麽?軟件?大門?*/
TMOD?|=?0x 01;/*?GATE0 = 0?c/T0 # = 0;?m 10 = 0;?m00 = 1;?*/
TH0?=?0xC0/*?初始化?價值觀?*/
TL0?=?0x00
ET0 = 1;?/*?啟用?定時器0?打斷?*/
EA = 1;/*?啟用?中斷?*/
TR0 = 1;?/*?定時器0?跑?*/
}
//延時功能?
作廢?延遲(uint?毫秒)
{
烏恰爾?我;
當(毫秒)
for(I = 0;我& lt100;i++);
}
//初始化定時器T1
作廢?init_timer1()
{
TMOD?& amp=?0x0F?/*?櫃臺?1?mode?1?用什麽?軟件?大門?*/
TMOD?|=?0x50/*?GATE0 = 0?c/T0 # = 1;?m 10 = 0;?m00 = 1;?*/
TH1?=?0x00/*?初始化?價值觀?*/
TL1?=?0x00
et 1 = 1;?/*?啟用?timer1?打斷?*/
EA = 1;/*?啟用?中斷?*/
tr 1 = 1;?/*?timer1?跑?*/
}