标题: 请问STC12单片机有外部上拉电阻怎样设置输入? [打印本页]

作者: goldbirderman    时间: 2022-4-23 09:51
标题: 请问STC12单片机有外部上拉电阻怎样设置输入?
    外面接了上拉电阻,里面怎样设置输入呢?输入信号,高电平为3.2V,低电平为2.1V,请问怎样判断啊?请问怎样解决,感激不尽,最好发个例子给我参考一下,谢谢!

作者: goldbirderman    时间: 2022-4-23 10:30
没人知道吗?各位兄弟
作者: 飞云居士    时间: 2022-4-23 15:14
数字电路2.1V,认为是高电平。如果非要识别2.1V,用ADC转换识别
作者: goldbirderman    时间: 2022-4-23 15:18
飞云居士 发表于 2022-4-23 15:14
数字电路2.1V,认为是高电平。如果非要识别2.1V,用ADC转换识别

我的那块电路没有AD转换,也添加不了上去
作者: goldbirderman    时间: 2022-4-23 15:18
飞云居士 发表于 2022-4-23 15:14
数字电路2.1V,认为是高电平。如果非要识别2.1V,用ADC转换识别

还有没有其他办法?
作者: wulin    时间: 2022-4-23 16:03

不论端口模式怎样设置,IO口对高低电平的识别阈值不会改变。只能通过外部电路把高电平为3.2V,低电平为2.1V的信号变换为高电平>2.0V,低电平<0.8V。比较简单的方法是加一个翻转阈值为2.6V的比较器。

作者: goldbirderman    时间: 2022-4-23 17:06
wulin 发表于 2022-4-23 16:03
不论端口模式怎样设置,IO口对高低电平的识别阈值不会改变。只能通过外部电路把高电平为3.2V,低电平为2. ...

可是我的电路里面根本没有比较器?
作者: goldbirderman    时间: 2022-4-23 17:06
wulin 发表于 2022-4-23 16:03
不论端口模式怎样设置,IO口对高低电平的识别阈值不会改变。只能通过外部电路把高电平为3.2V,低电平为2. ...

怎样读取端口状态的?

作者: gongnn    时间: 2022-4-23 17:22
把端口设置为高阻状态再读取。
作者: 188610329    时间: 2022-4-23 17:26
按你的需求, 如果不愿意更换单片机,比较简单的方法就是增加一个电压比较器,
实在不愿意用比较器,就通过IO模式高阻+下拉电阻+二极管的方式,人为的吧 3.2V~2.1V 电压变化分跨 识别出 0/1 的伐值两端来进行判断。但是需要试验调整,比较麻烦。
作者: goldbirderman    时间: 2022-4-23 17:31
gongnn 发表于 2022-4-23 17:22
把端口设置为高阻状态再读取。

麻烦可以举个例子吗?
作者: Geeee    时间: 2022-4-23 17:32
不管端口模式怎样设置,IO口对高低电平的识别阈值不会改变。只能通过外部电路把高电平为3.2V,低电平为2.1V的信号变换为高电平>2.0V,低电平<0.8V。比较简单的方法是加一个翻转阈值为2.6V的比较器。
作者: goldbirderman    时间: 2022-4-23 17:35
188610329 发表于 2022-4-23 17:26
按你的需求, 如果不愿意更换单片机,比较简单的方法就是增加一个电压比较器,
实在不愿意用比较器,就通过 ...

利用高阻模式,怎样吧两个电压值保存,然后读取状态比较大小?
作者: 人工置顶员    时间: 2022-4-23 21:34
顶一下
作者: goldbirderman    时间: 2022-4-23 22:08
188610329 发表于 2022-4-23 17:26
按你的需求, 如果不愿意更换单片机,比较简单的方法就是增加一个电压比较器,
实在不愿意用比较器,就通过 ...

高阻输入我设置好了,请问下一步怎样做?
作者: 188610329    时间: 2022-4-24 00:35
goldbirderman 发表于 2022-4-23 17:35
利用高阻模式,怎样吧两个电压值保存,然后读取状态比较大小?

