找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 2615|回复: 34
打印 上一主题 下一主题
收起左侧

请问STC12单片机有外部上拉电阻怎样设置输入?

  [复制链接]
跳转到指定楼层
楼主
ID:103131 发表于 2022-4-23 09:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    外面接了上拉电阻,里面怎样设置输入呢?输入信号,高电平为3.2V,低电平为2.1V,请问怎样判断啊?请问怎样解决,感激不尽,最好发个例子给我参考一下,谢谢!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

举报

沙发
ID:103131 发表于 2022-4-23 10:30 | 只看该作者
没人知道吗?各位兄弟
回复

举报

板凳
ID:404160 发表于 2022-4-23 15:14 | 只看该作者
数字电路2.1V,认为是高电平。如果非要识别2.1V,用ADC转换识别
回复

举报

地板
ID:103131 发表于 2022-4-23 15:18 | 只看该作者
飞云居士 发表于 2022-4-23 15:14
数字电路2.1V,认为是高电平。如果非要识别2.1V,用ADC转换识别

我的那块电路没有AD转换,也添加不了上去
回复

举报

5#
ID:103131 发表于 2022-4-23 15:18 | 只看该作者
飞云居士 发表于 2022-4-23 15:14
数字电路2.1V,认为是高电平。如果非要识别2.1V,用ADC转换识别

还有没有其他办法?
回复

举报

6#
ID:213173 发表于 2022-4-23 16:03 | 只看该作者

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

举报

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

可是我的电路里面根本没有比较器?
回复

举报

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

怎样读取端口状态的?
回复

举报

9#
ID:220661 发表于 2022-4-23 17:22 | 只看该作者
把端口设置为高阻状态再读取。
回复

举报

10#
ID:624769 发表于 2022-4-23 17:26 | 只看该作者
按你的需求, 如果不愿意更换单片机,比较简单的方法就是增加一个电压比较器,
实在不愿意用比较器,就通过IO模式高阻+下拉电阻+二极管的方式,人为的吧 3.2V~2.1V 电压变化分跨 识别出 0/1 的伐值两端来进行判断。但是需要试验调整,比较麻烦。
回复

举报

11#
ID:103131 发表于 2022-4-23 17:31 | 只看该作者
gongnn 发表于 2022-4-23 17:22
把端口设置为高阻状态再读取。

麻烦可以举个例子吗?
回复

举报

12#
ID:1020139 发表于 2022-4-23 17:32 | 只看该作者
不管端口模式怎样设置,IO口对高低电平的识别阈值不会改变。只能通过外部电路把高电平为3.2V,低电平为2.1V的信号变换为高电平>2.0V,低电平<0.8V。比较简单的方法是加一个翻转阈值为2.6V的比较器。
回复

举报

13#
ID:103131 发表于 2022-4-23 17:35 | 只看该作者
188610329 发表于 2022-4-23 17:26
按你的需求, 如果不愿意更换单片机,比较简单的方法就是增加一个电压比较器,
实在不愿意用比较器,就通过 ...

利用高阻模式,怎样吧两个电压值保存,然后读取状态比较大小?
回复

举报

14#
ID:301191 发表于 2022-4-23 21:34 | 只看该作者
顶一下
回复

举报

15#
ID:103131 发表于 2022-4-23 22:08 | 只看该作者
188610329 发表于 2022-4-23 17:26
按你的需求, 如果不愿意更换单片机,比较简单的方法就是增加一个电压比较器,
实在不愿意用比较器,就通过 ...

高阻输入我设置好了,请问下一步怎样做?
回复

举报

16#
ID:624769 发表于 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.
类似的这些方法有很多,但是,这些都需要你试验去调整的,你如果这方面知识,一片空白的话,建议你还是用比较器。
回复

举报

17#
ID:103131 发表于 2022-4-24 10:11 | 只看该作者
188610329 发表于 2022-4-24 00:35
不是比较大小, 是读取端口的 0/1,  通过 二级管 配合下拉电阻, 拉低信号的电平。让你信号输出 2.1V的时 ...

你所说二极管是内置在芯片里面吗?你又说开漏模式,那应该是开漏模式还是高阻模式呢?
回复

举报

18#
ID:103131 发表于 2022-4-24 10:13 | 只看该作者
188610329 发表于 2022-4-24 00:35
不是比较大小, 是读取端口的 0/1,  通过 二级管 配合下拉电阻, 拉低信号的电平。让你信号输出 2.1V的时 ...

要外接二极管?可是我的电路板不能外接哦,还有其他办法吗?
回复

举报

19#
ID:213173 发表于 2022-4-24 11:55 | 只看该作者
goldbirderman 发表于 2022-4-24 10:13
要外接二极管?可是我的电路板不能外接哦,还有其他办法吗?

看来楼主是希望在现有的硬件电路条件下不作任何更改,完全依靠修改软件来解决所描述的问题。但这几乎不可能。在楼主没有提供详细硬件资料和具体用途的情况,大家只能泛泛而谈,楼主也听得云里雾里。对大家的建议也不能正确理解。也许只是一个简单的对输入信号处理的问题,被楼主描述复杂化了。
回复

