找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8222|回复: 7
打印 上一主题 下一主题
收起左侧

帮忙看看这个波形(过零检测)

[复制链接]
跳转到指定楼层
楼主
先贴程序:
#include <reg52.h>
sbit singal=P1^0;   //信号输出端,就是图中蓝色波形
bit flag;
void delayms(unsigned int x)
{
        unsigned int i,j;
        for(i=x;i>0;i--)
        {
                for(j=110;j>0;j--);
        }
}

void main()
{
        EA=1;
        EX0=1;
        IT0=1;   //外部中断下降沿触发

        singal=1;
        while(1)
        {
                if(flag==1)
                {
                        singal=0;    //产生外部中断后,把信号拉低
                        delayms(1);  //延时一会
                        singal=1;  //再拉高
                        flag=0;  //置零等待下一次中断
                }
        }
}

void ex0()interrupt 0
{
        flag=1;
}


图中,黄色波形是过零检测电路,低电平位置就是零点。
蓝色波形是信号输出,目的就是想检测到过零后把信号拉低,延时一会再拉高然后等待下一次过零。
可是实际效果却有的波形正确有的波形不争取,不正确的波形原因貌似比较简单,应该就是过零信号的上升沿也被认为是下降沿,
结果又执行了一次中断。
请问这是程序写得不好吗?有什么解决方法。

IMG_20150518_195925.jpg (547.07 KB, 下载次数: 156)

IMG_20150518_195925.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:80474 发表于 2015-5-19 14:01 | 只看该作者
if(flag==1) 这里加一个限制条件,即自定义一个时间,时间不到不执行里面的语句,这样就只能执行一次

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:81546 发表于 2015-5-30 10:36 | 只看该作者
  if(flag==1)
                 {
                         singal=0;    //产生外部中断后,把信号拉低
                        delayms(1);  //延时一会
                        singal=1;  //再拉高
                        flag=0;  //置零等待下一次中断
                }
这程序中可能有问题:如果在执行delayms(1)时,又发生了中断,输出波形就出错了。所以延时时间要尽可能短。  

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:81546 发表于 2015-5-30 10:41 | 只看该作者
我前面说的不完全。你的这个波形处理,可以把:
                        singal=0;    //产生外部中断后,把信号拉低
                        delayms(1);  //延时一会
                        singal=1;  //再拉高
放在中断函数中去处理,并适当增长延时时间,漏过过零信号中的干扰。

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:69679 发表于 2015-5-30 12:26 | 只看该作者
我的问题还没有解决,可就是程序而言,我建议还是像我给你回复的程序那样,用中断写比较好些,相互学习

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:242487 发表于 2017-10-24 17:04 | 只看该作者
delayms(1); 延时函数最好用定时器做
回复

使用道具 举报

7#
ID:242534 发表于 2017-10-24 19:14 | 只看该作者
delayms(1); 延时函数最好用定时器做
回复

使用道具 举报

8#
ID:374869 发表于 2018-11-19 09:27 | 只看该作者
楼主,我也遇到同样问题,程序跟你写差不多,最后咋解决了?

IMG_3771.JPG (1.29 MB, 下载次数: 69)

IMG_3771.JPG
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表