×
单片机 > 单片机程序设计 > 详情

单片机信号脉宽测量程序+Proteus仿真图

发布时间:2020-08-25 发布时间:
|

参考教材改了一下,添加了显示程序,数码管只能显示4为,理论最高可显示9999us的脉宽。有兴趣的同学可以扩展一下,添加数码管,算法可以改进,多次求平均值等等。仿真出来还算可以。测量脉宽原理很简单,教材和百度上都有。


仿真原理图如下
 

调制输入信号

2019-10-22 01:00 上传


直接上代码 上图  看一下 下面的代码  我仿真里面设置的脉冲周期是2ms 占空比是50%    由这个代码得到的高电平的时间 理论值是1000us   测得位1000us正确。

单片机源程序如下:

#include

#include                         

#define uchar unsigned char

#define uint unsigned int                

////////////////////

sbit p=P3^3; //信号输入端口


sbit w1=P2^4; //数码管的四个位

sbit w2=P2^5;

sbit w3=P2^6;

sbit w4=P2^7;                        

unsigned high;

unsigned low;

void read_count();


uchar table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};


void delay(uint ms)                //延时函数

{

        uchar x;

        for(ms;ms>0;ms--)

                for(x=10;x>0;x--);

}


void display(disnum)//显示函数

{

        w1=0;P0=table[disnum/1000];delay(10); //第1位

        P0=0x00;w1=1;delay(1);

         

        w2=0;P0=table[disnum%1000/100];delay(10);//第2位

        P0=0x00;w2=1;delay(1);


        w3=0;P0=table[disnum%100/10]; delay(10);//第3位

        P0=0x00;w3=1;delay(1);


        w4=0;P0=table[disnum%10];delay(10);//第4位

        P0=0x00;w4=1;delay(1);

}



void main()                  //主函数

{

                TMOD=0x90;

        TH1=0;

        TL1=0;

        TR1=1;        

                

        while(p==1);

          TR1=1;

                while(p==0);

                while(p==1);

                TR1=0;

                read_count();

        

        while(1)                         

        {        

                display(high*256+low);

        }

        

        

}


void read_count()

{

  do

        {

          high=TH1;

                low=TL1;

                //num=(high*256+low);

        

        }

  while(high!=TH1);


}


关键字:单片机  信号  脉宽测量  Proteus

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32单片机的复用端口初始化的步骤及方法