📄 freqtest.txt
字号:
// 频率因数监测与补偿实验系统
// 电源频率的测定
#include <c8051f330.h>
#include <stdio.h>
//-----------------------------------------------------------------------------
// 定义16位寄存器
//-----------------------------------------------------------------------------
sfr16 TMR2RL = 0xca; // 定时器2数据寄存器地址
sfr16 TMR2 = 0xCC; // 定时器2计数寄存器
//-----------------------------------------------------------------------------
//常量赋值
//-----------------------------------------------------------------------------
#define SYSCLK 24500000
//------------------------------------------------------------------------------------
// 定义函数
//------------------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void Timer0_Init ();
void Timer2_Init ();
void Timer0_ISR (void);
void Timer2_ISR (void);
//-----------------------------------------------------------------------------
// 定义全局变量
//-----------------------------------------------------------------------------
int k=0;
float fre=0;
//------------------------------------------------------------------------------------
// 主函数
//------------------------------------------------------------------------------------
void main (void)
{
PCA0MD &= ~0x40; // 关闭看门狗
SYSCLK_Init (); // 系统时钟初始化
PORT_Init (); // I/O口初始化
Timer0_Init (); // 定时器0对计数脉冲进行计数
Timer2_Init (); // 定时器2计时1s
TR0 = 1;
EA=1;
while(1)
{
if(k==600)
{
TR0 = 0; // 计时达1s,计数器停止计时
fre = TH0*256+TL0; // 计数值即为频率
}
}
}
//------------------------------------------------------------------------------------
// 端口初始化
//------------------------------------------------------------------------------------
//P0.1 为电源电压输入
void PORT_Init (void)
{
P0MDIN = 0xff; // P0 为数字输入
P0MDOUT = 0x00; // P0 漏极开路
P0SKIP = 0x02; // P0.1 需要被交叉开关跳过
XBR1 = 0x50; // T0接到端口引脚 P0.1
}
//-----------------------------------------------------------------------------
// 系统时钟初始化
//-----------------------------------------------------------------------------
void SYSCLK_Init (void)
{
OSCICN |= 0x83; // SYSCLK为24.5MHz
RSTSRC = 0x04;
}
//-----------------------------------------------------------------------------
// 定时器0初始化
//-----------------------------------------------------------------------------
void Timer0_Init ()
{
TMOD = 0x05; // 对 计数脉冲0 计数
TH0 = 0x00;
TL0 = 0x00;
ET0= 1;
//TR0=1;
}
//-----------------------------------------------------------------------------
// 定时器2初始化
//-----------------------------------------------------------------------------
void Timer2_Init ()
{
unsigned int counts;
TMR2CN = 0x00; // TR2 关闭 定时器2外部时钟为系统时钟/12
CKCON |= 0x10; // 高字节使用系统时钟/12 , 低字节使用系统时钟
counts = 40833; // 每次计时 20 ms
TMR2RL = -counts;
TMR2 = TMR2RL;
ET2= 1; // 中断允许
TR2=1;
}
//-----------------------------------------------------------------------------
// 定时器2中断
//-----------------------------------------------------------------------------
void Timer2_ISR (void) interrupt 5
{
TMR2CN &= ~0x80; // 定时器2高字节溢出位置 0
k = k+1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -