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才对的 这么低级的问题,先找自身原因吧,不要老怀疑芯片bug 程序不完整。另,建议换芯片使用最小系统重测,排除干扰因素。
你用5.1K测试就不会这样了。
内部额外上拉电阻帮忙上拉输出高,关闭额外上拉电阻,则由弱上拉继续拉高,10K~50K是比较临街的电阻,你用5.1K或以下,弱上拉就拉不高了。或者你设置为开漏模式。 fpgamcudsp 发表于 2021-11-6 13:52
程序不完整。另,建议换芯片使用最小系统重测,排除干扰因素。
这个就是最小系统测试。没有其它程序 coody 发表于 2021-11-6 15:38
你用5.1K测试就不会这样了。
内部额外上拉电阻帮忙上拉输出高,关闭额外上拉电阻,则由弱上拉继续拉高,10K ...
如果IO口设成双向时,下拉20K,就算P1.6,P1.7输出1,但量电平还是低电平的 这个应该不可能的,仔细检查吧。
比如万用表有无问题,管脚有没有量错等。。。
建议其他的程序全部屏蔽,就设置的几句话,逐步逼近,相对好检查。。。
先研究搞懂IO内部结构。
20K显然没办法拉低(20K*250uA=5V)。
本帖最后由 广东梁百万 于 2021-11-7 09:00 编辑
因火生烟 发表于 2021-11-6 16:51
这个就是最小系统测试。没有其它程序
如果你这是最小系统,你这程序反复循环执行——一下开上拉,一下关上拉,你在输出端得是脉冲,用万用表测得有电压输出是正常。
把测试程序改下,用另一个端口控制上下拉,比如用P32高电平控制上拉,低电平控制下拉
最新的程序和测试结果,得到结论是,开了上拉后,再关上拉时,读出的IO口数据都是高电平了。跟实际量的不一样。电源是5.1V
lyjian 发表于 2021-11-6 21:40
先研究搞懂IO内部结构。
20K显然没办法拉低(20K*250uA=5V)。
如果是双向口,你不开上拉,20K的下拉显然是可以拉低的。自已做实验。 PPDDPPDD1234 发表于 2021-11-6 20:03
这个应该不可能的,仔细检查吧。
比如万用表有无问题,管脚有没有量错等。。。
建议其他的程序全部屏蔽,就 ...
贴了最新程序和结果。测试结果是对的 广东梁百万 发表于 2021-11-7 07:43
如果你这是最小系统,你这程序反复循环执行——一下开上拉,一下关上拉,你在输出端得是脉冲,用万用表 ...
把P1PU=0x80;//把P1.7开上拉,P1.6不开得到的结果也是一样的 因火生烟 发表于 2021-11-7 12:15
把P1PU=0x80;//把P1.7开上拉,P1.6不开得到的结果也是一样的
你程序有问题,即然为了测试,程序里为什么反复上拉下拉?
变量temp1是50,输出端反复上下拉的时间都小于1ms,你知道这是什么概念不? 广东梁百万 发表于 2021-11-7 12:27
你程序有问题,即然为了测试,程序里为什么反复上拉下拉?
变量temp1是50,输出端反复上下拉的时间都小于 ...
你看最后贴的程序,延时是3S了。就算是1MS也没问题。改变IO口的状态,延时个几US就行了。 本帖最后由 广东梁百万 于 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.
因火生烟 发表于 2021-11-7 12:08
最新的程序和测试结果,得到结论是,开了上拉后,再关上拉时,读出的IO口数据都是高电平了。跟实际量的不一 ...
这个程序看着好别扭啊。
为啥要涉及P_SW2,屏蔽掉不行吗? 广东梁百万 发表于 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)电阻才能把高电平拉下来。
lyjian 发表于 2021-11-8 23:39
把规格书看懂了再来做实验好吗?
根据规格书给出的参数数据,准双向模式,高电平弱上拉电流输出典型值是2 ...
那么:未接通那个4.1k上拉电阻时,只是设置了准双向口,用20k电阻能把电压拉低到0.3v ,什么原理? 本帖最后由 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