51单片机测脉宽
时间:10-02
整理:3721RD
点击:
最近做了一个51单片机测试脉宽的例子,但是发现只能测试f=20以上的脉宽,而f=0.1-10发现测试不了,求帮助。

#include<reg51.h>
sbit in=P3^2;
sbit RS=P2^6;
sbit RW=P2^5;
sbit E=P2^7;
char x[6];
int js,cc=0;
void delay(int);
void zh();
void display();
void init();
void wr_inst(char);
void wr_char(char);
void main()
{
TMOD=0x09;
TH0=0;
TL0=0;
EA=1;
TR0=0;
while(in);
while(in==0);
TR0=1;
while(in);
TR0=0;
js=cc*65536+TH0*256+TL0;
P1=cc;
zh();
display();
}
void time0() interrupt 1
{
cc++;
}
void zh()
{ x[0]=js/100000+0x30;
x[1]=js%100000/10000+0x30;
x[2]=js%100000%10000/1000+0x30;
x[3]=js%100000%10000%1000/100+0x30;
x[4]=js%100000%10000%1000%100/10+0x30;
x[5]=js%10+0x30;
}
void display()
{ char k;
init();
wr_inst(0x80);
for(k=0;k<6;k++)
{ wr_char(x[k]);}
}
void init()
{ wr_inst(0x30);
wr_inst(0x30);
wr_inst(0x30);
wr_inst(0x38);
wr_inst(0x08);
wr_inst(0x01);
wr_inst(0x06);
wr_inst(0x0c);
}
void wr_inst(char inst)
{ P0=inst;
RS=0;RW=0;E=1;delay(2);E=0;
}
void wr_char(char chardata)
{ P0=chardata;
RS=1;RW=0;E=1;delay(2);E=0;
}
void delay(int x)
{int i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}

#include<reg51.h>
sbit in=P3^2;
sbit RS=P2^6;
sbit RW=P2^5;
sbit E=P2^7;
char x[6];
int js,cc=0;
void delay(int);
void zh();
void display();
void init();
void wr_inst(char);
void wr_char(char);
void main()
{
TMOD=0x09;
TH0=0;
TL0=0;
EA=1;
TR0=0;
while(in);
while(in==0);
TR0=1;
while(in);
TR0=0;
js=cc*65536+TH0*256+TL0;
P1=cc;
zh();
display();
}
void time0() interrupt 1
{
cc++;
}
void zh()
{ x[0]=js/100000+0x30;
x[1]=js%100000/10000+0x30;
x[2]=js%100000%10000/1000+0x30;
x[3]=js%100000%10000%1000/100+0x30;
x[4]=js%100000%10000%1000%100/10+0x30;
x[5]=js%10+0x30;
}
void display()
{ char k;
init();
wr_inst(0x80);
for(k=0;k<6;k++)
{ wr_char(x[k]);}
}
void init()
{ wr_inst(0x30);
wr_inst(0x30);
wr_inst(0x30);
wr_inst(0x38);
wr_inst(0x08);
wr_inst(0x01);
wr_inst(0x06);
wr_inst(0x0c);
}
void wr_inst(char inst)
{ P0=inst;
RS=0;RW=0;E=1;delay(2);E=0;
}
void wr_char(char chardata)
{ P0=chardata;
RS=1;RW=0;E=1;delay(2);E=0;
}
void delay(int x)
{int i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
正确

用中断触发,然后开计数器 可以精确到几us级别
