📄 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 + -