一、定时器选择与原理
频率测量本质是对脉冲上升沿计数,1s 内上升沿个数即为频率。通过查看原理图,使用跳线帽连接 NET_SIG(NE555 输出引脚)和 SIG_OUT(对应板子丝印 P34 ),这样NE555的输出就和P34引脚连接在一起。而定时器0在计数模式时,就是通过检测P34引脚的高低电平变化来对NE555输出脉冲进行计数。
根据手册可知,定时器 0 计数对应 P34 引脚,定时器 1 计数对应 P35 引脚。所以在频率测量中,不能使用定时器 1,而选择定时器 0 。测量原理是每 1s 获取一次计数结果并存入变量,由于最大值可能超过 256 (28 ),所以采用 16 位计数(216=65535 )。同时,需将定时器 0 的 C/T(计数 / 定时模式选择位)拉高,使其作为计数器工作,通过设置TMOD |= 0x05修改定时器 0 相关数据,且不影响定时器 1 功能。
二、定时器初始化
-
定时器 0 初始化:
void Timer0_Init(void) //1毫秒@12.000MHz{AUXR &= 0x7F; //定时器时钟12T模式TMOD &= 0xF0; //设置定时器模式TMOD |= 0x05; //定时器计数,16位不自动重载TL0 = 0x00; //设置定时初始值TH0 = 0x00; //设置定时初始值TF0 = 0; //清除TF0标志TR0 = 1; //定时器0开始计时} -
定时器 1 初始化:为取出计数结果,使用定时器 1 开启 1ms 定时,在中断中定时 1s 取数据。相关代码如下:
unsigned int time_all_1s;void Timer1_Init(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 Timer1_Isr(void) interrupt 3{if(++time_all_1s>=1000){TR0 = 0;time_all_1s=0;Freq = TH0 << 8 | TL0; // 获取定时器0计数值,TH0左移8位与TL0组合TH0 = TL0 = 0; // 计数值清零,为下次获取做准备TR0 = 1;}}
三、主函数及初始化顺序
在main函数中,需遵循先初始化定时器 0,再初始化定时器 1 的顺序,否则第一次测量频率会出错。代码如下:
void main(){ Timer0_Init(); Timer1_Init(); while(1) { // 主循环可添加其他处理逻辑 }}四、NE555 易错解析
-
第一次测量结果误差:第一次测量数据在 4T 上测可能导致值不对,解决方法是定义
bit show_flag_first=0;,在 1s 获取完值后将其置为 1,当show_flag_first为 1 时才进行数码管显示。相关代码如下:bit show_flag_first=0;void Seg_Proc(){if(show_flag_first){//进行频率显示}}void Timer1_Isr(void) interrupt 3{if(++time_all_1s==1000){show_flag_first=1;time_all_1s=0;Freq = TH0 << 8 | TL0;TH0 = TL0 = 0;}} -
接线问题:必须用跳线帽接上 P34 和 SIGNAL 线,否则无法测量。
-
按键问题:由于按键最后一列会用到 P34,需屏蔽相关按键功能,避免对 P34 上升下降测量产生误差影响评分。
-
注意事项
-
在1ms定时器1的中断函数中,当达到1s后计算频率脉冲次数时,要记得将计时time_all_1s置零,还要将TH0,TL0计数值清零!!!
-
unsigned int time_all_1s;!!!!!!!!! 记住是unsigned int类型!!!!!!!!!!!!
unsigned int Freq; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
部分信息可能已经过时














