?? frequencytest33x.c
字號:
//
// 文件名:FrequencyTest.c
//
// 編寫人:寧太陽
//
// 編寫時間:2005/1/5
//
// 目標器件: C8051F33x
//
// 編譯工具: Silicon Laboratories IDE
//-----------------------------------------------------------------------------
// 程序描述:
// 這是一個頻率測試程序,被測頻率從P0.1輸入,P0.0輸出系統時鐘。頻率測試時需要占用一個中斷和一個
//定時器,下面是在實驗中測得的一組數據,供參考。測得的結果可以在名為frequencydata的數組中觀察到。
//-----------------------------------------------------------------------------
// 被測頻率實際值(用示波器觀察得到) 測得值(此程序測得)
//
// | 426Hz 426Hz |
// | 646Hz 646Hz |
// | 853Hz 853Hz |
// | 1k 1k |
// | 2.25k 2.236k|
// | 3.91k 3.825k|
// | 4.4k 4.34k |
// | 6.2k 5.91k |
// | 10.1k 9.33k |
// | |
//-----------------------------------------------------------------------------
// 頭文件包含
//-----------------------------------------------------------------------------
#include <c8051f330.h>
//-----------------------------------------------------------------------------
// 特殊功能寄存器
//-----------------------------------------------------------------------------
sfr INT01CF = 0xe4;
sfr16 TMR2RL = 0xca;
sfr16 TMR2 = 0xcc;
//-----------------------------------------------------------------------------
// 常量定義
//-----------------------------------------------------------------------------
#define SYSCLK 24500000 // 系統工作頻率
//-----------------------------------------------------------------------------
//位定義
//-----------------------------------------------------------------------------
sbit LED = P1^3; // LED所接的引腳
unsigned char i;
unsigned int xdata frequencydata[100]; //此數組用于存放最后測得結果
unsigned int fmd; //計算時的數據暫存字節
unsigned int pdata *point; //數組frequencydata的指針
//-----------------------------------------------------------------------------
// 函數定義
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void Timer2_Init (void);
void INT_Init (void);
//-----------------------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------------------
void main (void) {
unsigned char j;
PCA0MD &= ~0x40; // 禁止看門狗定時器
SYSCLK_Init (); // 系統時鐘初始化
PORT_Init (); // 交叉開關和通用I/O口初始化
Timer2_Init (); // 定時器2初始化
INT_Init ();
EA = 1; // 總中斷使能
point =&frequencydata;
for(j=0;j<=100;j++) //測試結果存放位置清0
{
*point=0x00;
point++;
}
point =&frequencydata; //重新給指針賦初值
while (1)
{
if(i==2)
{
EA=0; //關中斷
i=0;
TR2=0;
fmd=TMR2; //讀取定時器2的值
TMR2=0x00; //清定時器2數據寄存器
fmd=(fmd*0.04)+10; //0.04=1/24.5M,10為中斷時所需的系統時鐘周期
fmd=1000000/fmd;
*point=fmd-8; //這里以1K為基準,8為修正值l
point++;
EA=1;
}
}
}
//-----------------------------------------------------------------------------
// 系統時鐘初始化
//-----------------------------------------------------------------------------
//
void SYSCLK_Init (void)
{
OSCICN = 0x83; // 系統時鐘初始化為片內的 24.5MHz
RSTSRC = 0x04; // 使能時鐘丟失檢測器
}
//-----------------------------------------------------------------------------
// 通用I/O初始化
//-----------------------------------------------------------------------------
//
void PORT_Init (void)
{
XBR0 = 0x08; // 系統時鐘輸出
XBR1 = 0x40; // 使能交叉開關和弱上拉
P0MDOUT |= 0x01; // P0.0設為推挽方式
P1MDOUT |= 0x08; // P1.3設為推挽方式
}
//-----------------------------------------------------------------------------
// 定時器2初始化
//-----------------------------------------------------------------------------
void Timer2_Init ()
{
TMR2CN = 0x00; // 16位自動重裝入,禁止定時器2; 并清TF2標志位;
CKCON = 0x10; //使用系統時鐘作為定時器2的時鐘源
TMR2 = 0x0000;
ET2 = 1; //使能定時器2中斷
}
//-----------------------------------------------------------------------------
// 中斷0初始化
//-----------------------------------------------------------------------------
//
void INT_Init (void)
{
EX0=1;
INT01CF=0x01; //中斷0引腳分配在P0.1
TCON =0x01; //下降沿產生中斷
}
//-----------------------------------------------------------------------------
// 中斷0子程序
//-----------------------------------------------------------------------------
//
void INT0_ISR (void) interrupt 0
{
TR2= 1; // 檢測到第一次中斷時啟動定時器2
i++;
if(i==2)
{
TR2=0; //檢測到第二次中斷時定時器2停止計數
LED=!LED;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -