因火生烟 发表于 2021-11-5 17:48

STC8上拉电阻开了关不掉

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

fpgamcudsp 发表于 2021-11-6 13:52

程序不完整。另,建议换芯片使用最小系统重测,排除干扰因素。

coody 发表于 2021-11-6 15:38

你用5.1K测试就不会这样了。
内部额外上拉电阻帮忙上拉输出高,关闭额外上拉电阻,则由弱上拉继续拉高,10K~50K是比较临街的电阻,你用5.1K或以下,弱上拉就拉不高了。或者你设置为开漏模式。

因火生烟 发表于 2021-11-6 16:51

fpgamcudsp 发表于 2021-11-6 13:52
程序不完整。另,建议换芯片使用最小系统重测,排除干扰因素。

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

因火生烟 发表于 2021-11-6 16:53

coody 发表于 2021-11-6 15:38
你用5.1K测试就不会这样了。
内部额外上拉电阻帮忙上拉输出高,关闭额外上拉电阻,则由弱上拉继续拉高,10K ...

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

PPDDPPDD1234 发表于 2021-11-6 20:03

这个应该不可能的,仔细检查吧。
比如万用表有无问题,管脚有没有量错等。。。
建议其他的程序全部屏蔽,就设置的几句话,逐步逼近,相对好检查。。。

lyjian 发表于 2021-11-6 21:40


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

广东梁百万 发表于 2021-11-7 07:43

本帖最后由 广东梁百万 于 2021-11-7 09:00 编辑

因火生烟 发表于 2021-11-6 16:51
这个就是最小系统测试。没有其它程序

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

因火生烟 发表于 2021-11-7 12:08

最新的程序和测试结果,得到结论是,开了上拉后,再关上拉时,读出的IO口数据都是高电平了。跟实际量的不一样。电源是5.1V

因火生烟 发表于 2021-11-7 12:11

lyjian 发表于 2021-11-6 21:40
先研究搞懂IO内部结构。
20K显然没办法拉低(20K*250uA=5V)。
如果是双向口,你不开上拉,20K的下拉显然是可以拉低的。自已做实验。

因火生烟 发表于 2021-11-7 12:12

PPDDPPDD1234 发表于 2021-11-6 20:03
这个应该不可能的,仔细检查吧。
比如万用表有无问题,管脚有没有量错等。。。
建议其他的程序全部屏蔽,就 ...

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

因火生烟 发表于 2021-11-7 12:15

广东梁百万 发表于 2021-11-7 07:43
如果你这是最小系统,你这程序反复循环执行——一下开上拉,一下关上拉,你在输出端得是脉冲,用万用表 ...

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

广东梁百万 发表于 2021-11-7 12:27

因火生烟 发表于 2021-11-7 12:15
把P1PU=0x80;//把P1.7开上拉,P1.6不开得到的结果也是一样的

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

因火生烟 发表于 2021-11-8 10:18

广东梁百万 发表于 2021-11-7 12:27
你程序有问题,即然为了测试,程序里为什么反复上拉下拉?
变量temp1是50,输出端反复上下拉的时间都小于 ...

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

广东梁百万 发表于 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.








PPDDPPDD1234 发表于 2021-11-8 22:11

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

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

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)电阻才能把高电平拉下来。

广东梁百万 发表于 2021-11-9 08:10

lyjian 发表于 2021-11-8 23:39
把规格书看懂了再来做实验好吗?
根据规格书给出的参数数据,准双向模式,高电平弱上拉电流输出典型值是2 ...

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

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)。
页: [1] 2
查看完整版本: STC8上拉电阻开了关不掉