最近两天无意间和别人聊到蓝桥杯中,有关要测量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();//不断进行检测按键按动的频率 } }