找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3122|回复: 17
打印 上一主题 下一主题
收起左侧

STC15单片机的IO口疑问?

[复制链接]
跳转到指定楼层
楼主
看STC15单片机的规格书IO口相关介绍,STC15的P1口都可以配置成ADC口,也可以配置成普通IO口,配置ADC用P1ASF寄存器来配置;如图1;
配置成普通IO口时有4种工作模式,用P1M1和P1M0寄存器来配置,如图2;

想问下:
①  作为普通IO口时,如果我想要检测外部输入的高电平,我应该配置成哪种模式?是高阻输入模式吗?还是说必须电路上加反相器才能实现?

② 如果我要配置P1口的P1.1/P1.2/P1.3为ADC口,应该有如下一段代码:


#define P11ASF 0x02       //ADC通道P1.1口
#define P12ASF 0x04       //ADC通道P1.2口

#define P13ASF 0x08       //ADC通道P1.2口
P1ASF = P1ASF|P11ASF|P12ASF|P13ASF;   //设置P1.1、P1.2、P1.3口为AD转换口

此时我要将P1口的P1.5/P1.6/P1.7配置成高阻输入,应该有如下一段代码:
P1M1 = 0xE0;
P1M0 = 0x00;


请问此时P1.1/P1.2/P1.3还是ADC口吗?

STC15的IO-1.png (60.5 KB, 下载次数: 35)

STC15的IO-1.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:716656 发表于 2021-7-6 15:44 | 只看该作者
问题一:设置成高阻模式,可以检测外部电平变化,程序里写成以while循环检测。你说的反相器是对接外部中断引脚时,当变化成高电平,经反相器是变低,触发外部中断。 问题二:我没接触过,应该是查一下手册,引脚当adc用时要设置成什么模式,把P1M1 P1M0的低5位设置对应就好
回复

使用道具 举报

板凳
ID:401564 发表于 2021-7-6 15:47 | 只看该作者
看图,其它的问题数据手册里有的


回复

使用道具 举报

地板
ID:272119 发表于 2021-7-6 16:17 | 只看该作者
普通IO不用设置,默认头文件已经设置好,直接sbit相关IO的名字使用即可。关于第二点我也没有试过。
回复

使用道具 举报

5#
ID:847776 发表于 2021-7-7 09:05 | 只看该作者
Y_G_G 发表于 2021-7-6 15:47
看图,其它的问题数据手册里有的

关于准双向口这个模式,我是想检测外部的高电平输入,这个模式应该是不行的,内部是弱上拉,本身就是高电平,当外部再输入一个高电平时,它的状态是没有变化的。
回复

使用道具 举报

6#
ID:847776 发表于 2021-7-7 09:11 | 只看该作者
压着我头发啦 发表于 2021-7-6 15:44
问题一:设置成高阻模式,可以检测外部电平变化,程序里写成以while循环检测。你说的反相器是对接外部中断 ...

“对接外部中断引脚时,当变化成高电平,经反相器是变低,触发外部中断。”
------ 请教下,为何这里要加反相器呢?
回复

使用道具 举报

7#
ID:716656 发表于 2021-7-7 09:44 | 只看该作者
忆1709 发表于 2021-7-7 09:11
“对接外部中断引脚时,当变化成高电平,经反相器是变低,触发外部中断。”
------ 请教下,为何这里要 ...

51单片机的外部中断有两种触发方式可选:电平触发和边沿触发。选择电平触发时,单片机在每个机器周期检查中断源口线,检测到低电平,即置位中断请求标志,向CPU请求中断。选择边沿触发方式时,单片机在上一个机器周期检测到中断源口线为高电平,下一个机器周期检测到低电平,即置位中断标志,请求中断。    普通51单片机检测高变低的过程(好像有能检测低到高的),你要检测低到高,需要用反相器或三极管,把状态反一下
回复

使用道具 举报

8#
ID:847776 发表于 2021-7-7 10:14 | 只看该作者
压着我头发啦 发表于 2021-7-7 09:44
51单片机的外部中断有两种触发方式可选:电平触发和边沿触发。选择电平触发时,单片机在每个机器周期检查 ...

