打印

C51的问题,大家帮帮忙看看吧,郁闷了

[复制链接]
2354|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
popfan|  楼主 | 2010-4-27 22:07 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
用的AT89C2051 5v供电的,前端有个运放,用一个IO口做输入判断运放的输出的高低电平信号,现在测出运放输出高电平是3.8v左右,低电平是2.5v左右,问题出在低电平的时候IO口读出来的值不稳定,一会是1 一会儿是0。
    看了2051的手册IO口输入低电平应该< 0.2VCC,没搞懂了,因为这个板子是公司以前人设计的,一直用到都没问题,现在那人走了,源代码找不到了,叫我重做就不行了,我直接把以前的片子焊到新板子上工作完全没问题,1,0输出很稳定,实在是搞不懂了,难道可以通过程序搞定哇。
    请求大家帮帮忙看看,百思不得其解啊。

相关帖子

沙发
smileagain| | 2010-4-27 22:37 | 只看该作者
运放直接接I/O么?连接点有没有通过一个电容接地?或者上张原理图看看

使用特权

评论回复
板凳
linjing| | 2010-4-27 22:50 | 只看该作者
你还是贴图吧,注意2051的P1.0 P1.1 是可以做比较器的

使用特权

评论回复
地板
ayb_ice| | 2010-4-28 08:51 | 只看该作者
2.5V的话MCU读出来高或低是正常的,应该是接入内部比较器了

使用特权

评论回复
5
popfan|  楼主 | 2010-4-28 09:40 | 只看该作者
原理图如下,一共有4个这样的接口,有两个的确是接到P1.0和P1.1上面的,但是还有两个是接在P1.2和P1.3上面的,后面两个不是比较器输入,怎么搞呢?
     还有有个问题比较器怎么用啊,看了手册没说怎么用,大家再帮忙提示下吧,多谢多谢

SCANF.jpg (54.81 KB )

SCANF.jpg

使用特权

评论回复
6
ayb_ice| | 2010-4-28 10:07 | 只看该作者
要用示波器看输出波形,不能用万用表

使用特权

评论回复
7
popfan|  楼主 | 2010-4-28 10:43 | 只看该作者
我确实模电学的差,不过看已经有个运放了,在220V导通的时候输出应该到0v对不对?
但是现在是2.5V,万望大牛们指教啊! 小弟在此谢过!

使用特权

评论回复
8
popfan|  楼主 | 2010-4-28 10:54 | 只看该作者
应该也不是哦,这个事开路运放,是不是直接按电压差放大?

使用特权

评论回复
9
popfan|  楼主 | 2010-4-28 11:02 | 只看该作者
好像有点明白了,接通220V的时候,运放输出应该是个50Hz的方波,所有IO口读到的状态太会不定,这个应该只有靠程序来解决,不知大家有不有好的方法啊

使用特权

评论回复
10
ayb_ice| | 2010-4-28 11:10 | 只看该作者
这就对了,万用表量的是平均或真有效值

使用特权

评论回复
11
luffy59704331| | 2010-4-28 11:32 | 只看该作者
数脉冲有脉冲就是220接通。。。。。。。   不知道行不行

使用特权

评论回复
12
popfan|  楼主 | 2010-4-28 11:35 | 只看该作者
分析了数据已经搞定了,我想的方法比较简单,就是连续来N个高,我才判断为高,但是一旦有低我会马上判断为低

使用特权

评论回复
13
777th| | 2010-4-28 13:17 | 只看该作者
AC220V,50HZ要记住啊

使用特权

评论回复
14
wwspare| | 2010-4-28 16:12 | 只看该作者
有点像三相检测的部分电路,#define MissingCheckT_C      50    //检查一次缺相的IO消抖时间
#define MissingCheckBufT_C   20    //不是误差的时间
#define MissingKeepMaxT_C    500   //5秒为一个周期,开始查看缺相情况

        PhaseLBuf1_B=PhaseL_B;//读取IO状态
        if(PhaseLBuf2_B==PhaseLBuf1_B)//状态没有改变
        {
                if(Phase.MissingPhaseBTime<MissingCheckT_C)Phase.MissingPhaseBTime++;
                else
                {
                        Phase.PhaseBState<<=1;      //将这个循环读到的状态右移
                        if(PhaseLBuf1_B)            //保存本次的状态
                        {
                                Phase.PhaseBState|=0x01;
                        }
                        else Phase.PhaseBState&=0xfe;
                        Phase.MissingPhaseBTime=0;//重新新的计时
                }
        }
        else//状态有改变
        {
                if(Phase.MissingPhaseBTime<MissingCheckBufT_C)Phase.PhaseBState&=0xfe; //在200ms内有状态做改变,认为是正常的电网丢波,不作为缺相,清掉低位
                Phase.MissingPhaseBTime=0;
                PhaseLBuf2_B=PhaseLBuf1_B;
        }
        if(Phase.MissingKeepTime<MissingKeepMaxT_C)Phase.MissingKeepTime++;//一个周期5秒左右
        else
        {
                b=0;
                Phase.MissingKeepTime=0;
                for(i=0;i<8;i++)//查询8次读取的Io状态
                {
                        if(Phase.PhaseBState&(1<<i))b++;
                }
                if(b>6)LostPhaseB_F=1;                                        // 检测到6次以上出现高电平,则认为是缺相
                else if(b<4)LostPhaseB_F=0;
        }

使用特权

评论回复
15
wwspare| | 2010-4-28 16:12 | 只看该作者
要做适当的修改

使用特权

评论回复
16
ShakaLeo| | 2010-4-28 16:56 | 只看该作者
在运放的正输入端和地之间接一个1uF左右的电容,在220V的负半周5V通过10K电阻对电容充电,电压不会升到比负输入端电压高,运放会一直输出低电平。但这样的缺点是断开220V后运放不会立刻输出高电平,会有一点延迟。

使用特权

评论回复
17
popfan|  楼主 | 2010-4-28 17:15 | 只看该作者
太感谢各位的帮助了,我用累加检测的方法,暂时解决现在的问题了。
下一步还是按照ShakaLeo的方法,改改硬件电路,这样才是根本解决问题的方法
再次感谢各位,21IC真是个好地方啊,哈哈哈哈!

使用特权

评论回复
18
bobo1957| | 2010-4-28 21:57 | 只看该作者
50Hz2051貌似能反映吧,能够软件解决的问题就不要硬件啦,成本忒高

使用特权

评论回复
19
linjing| | 2010-4-28 22:28 | 只看该作者
你这哪是运放啊,没有反馈,就是一个简单的比较器,用来对光光耦的输出进行整形的

至于你测不出高低电平,6楼说的对,有示波器看一下就明白了,50HZ的信号万用表根本测不出来

如果你知道AC220的AC是什么意思,就好说了!

使用特权

评论回复
20
hondephy| | 2010-4-29 17:22 | 只看该作者
呵呵,来参观了一下,长了见识了

使用特权

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

本版积分规则

3

主题

9

帖子

0

粉丝