小弟编了一段测占空比的程序,编译没问题但是就是不好使啊,大神帮我瞧瞧哪里有毛病啊,编译没有问题,谁用过的麻烦给我发一份让我瞻仰一下、。。
void main()
{
lcd_init();
delayus(10);
TMOD=0x01;
while(1)
{ dis0();
TH0=0; //定时器高位,初值设为0
TL0=0; //定时器低位,初值设为0
num0=0; TF0=0; //定时器溢出次数,初值设为0
ET0=1; EA=1;//定时器中断
while(in); //in为脉冲的输入引脚
while(!in); //查询上升沿是否来临
TR0=1; //打开定时器
while(in); //查询下降沿是否来临
tth1=TH0;ttl1=TL0;num1=num0 ; //保存定时器值,记录高电平时间
while(!in); //查询上升沿是否来临
TR0=0; //关闭定时器
tth2=TH0;ttl2=TL0;num2=num0; //保存定时器值,记录一个周期的时间
suanfa();
dis1();
delayms(10);
}
}
void time0() interrupt 1
{
num0++;
TH0=0;
TL0=0;
TF0=0;
}
==============>下面这个是算法<======================
void suanfa()
{
tt0=num1*65536+tth1*256+ttl1;
tt1=num2*65536+tth2*256+ttl2;
t=tt0*1000/tt1;
sentmsg2[0]=t/100;
sentmsg2[1]=t%100/10;
sentmsg2[2]=t%100%10/1;
}
------解决方案--------------------
要用有捕获功能的定时器才能测得更准确,51的定时器不行,52有一个定时器是有捕获功能的
------解决方案--------------------
楼上几位对这位同学的要求颇高,建议毫无用处啊,这就好比我要拿仅有的51单片机模拟I2C接口实现读取EEPROM,结果各位大(婶)神在告诉我你直接找个带I2C接口的单片机或ARM MIPS DSP不就得了。可怜我的学生时代哪能接触那么高级的装备啊。
基于这种环境给你以下几个建议:
1.首先分析你单片机的运行性能,1个指令周期为多长,以确定你能最精确采集的方波频率,因为超过了这个最
大极限,你的采集肯定准不了。
2.你的代码中似乎还要加入计算,和显示,那么,你上面那么的while()简直就成了一个严重阻塞的低效代码
而且你下面竟然还有个10毫秒延迟的函数,这样能抓的准方波那就怪了。
优化代码吧,建议你的总while中一个其它的while都不要有了,很容易实现的,自己理一下逻辑,对于单机而言有个延时的技巧就是用一些实际有用的处理,作为延时,不要傻傻的在那干等。
------解决方案--------------------
把方波接到2个外部中断上,一个上升沿触发,一个下降沿触发。中断时打开一个计数器。
------解决方案--------------------
我几天前刚刚回答过这个问题,楼主可以参考一下:
http://topic.csdn.net/u/20110517/20/a843eb72-490f-4211-b81a-96f32daee66c.html
(1)先将该信号接到/INT0,再通过反向器,将该信号引到/INT1管脚上。必要时加个阻容滤波。
(2)设置两外中断条件为低跳变;
(3)让定时器0工作在16位定时状态下产生基准时间;
(4)在/INT0和/INT1的中断服务程序中,顺序记录下每次跳变中断发生的时间;
(5)将前后两次跳变时间相减,得到波形的宽度。
这里只共有3个中断。
如果希望增加测量精度,需要加入捕捉功能,可以设置TMOD的GATE1,2=1; 同时还要让T1也工作起来。此时,共有4个中断,物尽其用,但编码稍麻烦一点。
楼主自己采用查询电平的代码,不能发挥CPU的效率。专业人员不情愿那样做。