明白了,谢谢。
回复

使用道具 举报

9#
ID:401564 发表于 2021-7-7 16:32 | 只看该作者
忆1709 发表于 2021-7-7 09:05
关于准双向口这个模式,我是想检测外部的高电平输入,这个模式应该是不行的,内部是弱上拉,本身就是高电 ...

它怎么就不行了呢?
外部是高平,它本身就是高平,读取到的就是高电平
外部是低电平,它读取到的就是低电平
这模式从8051出生到现在,一直都是这么用的
回复

使用道具 举报

10#
ID:689247 发表于 2021-7-7 16:50 | 只看该作者
Y_G_G 发表于 2021-7-6 15:47
看图,其它的问题数据手册里有的

通俗易懂,一下就明白了
回复

使用道具 举报

11#
ID:934353 发表于 2021-7-7 16:58 | 只看该作者
忆1709 发表于 2021-7-7 09:05
关于准双向口这个模式,我是想检测外部的高电平输入,这个模式应该是不行的,内部是弱上拉,本身就是高电 ...

可以的,普通io口本来就可以检测外部的电平变化的
回复

使用道具 举报

12#
ID:689247 发表于 2021-7-7 17:02 | 只看该作者
第一个问题:你检测的高电平是一直接入到电路里面的么?你的意思是不是,一旦不接入电路,检测仍然是高电平,就无法判断高电平石否接入电路?
如果一直接入电路,就像大佬说的,I/O不是低电平就是高电平。
如果不是:悬空状态也是高电平,就无法判断了
这样用adc检测高于多少判定高点就ok。
回复

使用道具 举报

13#
ID:847776 发表于 2021-7-9 09:48 | 只看该作者
Y_G_G 发表于 2021-7-7 16:32
它怎么就不行了呢?
外部是高平,它本身就是高平,读取到的就是高电平
外部是低电平,它读取到的就是低电平 ...

可能是我描述不准确,造成理解上的偏差;
我的意思是“要检测外部器件输入的一个高电平信号变化”,附一张图帮助理解,如图所示,这个“外部电路”常态时它既不拉高也不拉低,也就是高阻或浮空状态,当这个外部电路满足某个条件后,会输出高电平信号,此时我需要单片机能判断到这个高电平信号。所以配置成准双向口时当然是不行的。如果配置成了准双向口,针对这种情况,只能通过外部反相电路来实现。

8051 IO.png (14.08 KB, 下载次数: 23)

8051 IO.png
回复

使用道具 举报

14#
ID:401564 发表于 2021-7-9 15:47 | 只看该作者
忆1709 发表于 2021-7-9 09:48
可能是我描述不准确,造成理解上的偏差;
我的意思是“要检测外部器件输入的一个高电平信号变化”,附一 ...

我知道你的意思,你是想说:A端口我不输出,对外不输出低电平,也不输出高电平,我只管读取外部的电平状态而已
但你要知道,为什么会有上拉和下拉,还有强上拉和强下拉,逻辑电路的逻辑是严谨的,它一定是要有个确定的电平状态的,
如果单片机是高阻,那么外部B端口就会有上拉或者下拉
如果外部是不确定的,单片机A端口就会有上拉或者下拉
浮空是不可能浮空的,这辈子都不可能浮空的,单片机关断一个浮空的外部引脚,所读取到的数据是不稳定的
如果你想A端口只管读取B端口的电平,但又不对外输出高电平,那么,B端口就要有输出的能力,设定成传统端口的时候,下拉的任务由B端口来完成
回复

使用道具 举报

15#
ID:847776 发表于 2021-7-10 21:59 | 只看该作者
Y_G_G 发表于 2021-7-9 15:47
我知道你的意思,你是想说:A端口我不输出,对外不输出低电平,也不输出高电平,我只管读取外部的电平状态而已 ...

