打印

S51指定时间内判断计数量量的问题

[复制链接]
1850|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liuyeah|  楼主 | 2007-1-27 22:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在做一个实验,思路是这样的:
 
    我们要判断在规定时间内的脉冲数量。用51单片机的T0和T1分别作为计数器和定时器,设定T1循环每一秒钟中断一次,这时候检查经过T1口的脉冲数量,在不同的次数段内执行不同的动作。比如在1s钟内判断脉冲是否达到100~500次,若是,则某个执行动作。
    实验中判断后的动作是拿led简单的代替的,而脉冲是用功率函数发生器的方波假设的。
    但是在实验中信号发生器不论调在那个频率上都无法激发动作。
    请问,这种方法,尤其用功率发生器这种模拟是否可行?

相关帖子

沙发
zhaoyu2005| | 2007-1-28 10:49 | 只看该作者

方法是可行的

不能按你的意愿执行是你的程序有问题或者你的触发信号有问题,你应该确认(检查)T1是否能正常计数,然后再确认触发信号是否达到触发条件(电平),本人孤陋寡闻,不知道什么是功率函数发生器,建议你用普通的信号发生器试一下

使用特权

评论回复
板凳
liuyeah|  楼主 | 2007-1-29 10:39 | 只看该作者

程序已经运行,但是还有误差

程序目前已经可以运行,可以实时根据输入脉冲频率的不同改变动作
但是试过不同频率信号,根据调改if语句中num的范围值发现动作误差总在50左右(程序中有具体说明)
程序如下
void main(void)
{
    int num;        //计数器TC0脉冲数
    int count;        //定时器TC1溢出次数
    P2=0x08;
    TMOD=0x15;        //设置TC0,TC1工作方式
    TR0=1;
    TR1=1;
    for(;;)
    {
        num=0;
       count=0;
       for(;;)
       {
            TH1=(65536-18432)/256;
            TL1=(65536-18432)%256;    //定时器TC1溢出时间,20ms(晶振频率为11.0592M)
            while(!TF1)
        {
         TH0=0xff;
             TL0=0xff;
         do{} while(!TF0);
         num++;        //每次T0脚有脉冲到,num自加
         TF0=0;
        } 
        count++;        //定时器TC1溢出次数自加    
        TF1=0;
        if(count>=50)
        break;        //若TC1溢出次数达50(表示定时器完成1s的计时),跳出
        }
 if(num>=100&&num<=300)
    P2=0x01;
 if(num>300&&num<=500)
    P2=0x08; 
 if(num>500&&num<=1000)
    P2=0x81;
 if(num>1000)
    P2=0x89;        //判断脉冲数量,作出不同动作(这里用led灯代替动作发生)
     }
}

我们以 if(num>500&&num<=1000)P2=0x81;if(num>1000)P2=0x89;这两个语句来判断误差次数,发现改变信号频率到1kHz会有误动作,执行的效果为P2=0x89;。如若将两句改为if(num>500&&num<=1050)P2=0x81;if(num>1050)P2=0x89;,则输入信号频率为1k时,动作才能按照预想的发生

使用特权

评论回复
地板
liuyeah|  楼主 | 2007-1-29 11:05 | 只看该作者

解决了,呵呵

程序中的小问题,:)
问题出在这儿
if(count>=50)
        break;
要改为
if(count>=50)break;
else num--;
因为如若没有num自减,每次循环是要多加50的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

1

粉丝