打印
[STC单片机]

STC8上拉电阻开了关不掉

[复制链接]
5399|44
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
P1M1 = 0x0;
P1M0 = 0x00;   //设置为准双向口
P_SW2 |=0x80;
P1PU=0xc0;//上拉4.1K电阻
temp1=50;
while(temp1--);
P1PU=0x0;//关上拉4.1K电阻
P_SW2 &=0x7f;
               
P1.6P1.7设成双向口,下拉20K电阻,没开上拉时,测电平是0。3V,开上拉后,测电平是4.7V。后面关掉上拉后,测电平还是4.7V,没有关掉。正常应试是0.3V才对的

使用特权

评论回复

相关帖子

沙发
lyjian| | 2021-11-5 23:58 | 只看该作者
这么低级的问题,先找自身原因吧,不要老怀疑芯片bug

使用特权

评论回复
评论
广东梁百万 2021-11-8 17:09 回复TA
看我16楼的测试验证,还真的有这回事! 
板凳
fpgamcudsp| | 2021-11-6 13:52 | 只看该作者
程序不完整。另,建议换芯片使用最小系统重测,排除干扰因素。

使用特权

评论回复
评论
广东梁百万 2021-11-8 17:10 回复TA
看我16楼的测试验证,还真的有这回事! 
地板
coody| | 2021-11-6 15:38 | 只看该作者
你用5.1K测试就不会这样了。
内部额外上拉电阻帮忙上拉输出高,关闭额外上拉电阻,则由弱上拉继续拉高,10K~50K是比较临街的电阻,你用5.1K或以下,弱上拉就拉不高了。或者你设置为开漏模式。

使用特权

评论回复
5
因火生烟|  楼主 | 2021-11-6 16:51 | 只看该作者
fpgamcudsp 发表于 2021-11-6 13:52
程序不完整。另,建议换芯片使用最小系统重测,排除干扰因素。

这个就是最小系统测试。没有其它程序

使用特权

评论回复
评论
广东梁百万 2021-11-7 14:56 回复TA
你这个肯定不是完整程序, 头文件呢?端口定义呢?变量声明呢?void main()呢? 
6
因火生烟|  楼主 | 2021-11-6 16:53 | 只看该作者
coody 发表于 2021-11-6 15:38
你用5.1K测试就不会这样了。
内部额外上拉电阻帮忙上拉输出高,关闭额外上拉电阻,则由弱上拉继续拉高,10K ...

如果IO口设成双向时,下拉20K,就算P1.6,P1.7输出1,但量电平还是低电平的

使用特权

评论回复
7
PPDDPPDD1234| | 2021-11-6 20:03 | 只看该作者
这个应该不可能的,仔细检查吧。
比如万用表有无问题,管脚有没有量错等。。。
建议其他的程序全部屏蔽,就设置的几句话,逐步逼近,相对好检查。。。

使用特权

评论回复
8
lyjian| | 2021-11-6 21:40 | 只看该作者

先研究搞懂IO内部结构。
20K显然没办法拉低(20K*250uA=5V)。

使用特权

评论回复
9
广东梁百万| | 2021-11-7 07:43 | 只看该作者
本帖最后由 广东梁百万 于 2021-11-7 09:00 编辑
因火生烟 发表于 2021-11-6 16:51
这个就是最小系统测试。没有其它程序


如果你这是最小系统,你这程序反复循环执行——  一下开上拉,一下关上拉,你在输出端得是脉冲,用万用表测得有电压输出是正常。
把测试程序改下,用另一个端口控制上下拉,比如用P32高电平控制上拉,低电平控制下拉

使用特权

评论回复
10
因火生烟|  楼主 | 2021-11-7 12:08 | 只看该作者
最新的程序和测试结果,得到结论是,开了上拉后,再关上拉时,读出的IO口数据都是高电平了。跟实际量的不一样。电源是5.1V

使用特权

评论回复
11
因火生烟|  楼主 | 2021-11-7 12:11 | 只看该作者
lyjian 发表于 2021-11-6 21:40
先研究搞懂IO内部结构。
20K显然没办法拉低(20K*250uA=5V)。

如果是双向口,你不开上拉,20K的下拉显然是可以拉低的。自已做实验。

使用特权