举报

20#
ID:1021203 发表于 2022-4-24 13:53 | 只看该作者
增大上拉电阻的阻值,能不能把低电平降到0.8以下?
回复

举报

21#
ID:1021225 发表于 2022-4-24 13:58 | 只看该作者
脚位设置为输入状态,根据输入源的内阻和驱动能力,加一个合适的下拉电阻。
回复

举报

22#
ID:220661 发表于 2022-4-24 15:23 | 只看该作者
P1M1=0xff;
P1M0=0x00;  //这两句就是设置端口为高阻
Flag=P1^7; //读取端口引脚状态
//把上面的端口改成你自己实际电路图端口即可,Flag的状态就是你端口状态。
回复

举报

23#
ID:103131 发表于 2022-4-24 21:04 | 只看该作者
gongnn 发表于 2022-4-24 15:23
P1M1=0xff;
P1M0=0x00;  //这两句就是设置端口为高阻
Flag=P1^7; //读取端口引脚状态

高阻输入可以判断高低电平吗?
回复

举报

24#
ID:103131 发表于 2022-4-24 21:51 | 只看该作者
gongnn 发表于 2022-4-24 15:23
P1M1=0xff;
P1M0=0x00;  //这两句就是设置端口为高阻
Flag=P1^7; //读取端口引脚状态

Flag是不是变量类型改为BIT?
回复

举报

25#
ID:624769 发表于 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表示信号是低电平。
回复

举报

26#
ID:103131 发表于 2022-4-25 11:06 | 只看该作者
188610329 发表于 2022-4-24 22:53
先回答拿这个模式的问题,开漏模式且内部io口置1 = 高阻模式。
由于,stc12是有斯密特发生器器的,即高 ...

可是外部不能添加元件
回复

举报

27#
ID:624769 发表于 2022-4-25 15:02 来自触屏版 | 只看该作者
goldbirderman 发表于 2022-4-25 11:06
可是外部不能添加元件

我是看不懂了,你的2.1v-3.2v的信号,不是外部原件么?不是外部添加的原件?这叫外部不能添加原件?
你不要跟我说板子本来就是这样设计的,一个没有ADC的单片机,能设计成直接给2.1v-3.2v信号,这设计是没法看的……
回复

举报

28#
ID:103131 发表于 2022-4-25 16:11 | 只看该作者
188610329 发表于 2022-4-25 15:02
我是看不懂了,你的2.1v-3.2v的信号,不是外部原件么?不是外部添加的原件?这叫外部不能添加原件?
你不 ...

人家要求这样,没办法
回复

举报

29#
ID:624769 发表于 2022-4-25 17:01 来自触屏版 | 只看该作者
goldbirderman 发表于 2022-4-25 16:11
人家要求这样,没办法

没有ADC功能,你单片机识别不了3.2v-和2.1v的区别,这是硬件上不支持,和你单片机输出不了12v一个道理,不是软件能实现的,懂了么?如果要求是不能添加外部模块也就罢了,连电阻、二极管都不能加,那简单来讲,就是没打算让你搞成,么打算给你这个case。
回复

举报

30#
ID:401564 发表于 2022-4-25 17:48 | 只看该作者
没有ADC功能,外部电路也不能改
输入是2.1-3.2V信号
随便你设置什么端口模式都没有用,永远不能区分高低电平,你折腾多少天都没有用
回复

举报

31#
ID:103131 发表于 2022-4-25 20:24 | 只看该作者
gongnn 发表于 2022-4-24 15:23
P1M1=0xff;
P1M0=0x00;  //这两句就是设置端口为高阻
Flag=P1^7; //读取端口引脚状态

读取引脚状态有例子吗?高手
回复

举报

32#
ID:103131 发表于 2022-4-26 14:21 | 只看该作者
gongnn 发表于 2022-4-24 15:23
P1M1=0xff;
P1M0=0x00;  //这两句就是设置端口为高阻
Flag=P1^7; //读取端口引脚状态

还是不行哦,兄弟
回复

举报

33#
ID:161164 发表于 2022-4-26 15:37 | 只看该作者
goldbirderman 发表于 2022-4-25 16:11
人家要求这样,没办法

会不会是误会?
低电平2.1v,高电平3.2v是怎么来的?
回复

举报

34#
ID:103131 发表于 2022-4-26 15:55 | 只看该作者
lkc8210 发表于 2022-4-26 15:37
会不会是误会?
低电平2.1v,高电平3.2v是怎么来的?

大概都已经解决了
回复

举报

35#
ID:103131 发表于 2022-4-26 15:55 | 只看该作者
188610329 发表于 2022-4-25 17:01
没有ADC功能,你单片机识别不了3.2v-和2.1v的区别,这是硬件上不支持,和你单片机输出不了12v一个道理, ...

还是感谢你们帮我想办法
回复

举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表