不是比较大小, 是读取端口的 0/1,  通过 二级管 配合下拉电阻, 拉低信号的电平。让你信号输出 2.1V的时候,单片机能读到0,信号输出3.2V的时候,能读到1, STC12有段时间没有用了,我印象当中STC12 应该在斯密特发生器的伐值0.7V~1.6V这个范围,应该接一个二级管即可, 基于斯密特发生器的特性,可能需要IO设置为开漏模式,读IO之前,需要先给个低电平让斯密特发生器判别为0,再置1读IO,此时你的信号如果输出的2.1V通过二级管压降到1.4V 没有满足斯密特发生器的 1.6V,则读到还是0,反之则会读到1。
如果,折腾不好这个伐值,只能用 0.1uf 电容,通过IO放电,再开定时器,再IO置1充电,等到度到高电平了,判断定时器的时间长短,来区分你的信号是 3.2V, 还是2.1V.
类似的这些方法有很多,但是,这些都需要你试验去调整的,你如果这方面知识,一片空白的话,建议你还是用比较器。
作者: goldbirderman    时间: 2022-4-24 10:11
188610329 发表于 2022-4-24 00:35
不是比较大小, 是读取端口的 0/1,  通过 二级管 配合下拉电阻, 拉低信号的电平。让你信号输出 2.1V的时 ...

你所说二极管是内置在芯片里面吗?你又说开漏模式,那应该是开漏模式还是高阻模式呢?
作者: goldbirderman    时间: 2022-4-24 10:13
188610329 发表于 2022-4-24 00:35
不是比较大小, 是读取端口的 0/1,  通过 二级管 配合下拉电阻, 拉低信号的电平。让你信号输出 2.1V的时 ...

要外接二极管?可是我的电路板不能外接哦,还有其他办法吗?
作者: wulin    时间: 2022-4-24 11:55
goldbirderman 发表于 2022-4-24 10:13
要外接二极管?可是我的电路板不能外接哦,还有其他办法吗?

看来楼主是希望在现有的硬件电路条件下不作任何更改,完全依靠修改软件来解决所描述的问题。但这几乎不可能。在楼主没有提供详细硬件资料和具体用途的情况,大家只能泛泛而谈,楼主也听得云里雾里。对大家的建议也不能正确理解。也许只是一个简单的对输入信号处理的问题,被楼主描述复杂化了。
作者: bityl    时间: 2022-4-24 13:53
增大上拉电阻的阻值,能不能把低电平降到0.8以下?
作者: jfet    时间: 2022-4-24 13:58
脚位设置为输入状态,根据输入源的内阻和驱动能力,加一个合适的下拉电阻。
作者: gongnn    时间: 2022-4-24 15:23
P1M1=0xff;
P1M0=0x00;  //这两句就是设置端口为高阻
Flag=P1^7; //读取端口引脚状态
//把上面的端口改成你自己实际电路图端口即可,Flag的状态就是你端口状态。
作者: goldbirderman    时间: 2022-4-24 21:04
gongnn 发表于 2022-4-24 15:23
P1M1=0xff;
P1M0=0x00;  //这两句就是设置端口为高阻
Flag=P1^7; //读取端口引脚状态

高阻输入可以判断高低电平吗?
作者: goldbirderman    时间: 2022-4-24 21:51
gongnn 发表于 2022-4-24 15:23
P1M1=0xff;
P1M0=0x00;  //这两句就是设置端口为高阻
Flag=P1^7; //读取端口引脚状态

Flag是不是变量类型改为BIT?
作者: 188610329    时间: 2022-4-24 22:53
goldbirderman 发表于 2022-4-24 10:11
你所说二极管是内置在芯片里面吗?你又说开漏模式,那应该是开漏模式还是高阻模式呢?

