参考教材改了一下,添加了显示程序,数码管只能显示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);
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』