评论回复
12
因火生烟|  楼主 | 2021-11-7 12:12 | 只看该作者
PPDDPPDD1234 发表于 2021-11-6 20:03
这个应该不可能的,仔细检查吧。
比如万用表有无问题,管脚有没有量错等。。。
建议其他的程序全部屏蔽,就 ...

贴了最新程序和结果。测试结果是对的

使用特权

评论回复
13
因火生烟|  楼主 | 2021-11-7 12:15 | 只看该作者
广东梁百万 发表于 2021-11-7 07:43
如果你这是最小系统,你这程序反复循环执行——  一下开上拉,一下关上拉,你在输出端得是脉冲,用万用表 ...

把P1PU=0x80;//把P1.7开上拉,P1.6不开得到的结果也是一样的

使用特权

评论回复
14
广东梁百万| | 2021-11-7 12:27 | 只看该作者
因火生烟 发表于 2021-11-7 12:15
把P1PU=0x80;//把P1.7开上拉,P1.6不开得到的结果也是一样的

你程序有问题,即然为了测试,程序里为什么反复上拉下拉?
变量temp1是50,输出端反复上下拉的时间都小于1ms,你知道这是什么概念不?

使用特权

评论回复
15
因火生烟|  楼主 | 2021-11-8 10:18 | 只看该作者
广东梁百万 发表于 2021-11-7 12:27
你程序有问题,即然为了测试,程序里为什么反复上拉下拉?
变量temp1是50,输出端反复上下拉的时间都小于 ...

你看最后贴的程序,延时是3S了。就算是1MS也没问题。改变IO口的状态,延时个几US就行了。

使用特权

评论回复
16
广东梁百万| | 2021-11-8 17:06 | 只看该作者
本帖最后由 广东梁百万 于 2021-11-8 17:14 编辑
因火生烟 发表于 2021-11-8 10:18
你看最后贴的程序,延时是3S了。就算是1MS也没问题。改变IO口的状态,延时个几US就行了。 ...

我花了两小时用我的试验板验证过,看来这个STC8的上拉电阻在接通后真的不能完全断开。验证器材如下:TST8H8K64U,  P2.4接有按键。 P7.0接有LED灯做测试指示.。P6.7做上拉电阻测试,P6.7与GND焊接有一个20K电阻。
试验操作:  初始化时P6.7接通上拉电阻。  后面的程序——  如果按下SW1键(P2.4与GND接通), 那 P6.7的上拉电阻断开,这时测试指示灯 P70_LED亮。
如果放开SW1键,那P6.7的上拉电阻接通, 测试指示灯 P70_LED灭。

完整程序如下

        #include<stc8h.h>        
    #include  "intrins.h"

        sbit sw1 = P2^4;
        sbit sw2 = P2^5;
        sbit sw3 = P2^6;
        sbit sw4 = P2^7;
        sbit sw5 = P3^0;
        sbit sw6 = P3^1;
        sbit BUZ = P1^3;
        
    sbit LED_P70 = P7^0;
        sbit LED_P71 = P7^1;
        sbit LED_P72 = P7^2;
        sbit LED_P73 = P7^3;
        sbit LED_P74 = P7^4;
        sbit LED_P75 = P7^5;
        sbit LED_P76 = P7^6;
        sbit LED_P77 = P7^7;


        void main()
        {
        P0M0=0x00;         //-----下面是初始化
        P0M1=0x00;
        P1M0=0x00;
        P1M1=0x00;
        P2M0=0x00;
        P2M1=0x00;
        P3M0=0x00;
        P3M1=0x00;
        P4M0=0x00;
        P4M1=0x00;
        P5M0=0x00;
        P5M1=0x00;
        P6M0=0x00;
        P6M1=0x00;
        P7M0=0x00;
        P7M1=0x00;
        BUZ=0;

        P_SW2 |= 0x80;                         //D7位控制访问扩展SFR特殊寄存器


    P6PU=0x80;//接通上拉4.1K电阻

         //-----上面是初始化-----------
        
        //----------------------------------
                while (1)       //主函数
          {
         
           if(sw1==0)         //sw1键按下
           {
           P6PU=0x00;//关断上拉电阻
           LED_P70=0;   //LED灯亮
           }
                                       
           if(sw1==1)  //sw1键放开
           {
           P6PU=0x80;//接通上拉电阻
           LED_P70=1;   //LED灯灭
           }
           else;
           }
         }



