蓝桥杯单片机NE555中一般采用采用定时器0进行计数频率
下面是一般使用的模版,我们对其进行一定讲解
#include <STC15F2K60S2.H>
unsigned int freq;//计数频率
unsigned int time_1s;
// 计数器
void Timer0Init(void) // 0微秒@12.000MHz
{
AUXR &= 0x7F; // 定时器时钟12T模式
TMOD &= 0xF0; // 设置定时器模式
TMOD |= 0x05;
TL0 = 0x00; // 设置定时初值
TH0 = 0x00; // 设置定时初值
TF0 = 0; // 清除TF0标志
TR0 = 1; // 定时器0开始计时
}
// 定时器
void Timer1Init(void) // 1毫秒@12.000MHz
{
AUXR &= 0xBF; // 定时器时钟12T模式
TMOD &= 0x0F; // 设置定时器模式
TL1 = 0x18; // 设置定时初值
TH1 = 0xFC; // 设置定时初值
TF1 = 0; // 清除TF1标志
TR1 = 1; // 定时器1开始计时
ET1 = 1; // 允许定时器1中断
EA = 1; // 允许总中断
}
void Timer1Sever() interrupt 3
{
if (++time_1s == 1000)
{
time_1s = 0;
// 1秒定时器中断
freq = TH0 << 8 | TL0; // 读取定时器0当前值
TH0 = 0;
TL0 = 0;
}
}
void main()
{
}
根据我们对ne555使用定时器0计脉冲,故C/非T 为1 模式选择 10 模式 为16位不自动装载
故我们根据软件对上面进行修改,TMOD |= 0x05;
TL0 = 0x00; // 设置定时初值
TH0 = 0x00; // 设置定时初值
还有就是ne555所得数据我们用int型变量装载,可以直接对这个变量进行相除和取余
若使用此功能,我们需要把我们所写的按键显示模块中P3.4区域需不添加进去(例如第十届省赛题,按键显示模块使用的是bin区域)
对定时器1中进行这一块讲解
void Timer1Sever() interrupt 3
{
if (++time_1s == 1000)
{
time_1s = 0;
// 1秒定时器中断
freq = TH0 << 8 | TL0; // 读取定时器0当前值
TH0 = 0;
TL0 = 0;
}
}
freq = TH0 << 8 | TL0; // 读取定时器0当前值
-
TH0 << 8
将TH0
(高 8 位)左移 8 位,使其占据 16 位整数的高 8 位。
例如:-
如果
TH0 = 0x12
,则TH0 << 8
结果为0x1200
。
-
-
TL0
直接取TL0
(低 8 位),占据 16 位整数的低 8 位。
例如:-
如果
TL0 = 0x34
,则TL0
的值为0x34
。
-
-
按位或操作
|
将高 8 位和低 8 位合并为 16 位整数。
例如:-
0x1200 | 0x34 = 0x1234
。
-