|
部分程序,完整程序請下載 /****************************** (C) COPYRIGHT 2013 **************************
* 文 件 名 : NE555頻率計(jì).C
* 版 本 : V1.0
* 日 期 : 2013/08/20
* 主 控 MCU : STC89C52
* 主 頻 : 12MHz
* 編 譯 器 : Keil C51 V4.22
* 描 述 : NE555產(chǎn)生方波,單片機(jī)采集方波頻率后,顯示在LCD1602上.
* 在本設(shè)計(jì)方案中,T0工作在定時(shí)狀態(tài)下,設(shè)定T1工作在計(jì)數(shù)狀態(tài),
T1計(jì)數(shù)
* 器對輸入信號進(jìn)行計(jì)數(shù),信號的頻率就是每秒鐘信號的脈沖個(gè)數(shù),
T0工
* 作在定時(shí)狀態(tài)下,定時(shí)時(shí)間為1秒。每定1秒鐘到,就停止T1的計(jì)數(shù),
然
* 后從T1的計(jì)數(shù)單元中讀取計(jì)數(shù)的數(shù)值,即完成了信號的頻率測量.
*********************************************************************************/
//#include"reg52.h" /* 調(diào)用頭文件,單片機(jī)內(nèi)部寄存器都定義在此,用的時(shí)候需要先調(diào)用 */
#include"LCD1602.H"
#include <NEW_8051.h>
UINT8 CounterCnt; /* 計(jì)數(shù)器次數(shù) */
UINT8 FreResultFlag; /* 頻率計(jì)計(jì)算結(jié)果標(biāo)志 */
/******************************** 引腳定義 **************************************
單片機(jī) NE555
P35 OUT
********************************************************************************/
/*******************************************************************************
* 函 數(shù) 名 : Init_Timer
* 描 述 : 初始化定時(shí)器T0,計(jì)數(shù)器T1.
* 輸 入 : 無.
* 返 回 : 無.
********************************************************************************/
void Init_Timer(void)
{
TMOD |= 0x51;
/* T0工作在定時(shí)器模式1,16位定時(shí)器,T1工作在計(jì)數(shù)器模式 */
TH0 = ( 65536 -50000 ) / 256; /* T0定時(shí)器初值,定時(shí)50ms */
TL0 = ( 65536 -50000 ) % 256;
TH1 = 0; /* T1從0開始計(jì)數(shù) */
TL1 = 0;
ET0 = 1; /* 定時(shí)器T0中斷打開 */
// ET1 = 1; /* 定時(shí)器T1中斷打開 */
EA = 1; /* 總中斷打開 */
// PT1 = 1; /* 定義T1為高優(yōu)先級 */
TR0 = 1; /* T0開關(guān)打開 */
TR1 = 1; /* T1開關(guān)打開 */
}
/*******************************************************************************
* 函 數(shù) 名 : Timer0
* 描 述 : 中斷程序,定時(shí)時(shí)間到后重新賦值開始定時(shí),同時(shí)將LED的狀態(tài)取反.
* 輸 入 : 無.
* 返 回 : 無.
********************************************************************************/
void Timer0(void) interrupt 1
{
static UINT8 Temp;
TH0 = ( 65536 -50000 ) / 256; /* 重新賦值 */
TL0 = ( 65536 -50000 ) % 256;
Temp++;
if( Temp == 20 ) /* 大概一秒計(jì)算一次 */
{
Temp = 0;
TR0 = 0; /* 關(guān)閉定時(shí)器T0,T1 */
TR1 = 0;
FreResultFlag = 1; /* 準(zhǔn)備計(jì)算頻率 */
}
}
/*******************************************************************************
* 函 數(shù) 名 : Timer1
* 描 述 : 計(jì)數(shù)器中斷程序.
* 輸 入 : 無.
* 返 回 : 無.
********************************************************************************/
void Timer1(void) interrupt 3
{
CounterCnt++; /* 計(jì)算脈沖個(gè)數(shù) */
}
/*******************************************************************************
* 函 數(shù) 名 : DisplayFre
* 描 述 : LCD1602顯示頻率.
* 輸 入 : UINT32 PulseCnt:
* 脈沖數(shù).
* 返 回 : 無.
********************************************************************************/
void DisplayFre( UINT32 PulseCnt )
{
UINT8 i;
UINT8 DisplayBuf[6];
for( i = 0; i < 5; i++ ) /* 計(jì)算1-5位的每位數(shù)據(jù) */
{
DisplayBuf[i] = PulseCnt % 10 + 0x30; /* 轉(zhuǎn)成成1602可以顯示的數(shù)值 */
PulseCnt = PulseCnt / 10;
}
DisplayBuf[5] = PulseCnt + 0x30; /* 計(jì)算第6位數(shù)據(jù) */
for( i = 5; i > 0; i-- ) /* 處理高位為0時(shí)候的情況 */
{
if( DisplayBuf[ i ] == 0x30 )DisplayBuf[ i ] = 0x20;/* 檢測到高位為 0,不顯示高位,空格代替 */
else break;
}
LCD1602_SetDisplayPosition( 7,2 ); /* 設(shè)置顯示位置 */
for( i = 5; i != 0xFF; i-- )
LCD1602_WriteData(DisplayBuf[i]); /* 顯示頻率計(jì)字符 */
}
/*******************************************************************************
* 函 數(shù) 名 : main
* 描 述 : 主程序.
* 輸 入 : 無.
* 返 回 : 無.
********************************************************************************/
void main(void)
{
UINT32 FreNum; /* 計(jì)算頻率次數(shù) */
Init_Timer(); /* 初始化定時(shí)器 */
// P27 = 1;
LCD1602_Init(); /* 初始化LCD1602 */
LCD1602_SetDisplayPosition(0,1); /* 設(shè)置第一行顯示位置 */
LCD1602_WriteString("FREQUENCY METER"); /* 設(shè)置頻率計(jì)字符 */
LCD1602_SetDisplayPosition(0,2); /* 設(shè)置第二行顯示位置 */
LCD1602_WriteString("FRE: Hz"); /* 設(shè)置FRE: HZ字符 */
while(1)
{
if( FreResultFlag ) /* 計(jì)算頻率 */
{
FreNum = ( CounterCnt * 65536 + TH1 * 256 + TL1); /* 計(jì)算1秒后的脈沖個(gè)數(shù) */
TH1 = 0; /* 清計(jì)數(shù)次數(shù) */
TL1 = 0;
FreResultFlag = 0; /* 清標(biāo)志 */
// CounterCnt = 0;
TR1 = 1;
TR0 = 1; /* 開定時(shí)器 */
}
DisplayFre( FreNum );
}
}
|
-
-
120.NE555 頻率計(jì).zip
2016-7-16 11:01 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
56.39 KB, 下載次數(shù): 18, 下載積分: 黑幣 -5
|