试验结果1:没有按下sw1,(P6PU=0x80;  //接通上拉电阻),测得P6.7电压是4.49V.
                按下sw1键,(P6PU=0x00;  //关断上拉电阻),测得P6.7电压是3.58V.
反复断电再试也是如此。

-------------------------------------------------------


跟着我思考下,在按下SW1键时,把P6.7改成开漏输出,效果不同了。
改过的程序如下,带*****的是增加的语句

        //----------------------------------
                while (1)       //主函数
          {
         
           if(sw1==0)         //sw1键按下
           {
           P6M0=0x80;         //设置P6.7口为开漏输出    *******************************
           P6M1=0x80;    //*******************************

           P6PU=0x00;//关断上拉电阻
           LED_P70=0;   //LED灯亮
           }
                                       
           if(sw1==1)  //sw1键放开
           {
           P6M0=0x00;  //设置P6.7口为准双向口     *******************************
           P6M1=0x00;       //*******************************

           P6PU=0x80;//接通上拉电阻
           LED_P70=1;   //LED灯灭
           }
           else;
           }
         }


试验结果2:没有按下sw1,(P6PU=0x80;  //接通上拉电阻),测得P6.7电压是4.49V.
                按下sw1键,(P6PU=0x00;  //关断上拉电阻),测得P6.7电压是0V.


----------------------------------------

在初始化时没有 ( P6PU=0x80;//接通上拉4.1K电阻   )  这句,   后面程序也没有用这句,那么P6.7对地的电压是0.3V.  








使用特权

评论回复
17
PPDDPPDD1234| | 2021-11-8 22:11 | 只看该作者
因火生烟 发表于 2021-11-7 12:08
最新的程序和测试结果,得到结论是,开了上拉后,再关上拉时,读出的IO口数据都是高电平了。跟实际量的不一 ...

这个程序看着好别扭啊。
为啥要涉及P_SW2,屏蔽掉不行吗?

使用特权

评论回复
评论
广东梁百万 2021-11-8 23:14 回复TA
P_SW2的D7位是控制扩展SFR特殊寄存器的访问, 在STC的文档例程里面每读写一次扩展SFR特殊寄存器都要打开这个D7位,访问后再关闭。不知何解, 我自己写的程序只在初始化那打开,这后没关闭。 
18
lyjian| | 2021-11-8 23:39 | 只看该作者
广东梁百万 发表于 2021-11-8 17:06
我花了两小时用我的试验板验证过,看来这个STC8的上拉电阻在接通后真的不能完全断开。验证器材如下:TST8H ...

把规格书看懂了再来做实验好吗?
根据规格书给出的参数数据,准双向模式,高电平弱上拉电流输出典型值是270uA,约等效为9.6K(=(5V-2.4V)/270uA)上拉电阻,下拉20K电阻,分压约为3.4V,与你实验结果基本一致。
规格书给出的1到0转变电流是最小200uA典型270uA最大600uA。
如果按最大计算的话,至少需要3.3K(=2V/600uA)电阻才能把高电平拉下来。

使用特权

评论回复
19
广东梁百万| | 2021-11-9 08:10 | 只看该作者
lyjian 发表于 2021-11-8 23:39
把规格书看懂了再来做实验好吗?
根据规格书给出的参数数据,准双向模式,高电平弱上拉电流输出典型值是2 ...

那么:未接通那个4.1k上拉电阻时,只是设置了准双向口,用20k电阻能把电压拉低到0.3v ,什么原理?

使用特权

评论回复
20
lyjian| | 2021-11-9 10:15 | 只看该作者
本帖最后由 lyjian 于 2021-11-9 12:07 编辑
广东梁百万 发表于 2021-11-9 08:10
那么:未接通那个4.1k上拉电阻时,只是设置了准双向口,用20k电阻能把电压拉低到0.3v ,什么原理? ...

先搞懂准双向结构的工作原理。
1转0需要瞬间大电流(典型270uA),切0后关闭弱上拉(极弱上拉还开着),保持0只需微弱电流(看规格书描述5V供电典型是18uA)。

使用特权

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

本版积分规则

49

主题

167

帖子

8

粉丝