这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【原创】关于如何使用“51”采集频率数据--fromCincinnatus

共14条 1/2 1 2 跳转至

【原创】关于如何使用“51”采集频率数据--fromCincinnatus

工程师
2022-08-17 13:14:25     打赏

最近两天无意间和别人聊到蓝桥杯中,有关要测量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,从而实现通过按键按动的快慢,来控制电机转速快慢的效果。

4.png

 上图为原理图,原理主要是将通过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();//不断进行检测按键按动的频率
    }
    
}




院士
2022-08-17 16:02:35     打赏
2楼

学习并收藏了,谢谢分享。


工程师
2022-08-17 18:29:14     打赏
3楼

谢谢分享


工程师
2022-08-17 18:32:03     打赏
4楼

感谢楼主分享


工程师
2022-08-17 18:34:44     打赏
5楼

谢谢分享


工程师
2022-08-17 18:38:34     打赏
6楼

感谢楼主分享


工程师
2022-08-17 18:58:25     打赏
7楼

谢谢分享


工程师
2022-08-17 19:04:31     打赏
8楼

感谢楼主分享


高工
2022-08-17 22:54:53     打赏
9楼

感谢您的分享


专家
2022-08-18 00:08:06     打赏
10楼

感谢楼主分享


共14条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]