51单片机读取io口电平的代码

51单片机读取io口电平的代码,第1张

因为IO口作为输入时初始被置1, 这样就可以被外部器件拉低, 检测IO口的电平高低就可以知道有没有被外部器件拉低了 如果IO口置0的话, 那么外部器件无论是高电平还是低电平, IO口都是0, 就没法检测了

51单片机置1是输入状态
--也是输出状态,但是也可以输入。
是呈现高阻态的,就是I/O口内部结构的开关是断开的,不接地,
--P0 口,确实是这样的。
但还接一个上拉电阻吧!(都带上拉电阻)。
--P0 口没有上拉电阻。
--P1P2P3,都有上拉电阻。
--但是电阻很大,几百K,上拉作用有限。
那我接低电平的外围器件不就会输出电流了吗
--P1P2P3,都有输出电流。
--很小的电流。
但这是输入状态啊!不矛盾吗
--谁说是输入状态?他是瞎说。
--此时是输出1。
--但是引脚内部的上拉能力有限,因此,这时就可以当输入使用。
而且单片机的Io口的输出电压也是5V啊,就是通过这个原理输出的吗?
--5V?谁说输出5V了?
--引脚上拉能力有限,难以保证5V。
--你外部接地了,就是0V。这就是输入低电平。
那同理,我置0,是输出状态吧!
--置一、清零,都是输出。
--只是,置一后,可以输入。
内部开关闭合,接地,电平拉低,
上拉电阻也接地了,拉低了,上拉电阻不对外输出。
但怎么输出1呢?不是接地了吗?怎么输出1啊?
--《我置0》,你就是输出0,怎么会想到输出1
输出状态才能输出1和0吗?
--置一、清零,都是输出。
输入状态不能输出吗?
--输入状态,隐含在输出1的时候。

一直循环检测IO口状态,检测到起始信号边缘(如51单片机IO口一直是高电平,当检测到出现低电平即为启动信号),然后利用延时程序延时05ms,读取每个数据位的中间位置,判断是0还是1。
根据你的实际要求,第一次读取肯定是高电平,第二次读取为低电平,你需要再判断第三次和第四次,如果第三、四次均为低电平则为数据1,如果不是则为数据0。
个人感觉你这个通信协议有点问题,需要改进。原因如下:
比如顺氦矗份匪莓睹逢色抚姬序出现高、低、低电平时已经可以判断为1了,第四个电平是没有作用的。还有你这个协议由于数据1传输结尾时低电平,因此需要以高电平作为启动信号,而大部分单片机都是以低电平为启动信号的。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13180035.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-16
下一篇 2023-06-16

发表评论

登录后才能评论

评论列表(0条)

保存