• STC 51单片机49——51单片机测量脉冲周期/频率并加以计算、显示


    A信号1000Hz左右,B信号1Hz左右,B信号的上升沿对齐A信号的上升沿。用两个信号发生器进行仿真。数码管左4位,为B信号高电平时,A的脉冲数;右4位为B一个周期内,A的脉冲数。

     

     

     B信号为方波(高电平和低电平等长,1Hz),A信号频率可调。仿真会有些许误差。

    完整代码:

    #include
    #include
    #define uchar unsigned char
    #define uint unsigned int
    uchar code dis_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};     //共阳数码管段码表


    void  delay(uint t)                    //延时函数
    {
        uchar i;
        while(t--) for(i=0;i<200;i++);
    }

    uint val1; //B高电平,计数值
    uint val2; //B一个周期,计数值
    uchar FlagInt0;
    uchar i,j=0x80;
    void display(void)
    {
        uint dis1, dis2;
      uchar a[8]; //数码管从左到右的每一位数值    
        dis1=val1;
        dis2=val2;
        
    //    dis1=1234;
    //    dis2=1234;
     
        a[3]=dis1%10;
        dis1=dis1/10;
        a[2]=dis1%10;
        dis1=dis1/10;
        a[1]=dis1%10;
        dis1=dis1/10;
        a[0]=dis1%10;

        a[7]=dis2%10;
        dis2=dis2/10;
        a[6]=dis2%10;
        dis2=dis2/10;
        a[5]=dis2%10;
        dis2=dis2/10;
        a[4]=dis2%10;

        
            for(i=0;i<8;i++)
            {
               j=_crol_(j,1);        //_crol_(j,1)为将对象j循环左移1位
               P0=dis_code[a[i]];        //P0口输出段码
               P2=j;                //P2口输出位控码
               delay(1);        //延时,控制每位显示的时间
                     P0=0xff; //清零。如果没有这句,仿真时,数码管数据会闪烁
            }


    }

    void  main()
    {    

        val1=0;
        val2=0;
        FlagInt0=0;
        
        TMOD=0x05; //T0为16位计数模式
        TH0=0;
        TL0=0; //计数值重置
        EX0=1; // 外中断0使能;
        IT0=1; // 外中断0下降沿触发
        IT1=1; // 外中断1下降沿触发
        EA=1; //总中断使能;
        
      while(1)
      {
        display();
       }
    }

    void int0(void) interrupt 0 //外中断0中断函数
    {
        if(FlagInt0==0){
            TH0=0;
            TL0=0; //计数值重置
            TR0=1; //启动T0计数。此时为B信号的上升沿    
            EX1=1; // 外中断1使能;
            FlagInt0=1;
        }else{
            TR0=0; //停止T0计数。B信号的第二个上升沿
            EX1=0; // 外中断1禁止;
          val2=TH0*256+TL0; //B一个周期,计数值    
          FlagInt0=0;
        }

    }
    uint temp;
    void int1(void) interrupt 2 //外中断1中断函数
    {
        if(FlagInt0==1){
            temp=TH0*256+TL0; //B高电平,计数值。此时为B信号的下降沿    
            if(temp!=0) //有时候会变成0,很奇怪
            val1=temp;
        }

    }


    完整资料打包(含仿真):

    STC51单片机49-51单片机测量脉冲周期/频率并加以计算、显示-单片机文档类资源-CSDN下载

  • 相关阅读:
    flutter显示出底部控件的引导页
    STM32寄存器总结
    Matlab:绘制日期时间
    简单个人网页设计作业 静态HTML个人主题网页作业 DW个人网站模板下载 大学生简单个人网页作品代码 个人网页制作 学生个人网页Dreamweaver设计作业
    SpringMVC 学习(五)转发,重定向和传参
    数据泄漏、删除事件频发,企业应如何构建安全防线?
    【算法1-4】递归与递推——P3612 [USACO17JAN]Secret Cow Code S
    大猩猩优化算法(Matlab代码实现)
    Linux防火墙命令
    凭此五点 这款信创传输系统解决了传输的迫切需求
  • 原文地址:https://blog.csdn.net/fengyuzhe13/article/details/128142562