最近两天无意间和别人聊到蓝桥杯中,有关要测量NE555产生的频率的题目。使我突然想到以前写过的一个通过51采集外部手动开关的开合频率,来控制电机转速快慢的一个小工程。正好可以作为51如何测量外部频率的例子。
测量外部频率,需要将两个定时器分别配置成定时器和计数器的工作状态。在定时1秒后进入中断,并读取计数器的数值,即可得出上一秒中的频率。代码如下图(只包括测量部分)
该例子为测量NE555产生的pwm波的频率
#include "reg52.h"
typedef unsigned int u16; //对数据类型进行声明
typedef unsigned char u8;
#define GPIO_DIG P0
unsigned long f; //测量到的频率
unsigned long Count; //用于计算1S钟的
void delay(u16 i)
{
while(i--);
}
void InitTimer()
{
TMOD=0x51;//配置定时器T0,T1分别为定时器和计数器,晶振为12MHZ
TH0=0x3C;
TL0=0xB0;
ET0=1;
ET1=1;
EA=1;
TR0=1;
TR1=1;
}
void Timer0() interrupt 1//定时50ms
{
TH0=0x3C;
TL0=0xB0;
Count++;
if(Count==20)//当中断达到20次则为1秒
{
TR0=0;
TR1=0;
Count=0;
}
}
void Timer1() interrupt 3
{
f=f+65536;//计数器中断则表明计数器已满,达到65536次
}
void main()
{
InitTimer();
while(1)
{
if(TR1 == 0)//当计时满1秒
{
f = f + TL1; //分别读取计数器的高八位与低八位数据
f = f + (TH1 * 256); //此时f即为上一秒钟的频率值
f = 0;//复位
TH1 = 0;
TL1 = 0;
TR0 = 1;
TR1 = 1;
}
}
}下图为原理图,原理主要是将通过io口采集到的按键频率,通过处理转化成驱动L298N模块的pwm,从而实现通过按键按动的快慢,来控制电机转速快慢的效果。

上图为原理图,原理主要是将通过io口采集到的按键频率,通过处理转化成驱动L298N模块的pwm,从而实现通过按键按动的快慢,来控制电机转速快慢的效果。
下面为实现通过效果的代码:
#include"reg52.h"
typedef unsigned char u8;//对数据类型进行声明
typedef unsigned int u16;
sbit IN1 = P2^0;//配置驱动L298N的IO口
sbit IN2 = P2^1;//
sbit IN3 = P2^2;//
sbit IN4 = P2^3;//
sbit Key = P0^0;//按键输入的IO口
u16 time;
u16 count = 30;
u16 count_1 = 0;//传递数值的变量
u16 count_2 = 0;
u16 count_3 = 0;
void InitTimer0()
{
TMOD = 0x01;//设定定时器T1,T0为定时器和计数器
TH0 = (65536 - 10)/256;
TL0 = (65536 - 10)%256;
TR0 = 1;
EA = 1;
ET0 = 1;
}
void Delay(u16 t)
{
while(t--);//延时函数
}
void add_speed()
{
if (Key == 0)
{
Delay(10);//按键消抖
if (Key == 0)
{
count_1 += 15;//每当按下一次,count_1增加15
}
while(!Key);
}
}
void T0_inter() interrupt 1
{
TR0 = 0;
TH0 = (65536 - 10)/256;
TL0 = (65536 - 10)%256;
TR0 = 1;
IN1 = 0;
IN3 = 0;
time ++ ;
if (time < count)
{
IN1 = 1;//当IN1和IN3为高电平时,驱动工作。
IN3 = 1;
}
else
{
IN1 = 0;
IN3 = 0;
}
if (time >= 100)
{
time = 0;
count_2 += 1;
if (count_2 == 50)
{
count = count_1 + 50;//控制减小程度数值越大,达到同等速度时的按键频率越高
count_2 = 0;//传递数值的变量复位
count_1 = 0;
}
}
}
int main (void)
{
InitTimer0();
IN2 = 0;//将IN2和IN4配置为低电平
IN4 = 0;
while (1)
{
add_speed();//不断进行检测按键按动的频率
}
}
我要赚赏金