嗯,浮空状态确实会引入干扰造成单片机误判,因此单片机端口必须有一个稳定状态。
这个问题我重新理一下吧,分以下两种情况来看。
第一种情况: 单片机端口设定成弱上拉输出,即上文所述的准双向口模式:
这种情况下,单片机本身是有一个稳定状态的,即1;此时外部电路在未输出时,呈现高阻状态,如果说我选型的这个外部器件,在触发工作时,会输出高电平,这种情况下,单片机端口它是没有办法感知到这个变化的,因为两个1相与还是1,因此必须加反相器,经过反相器输出0将单片机端口拉低,如此方可。
第二种情况:  单片机设定成高阻模式:此时对于单片机来说,输入1就是1,输入0就是0;高电平低电平都没有问题。但如果我这个外部器件在未输出时也对外呈现高阻,那么两端高阻,抗干扰能力就非常弱了,干扰信号很容易给单片机造成误判。
“如果你想A端口只管读取B端口的电平,但又不对外输出高电平,那么,B端口就要有输出的能力,”
-----如果确实两端都呈现高阻状态了,B端口自然是没有输出能力的,这个比较常规的做法是在A端口外加一颗对地的大电阻(如100K),可以稳定端口A的状态。




回复

使用道具 举报

16#
ID:401564 发表于 2021-7-11 17:34 | 只看该作者
忆1709 发表于 2021-7-10 21:59
嗯,浮空状态确实会引入干扰造成单片机误判,因此单片机端口必须有一个稳定状态。
这个问题我重新理一下 ...

10uA弱上拉是一定可以检测外部电平变化的!
你分析那么多,还不如直接实际电路测试一下,8051自诞生到现在,几十年了一直都是这么用,你不知道你的分析原理是从哪里学的
一个IO有10uA的弱上拉,外部是1的时候,它输出1,它读取到的就是1,这不对吗?他得是0才对吗?
当外部电平是低电平的时候,因为10uA的上拉电流并不大,外部低电平会把这个端口的电平拉低,读取到的就是0,这有问题吗?
如果还有问题,把你想要做的电路画好上传,或者自己用实际电路写好程序运行就知道结果了
不要仿真,要实际电路
这本身就是一个很简单的问题
回复

使用道具 举报

17#
ID:446775 发表于 2021-7-11 22:43 | 只看该作者
应该是开漏模式吧
回复

使用道具 举报

18#
ID:847776 发表于 2021-7-12 11:16 | 只看该作者
Y_G_G 发表于 2021-7-11 17:34
10uA弱上拉是一定可以检测外部电平变化的!
你分析那么多,还不如直接实际电路测试一下,8051自诞生到现在, ...

"一个IO有10uA的弱上拉,外部是1的时候,它输出1,它读取到的就是1,这不对吗?他得是0才对吗?"
-------是的,我觉得外部必须得是0才行,既然这个问题一直纠结,我再画一张图说明下吧,我觉得应该很明了了,当然,继续讨论可以让我们把这个问题想得更透彻,没有坏处。
如图所示,有两张图:

图1是STC15单片机的弱上拉内部结构图,内部上拉有2路,极弱上拉和弱上拉,极弱上拉是一直打开的,弱上拉当外部输入非0时,也是一直打开的;
图2是我自己画的系统框图;单片机内部根据拉电流可计算弱上拉电阻约20K左右,我用一个开关加上拉10K模拟外部电路,系统电源3.3V,当K1未闭合时,端口B就是浮空的,由于单片机内部输入端呈现高阻,因此A点电压为3.3V,单片机读取到的电平为1;这是常态,只要外部输入非0,它就一直是1,软件随时查询读到的都是1;
此时,外部电路满足某个条件触发K1闭合,这个事件发生后,端口B通过10K上拉到3.3V,此时端口A输入3.3V电压,此时A点的电压是多少?当然还是3.3V;
此时对话情景是这样的:外部电路会对单片机说:“我已经输出3.3V电压给你了,请你动起来,把灯点亮”,单片机回怼: “对不起,我读到的端口电平没有发生任何变化,我要继续睡觉”。所以单片机此时是麻木的,你不给它个0,它就是不动。

对于以上分析,我不知道是否还有什么不同的想法?可以结合我给出的这两张图来展开讨论。这个问题没有必要仿真的,我觉得原理上要先走通。



图1.png (29.79 KB, 下载次数: 30)

图1.png

图2.png (29.65 KB, 下载次数: 32)

图2.png
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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