先回答拿这个模式的问题,开漏模式且内部io口置1 = 高阻模式。
由于,stc12是有斯密特发生器器的,即高低电平判断不是一个值,而是一个区间,具体stc12斯密特发生器抑制的区间多大我记不清了,假定是0.8v-1.6v这个区间的话,那么你的信号2.1v~3.2v,通过两个二极管降压,-1.4v 得到0.7~1.8,那么io口高阻的话,是可以直接判断出0/1的,但是现实可能没有那么理想,制造误差也好,stc12的斯密特发生器区间比较大也好,可能在0.7v~2v之间。那么这个时候只能用比较变通的方法,帮他一把,就是先用一个二极管,把你的信号从2.1v~3.2v,降到1.4v~2.5v,此时你的信号的高电平在io口的高电平判断区间,而信号低电平在模糊区间,这时候你开漏模式先把电平拉低,再置1,再去读io,如果读到1,表示外部信号高电平,读到0表示信号是低电平。
作者: goldbirderman    时间: 2022-4-25 11:06
188610329 发表于 2022-4-24 22:53
先回答拿这个模式的问题,开漏模式且内部io口置1 = 高阻模式。
由于,stc12是有斯密特发生器器的,即高 ...

可是外部不能添加元件
作者: 188610329    时间: 2022-4-25 15:02
goldbirderman 发表于 2022-4-25 11:06
可是外部不能添加元件

我是看不懂了,你的2.1v-3.2v的信号,不是外部原件么?不是外部添加的原件?这叫外部不能添加原件?
你不要跟我说板子本来就是这样设计的,一个没有ADC的单片机,能设计成直接给2.1v-3.2v信号,这设计是没法看的……
作者: goldbirderman    时间: 2022-4-25 16:11
188610329 发表于 2022-4-25 15:02
我是看不懂了,你的2.1v-3.2v的信号,不是外部原件么?不是外部添加的原件?这叫外部不能添加原件?
你不 ...

人家要求这样,没办法
作者: 188610329    时间: 2022-4-25 17:01
goldbirderman 发表于 2022-4-25 16:11
人家要求这样,没办法

没有ADC功能,你单片机识别不了3.2v-和2.1v的区别,这是硬件上不支持,和你单片机输出不了12v一个道理,不是软件能实现的,懂了么?如果要求是不能添加外部模块也就罢了,连电阻、二极管都不能加,那简单来讲,就是没打算让你搞成,么打算给你这个case。
作者: Y_G_G    时间: 2022-4-25 17:48
没有ADC功能,外部电路也不能改
输入是2.1-3.2V信号
随便你设置什么端口模式都没有用,永远不能区分高低电平,你折腾多少天都没有用
作者: goldbirderman    时间: 2022-4-25 20:24
gongnn 发表于 2022-4-24 15:23
P1M1=0xff;
P1M0=0x00;  //这两句就是设置端口为高阻
Flag=P1^7; //读取端口引脚状态

读取引脚状态有例子吗?高手
作者: goldbirderman    时间: 2022-4-26 14:21
gongnn 发表于 2022-4-24 15:23
P1M1=0xff;
P1M0=0x00;  //这两句就是设置端口为高阻
Flag=P1^7; //读取端口引脚状态

还是不行哦,兄弟
作者: lkc8210    时间: 2022-4-26 15:37
goldbirderman 发表于 2022-4-25 16:11
人家要求这样,没办法

会不会是误会?
低电平2.1v,高电平3.2v是怎么来的?
作者: goldbirderman    时间: 2022-4-26 15:55
lkc8210 发表于 2022-4-26 15:37
会不会是误会?
低电平2.1v,高电平3.2v是怎么来的?

大概都已经解决了
作者: goldbirderman    时间: 2022-4-26 15:55
188610329 发表于 2022-4-25 17:01
没有ADC功能,你单片机识别不了3.2v-和2.1v的区别,这是硬件上不支持,和你单片机输出不了12v一个道理, ...

还是感谢你们帮我想办法




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1