单片机输入信号检测程序

2021-02-04 23:01:57 浏览
我们知道了输入信号的检测的前提条件,那就是需要在读取信号前,将输入信号的IO端口进行置1,然后就可以读取该端口上的状态,由于我们的单片机是带上拉电阻的,所以当我们把端口置1后,端口上如果什么也不接,就是处于悬空状态,那么我们读到的就是1,也就是说,单片机的常态是1,要想检测到外界的信号变化,就需要对端口置0,我们的外电路的输入信号应该是接地的才会有效。

我们先新建一个工程。

记得在添加新文件时,注意设置中的output选项卡里,把生成hex文件前方勾选,不然我们无法生成可执行文件。

接着就是程序的书写。

程序中,我定义了一个输入变量,一个输出变量,用于标志出输入和输出的端口及其含义,当然如果不定义也是可以的,但后期如果养成习惯,那么我们很容易混淆当前端口的实际用途,同时我们可以看出P1^0、P1^1之类的相似度很高,在书写时也容易写错,写错了程序也不会报错,它并不知道你到底需要用哪个端口,代码量小还好说,一句一句地查一遍,就可以找到问题,如果上百行,那估计一个代码一个代码的找,还不如再写一次来得快。所以为了防止这些狗血的剧情发生,我们对端口操作时根据习惯,对端口进行定义,设置一个自己一眼就能看到的名字。

在定义时,我还定义了一个bit型变量a,bit型变量就是位变量,它只有一位,两个状态,分别是0和1,在某些位置,这就足够了,可以节省空间。由于我们操作的也是一个位,所以就很方便。

主函数名不要忘记书写,读取前,对端口进行置1,然后我们使用了循环函数,这是因为,防止程序执行完之后出现错误,于是我们就让程序在循环体中循环,做到可控。

主要用户程序就是,把P1^0的状态赋值给中间变量a,然后a再把值赋给P1^1,这样我们就可以通过控制P1^0的状态,来控制P1^1.

在程序写完之后,先大致浏览一下,在必要的位置添加相应的注释,注释的添加很有必要,不养成习惯,到以后,代码量增加后,自己写完回来检查,自己都不会知道自己曾经写的这些是什么了。哈哈哈

这个程序写完后,我们运行编译一下,没有错误,没有警告,然后开始用仿真软件来先测试一下程序的功能是否正常。这个按键的输入检测,在仿真中使用时完全没有问题的。如果你的运行不正常,首先检查程序是否有问题,然后再检查仿真是否有问题。

添加hex文件,然后更改频率为11.0592M,当然此处晶振不影响我们本次的操作。

默认情况下所有io口输出的都是高电位,P0口灰色的比较特殊,先不用了解。开关和LED均采用接地连接,注意实际使用时LED需要添加限流电阻,开关由于端口内部存在上拉,所以不用电阻,保证信号的稳定即可。

我们的程序目标是当按下开关,系统检测到开关信号为0,那么LED就为0,表现出就是LED熄灭。然后我们改变下赋值的关系,让开关按下时,LED点亮。

只需将a的值在传递给LED时做一个取反处理即可。这样当按键为0,那么LED就是1,当按键为1,那么LED就是0,做到了按下灯亮的功能。然后,编译一下,每次修改都需要编译,不然hex文件还是修改之前的代码。

仿真中状态已经变化,没有按下时,LED处于熄灭状态。

按下后LED点亮,这就属于一种随动的状态指示,可以用与表达按键是否按下,在一些控制要求比较严格的场合,会对此类案件做出反馈指示灯,为什么硬件连线就可以完成的,还需要占用一个端口去反馈按键状态?这是因为,硬件连线也可以做到按下灯亮或灯灭,但是无法检测到这个信号是否真正的传入了芯片,被芯片所接收,如果使用反馈指示灯,那么只要灯有变化,就可以判断,开关信号必然进入了系统。可以通过此来了解代码是否正常运行。

有没有一种方法,可以按下开关后,LED点亮,松开不熄灭,再次按下,LED熄灭。当然是有的。

这就需要增加些语句,来阻断赋值语句的实时传递。

如果我们不这么做,就会出现io变化,变量就随之变化,也就无法进行判断语句内的操作了。

简单介绍下我们的代码运行步骤,首先,我们将P10的值传递给变量a,然后判断a是否等于0,也就是按键是否按下,如果不等于0,就会从新赋值,然后接着判断是否按下。若是按键按下,那么就把a的值传递给变量b,再判断b是否等于0,这个0就是按键按下的状态,此时的b就与当前按键的实时状态无关了,就是说你松开按键也不影响b的值,就达到了对按键状态的保存。然后接着判断i的值,这是用于计算按键按下次数的,如果按下了两次,那i就等于1,LED就会熄灭,同时对I进行清零,对b进行置1,用于下一次按键的按下,如果不置1,就会出现,一直进入这个判断语句,造成无法完成按键的响应。

文章标签: 单片机输入信号检测方法

本文链接地址: 单片机输入信号检测程序:http://www.mcucd.com/z1/88.html
联系信息:单片机疑难问题咨询:方先生 手机:15328075932 QQ:67828115

版权声明 本文部分文字和图片来源于互联网,如有侵犯您的权利请发送内容至:173323810@qq.com,我们将立即删除!