當前位置:編程學習大全網 - 編程語言 - 程序化測量

程序化測量

轉速的測量采用光電傳感器,被測電機帶動紙張旋轉。我們在紙上打了10個孔,電機每轉壹周會產生18個脈沖和12個脈沖,所以要求在數碼管上顯示轉速(rpm)。

實驗步驟如下:

#包含?& 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?跑?*/

}

  • 上一篇:面試老師壹般會問什麽問題
  • 下一篇:高溫導熱油爐的附頁 其它相關制度的建立
  • copyright 2024編程學習大全網